00001
00002
00003
00004
00005 #include "copyright.h"
00006 #include "config.h"
00007
00008 #include "mudconf.h"
00009 #include "db.h"
00010 #include "externs.h"
00011 #include "interface.h"
00012 #include "command.h"
00013 #include "htab.h"
00014 #include "alloc.h"
00015 #include "attrs.h"
00016 #include "flags.h"
00017 #include "powers.h"
00018 #ifdef SQL_SUPPORT
00019 #include "sqlchild.h"
00020 #endif
00021
00022
00023
00024 #define CACHE_DEPTH 10
00025 #define CACHE_WIDTH 20
00026
00027
00028
00029
00030
00031
00032 typedef struct confparm CONF;
00033 struct confparm {
00034 char *pname;
00035 int (*interpreter) ();
00036 int flags;
00037 int *loc;
00038 long extra;
00039 };
00040
00041
00042
00043
00044
00045
00046 CONFDATA mudconf;
00047 STATEDATA mudstate;
00048
00049 extern NAMETAB logdata_nametab[];
00050 extern NAMETAB logoptions_nametab[];
00051 extern NAMETAB access_nametab[];
00052 extern NAMETAB attraccess_nametab[];
00053 extern NAMETAB list_names[];
00054 #if 0
00055 extern NAMETAB sigactions_nametab[];
00056 #endif
00057
00058 extern CONF conftable[];
00059
00060
00061
00062
00063
00064
00065 void cf_init(void)
00066 {
00067 int i;
00068
00069 StringCopy(mudconf.indb, "tinymush.db");
00070 StringCopy(mudconf.outdb, "");
00071 StringCopy(mudconf.crashdb, "");
00072 StringCopy(mudconf.gdbm, "");
00073 StringCopy(mudconf.mail_db, "mail.db");
00074 StringCopy(mudconf.commac_db, "commac.db");
00075 StringCopy(mudconf.hcode_db, "hcode.db");
00076 #ifdef BT_ADVANCED_ECON
00077 StringCopy(mudconf.econ_db, "econ.db");
00078 #endif
00079 StringCopy(mudconf.mech_db, "mechs");
00080 StringCopy(mudconf.map_db, "maps");
00081 mudconf.compress_db = 0;
00082 StringCopy(mudconf.compress, "gzip");
00083 StringCopy(mudconf.uncompress, "gzip -d");
00084 StringCopy(mudconf.status_file, "shutdown.status");
00085 mudconf.allow_unloggedwho = 0;
00086 mudconf.btech_explode_reactor = 1;
00087 mudconf.btech_explode_time = 120;
00088 mudconf.btech_explode_ammo = 1;
00089 mudconf.btech_explode_stop = 0;
00090 mudconf.btech_stackpole = 1;
00091 mudconf.btech_phys_use_pskill = 1;
00092 mudconf.btech_erange = 1;
00093 mudconf.btech_dig_only_fs = 0;
00094 mudconf.btech_digbonus = 3;
00095 mudconf.btech_vcrit = 2;
00096 mudconf.btech_dynspeed = 1;
00097 mudconf.btech_ic = 1;
00098 mudconf.btech_parts = 1;
00099 mudconf.btech_slowdown = 2;
00100 mudconf.btech_fasaturn = 1;
00101 mudconf.btech_fasacrit = 0;
00102 mudconf.btech_fasaadvvtolcrit = 0;
00103 mudconf.btech_fasaadvvhlcrit = 0;
00104 mudconf.btech_fasaadvvhlfire = 0;
00105 mudconf.btech_divrotordamage = 0;
00106 mudconf.btech_moddamagewithrange = 0;
00107 mudconf.btech_moddamagewithwoods = 0;
00108 mudconf.btech_hotloadaddshalfbthmod = 0;
00109 mudconf.btech_nofusionvtolfuel = 0;
00110 mudconf.btech_tankfriendly = 0;
00111 mudconf.btech_newterrain = 0;
00112 mudconf.btech_skidcliff = 0;
00113 mudconf.btech_xp_bthmod = 0;
00114 mudconf.btech_xp_missilemod = 100;
00115 mudconf.btech_xp_ammomod = 100;
00116 mudconf.btech_defaultweapdam = 5;
00117 mudconf.btech_xp_modifier = 100;
00118 mudconf.btech_defaultweapbv = 120;
00119 mudconf.btech_xp_usePilotBVMod = 1;
00120 mudconf.btech_oldxpsystem = 1;
00121 mudconf.btech_xp_vrtmod = 0;
00122 mudconf.btech_limitedrepairs = 0;
00123 mudconf.btech_newcharge = 0;
00124 mudconf.btech_tl3_charge = 0;
00125 mudconf.btech_xploss = 666;
00126 mudconf.btech_critlevel = 100;
00127 mudconf.btech_tankshield = 0;
00128 mudconf.btech_newstagger = 0;
00129 mudconf.btech_extendedmovemod = 1;
00130 mudconf.btech_stacking = 2;
00131 mudconf.btech_stackdamage = 100;
00132 mudconf.btech_mw_losmap = 1;
00133 mudconf.btech_seismic_see_stopped = 0;
00134 mudconf.btech_exile_stun_code = 0;
00135 mudconf.btech_roll_on_backwalk = 1;
00136 mudconf.btech_usedmechstore = 0;
00137 mudconf.btech_ooc_comsys = 0;
00138 mudconf.btech_idf_requires_spotter = 1;
00139 mudconf.btech_vtol_ice_causes_fire = 1;
00140 mudconf.btech_glancing_blows = 1;
00141 mudconf.btech_inferno_penalty = 0;
00142 mudconf.btech_perunit_xpmod = 1;
00143 #ifdef BT_FREETECHTIME
00144 mudconf.btech_freetechtime = 0;
00145 #endif
00146 #ifdef BT_COMPLEXREPAIRS
00147 mudconf.btech_complexrepair = 1;
00148 #endif
00149 #ifdef HUDINFO_SUPPORT
00150 mudconf.hudinfo_show_mapinfo = 0;
00151 mudconf.hudinfo_enabled;
00152 #endif
00153 mudconf.namechange_days = 60;
00154 mudconf.allow_chanlurking = 0;
00155 mudconf.afterlife_dbref = 220;
00156 mudconf.afterscen_dbref = 801;
00157 mudconf.port = 6250;
00158 mudconf.conc_port = 6251;
00159 mudconf.init_size = 1000;
00160 mudconf.guest_char = -1;
00161 mudconf.guest_nuker = 1;
00162 mudconf.number_guests = 30;
00163 StringCopy(mudconf.guest_prefix, "Guest");
00164 StringCopy(mudconf.guest_file, "text/guest.txt");
00165 StringCopy(mudconf.conn_file, "text/connect.txt");
00166 StringCopy(mudconf.conn_dir, "");
00167 StringCopy(mudconf.creg_file, "text/register.txt");
00168 StringCopy(mudconf.regf_file, "text/create_reg.txt");
00169 StringCopy(mudconf.motd_file, "text/motd.txt");
00170 StringCopy(mudconf.wizmotd_file, "text/wizmotd.txt");
00171 StringCopy(mudconf.quit_file, "text/quit.txt");
00172 StringCopy(mudconf.down_file, "text/down.txt");
00173 StringCopy(mudconf.full_file, "text/full.txt");
00174 StringCopy(mudconf.site_file, "text/badsite.txt");
00175 StringCopy(mudconf.crea_file, "text/newuser.txt");
00176 StringCopy(mudconf.help_file, "text/help.txt");
00177 StringCopy(mudconf.help_indx, "text/help.indx");
00178 StringCopy(mudconf.news_file, "text/news.txt");
00179 StringCopy(mudconf.news_indx, "text/news.indx");
00180 StringCopy(mudconf.whelp_file, "text/wizhelp.txt");
00181 StringCopy(mudconf.whelp_indx, "text/wizhelp.indx");
00182 StringCopy(mudconf.plushelp_file, "text/plushelp.txt");
00183 StringCopy(mudconf.plushelp_indx, "text/plushelp.indx");
00184 StringCopy(mudconf.wiznews_file, "text/wiznews.txt");
00185 StringCopy(mudconf.wiznews_indx, "text/wiznews.indx");
00186 StringCopy(mudconf.motd_msg, "");
00187 StringCopy(mudconf.wizmotd_msg, "");
00188 StringCopy(mudconf.downmotd_msg, "");
00189 StringCopy(mudconf.fullmotd_msg, "");
00190 StringCopy(mudconf.dump_msg, "");
00191 StringCopy(mudconf.postdump_msg, "");
00192 StringCopy(mudconf.fixed_home_msg, "");
00193 StringCopy(mudconf.fixed_tel_msg, "");
00194 StringCopy(mudconf.public_channel, "Public");
00195 StringCopy(mudconf.guests_channel, "Guests");
00196 mudconf.indent_desc = 0;
00197 mudconf.name_spaces = 1;
00198 mudconf.fork_dump = 1;
00199 mudconf.fork_vfork = 0;
00200 mudconf.have_specials = 1;
00201 mudconf.have_comsys = 1;
00202 mudconf.have_macros = 1;
00203 mudconf.have_mailer = 1;
00204 mudconf.have_zones = 1;
00205 mudconf.paranoid_alloc = 0;
00206 mudconf.sig_action = SA_DFLT;
00207 mudconf.max_players = -1;
00208 mudconf.dump_interval = 3600;
00209 mudconf.check_interval = 600;
00210 mudconf.events_daily_hour = 7;
00211 mudconf.dump_offset = 0;
00212 mudconf.check_offset = 300;
00213 mudconf.idle_timeout = 3600;
00214 mudconf.conn_timeout = 120;
00215 mudconf.idle_interval = 60;
00216 mudconf.retry_limit = 3;
00217 mudconf.output_limit = 16384;
00218 mudconf.paycheck = 0;
00219 mudconf.paystart = 0;
00220 mudconf.paylimit = 10000;
00221 mudconf.start_quota = 20;
00222 mudconf.site_chars = 25;
00223 mudconf.payfind = 0;
00224 mudconf.digcost = 10;
00225 mudconf.linkcost = 1;
00226 mudconf.opencost = 1;
00227 mudconf.createmin = 10;
00228 mudconf.createmax = 505;
00229 mudconf.killmin = 10;
00230 mudconf.killmax = 100;
00231 mudconf.killguarantee = 100;
00232 mudconf.robotcost = 1000;
00233 mudconf.pagecost = 10;
00234 mudconf.searchcost = 100;
00235 mudconf.waitcost = 10;
00236 mudconf.machinecost = 64;
00237 mudconf.exit_quota = 1;
00238 mudconf.player_quota = 1;
00239 mudconf.room_quota = 1;
00240 mudconf.thing_quota = 1;
00241 mudconf.mail_expiration = 14;
00242 mudconf.use_http = 0;
00243 mudconf.queuemax = 100;
00244 mudconf.queue_chunk = 10;
00245 mudconf.active_q_chunk = 10;
00246 mudconf.sacfactor = 5;
00247 mudconf.sacadjust = -1;
00248 mudconf.use_hostname = 1;
00249 mudconf.quotas = 0;
00250 mudconf.ex_flags = 1;
00251 mudconf.robot_speak = 1;
00252 mudconf.clone_copy_cost = 0;
00253 mudconf.pub_flags = 1;
00254 mudconf.quiet_look = 1;
00255 mudconf.exam_public = 1;
00256 mudconf.read_rem_desc = 0;
00257 mudconf.read_rem_name = 0;
00258 mudconf.sweep_dark = 0;
00259 mudconf.player_listen = 0;
00260 mudconf.quiet_whisper = 1;
00261 mudconf.dark_sleepers = 1;
00262 mudconf.see_own_dark = 1;
00263 mudconf.idle_wiz_dark = 0;
00264 mudconf.pemit_players = 0;
00265 mudconf.pemit_any = 0;
00266 mudconf.match_mine = 0;
00267 mudconf.match_mine_pl = 0;
00268 mudconf.switch_df_all = 1;
00269 mudconf.fascist_tport = 0;
00270 mudconf.terse_look = 1;
00271 mudconf.terse_contents = 1;
00272 mudconf.terse_exits = 1;
00273 mudconf.terse_movemsg = 1;
00274 mudconf.trace_topdown = 1;
00275 mudconf.trace_limit = 200;
00276 mudconf.safe_unowned = 0;
00277
00278
00279
00280 mudconf.space_compress = 1;
00281 mudconf.start_room = 0;
00282 mudconf.start_home = -1;
00283 mudconf.default_home = -1;
00284 mudconf.master_room = -1;
00285 mudconf.player_flags.word1 = 0;
00286 mudconf.player_flags.word2 = 0;
00287 mudconf.room_flags.word1 = 0;
00288 mudconf.room_flags.word2 = 0;
00289 mudconf.exit_flags.word1 = 0;
00290 mudconf.exit_flags.word2 = 0;
00291 mudconf.thing_flags.word1 = 0;
00292 mudconf.thing_flags.word2 = 0;
00293 mudconf.robot_flags.word1 = ROBOT;
00294 mudconf.robot_flags.word2 = 0;
00295 mudconf.vattr_flags = AF_ODARK;
00296 StringCopy(mudconf.mud_name, "TinyMUX");
00297 StringCopy(mudconf.one_coin, "penny");
00298 StringCopy(mudconf.many_coins, "pennies");
00299 mudconf.timeslice = 100;
00300 mudconf.cmd_quota_max = 100;
00301 mudconf.cmd_quota_incr = 5;
00302 mudconf.control_flags = 0xffffffff;
00303
00304
00305 mudconf.log_options =
00306 LOG_ALWAYS | LOG_BUGS | LOG_SECURITY | LOG_NET | LOG_LOGIN |
00307 LOG_DBSAVES | LOG_CONFIGMODS | LOG_SHOUTS | LOG_STARTUP |
00308 LOG_WIZARD | LOG_PROBLEMS | LOG_PCREATES;
00309 mudconf.log_info = LOGOPT_TIMESTAMP | LOGOPT_LOC;
00310 mudconf.markdata[0] = 0x01;
00311 mudconf.markdata[1] = 0x02;
00312 mudconf.markdata[2] = 0x04;
00313 mudconf.markdata[3] = 0x08;
00314 mudconf.markdata[4] = 0x10;
00315 mudconf.markdata[5] = 0x20;
00316 mudconf.markdata[6] = 0x40;
00317 mudconf.markdata[7] = 0x80;
00318 mudconf.func_nest_lim = 50;
00319 mudconf.func_invk_lim = 2500;
00320 mudconf.ntfy_nest_lim = 20;
00321 mudconf.lock_nest_lim = 20;
00322 mudconf.parent_nest_lim = 10;
00323 mudconf.zone_nest_lim = 20;
00324 mudconf.stack_limit = 50;
00325 mudconf.cache_trim = 0;
00326 mudconf.cache_depth = CACHE_DEPTH;
00327 mudconf.cache_width = CACHE_WIDTH;
00328 mudconf.cache_names = 1;
00329
00330 mudstate.events_flag = 0;
00331 mudstate.events_lasthour = -1;
00332 mudstate.initializing = 0;
00333 mudstate.panicking = 0;
00334 mudstate.dumping = 0;
00335 mudstate.logging = 0;
00336 mudstate.epoch = 0;
00337 mudstate.generation = 0;
00338 mudstate.curr_player = NOTHING;
00339 mudstate.curr_enactor = NOTHING;
00340 mudstate.shutdown_flag = 0;
00341 mudstate.attr_next = A_USER_START;
00342 mudstate.debug_cmd = (char *) "< init >";
00343 StringCopy(mudstate.doing_hdr, "Doing");
00344 mudstate.access_list = NULL;
00345 mudstate.suspect_list = NULL;
00346 mudstate.qhead = NULL;
00347 mudstate.qtail = NULL;
00348 mudstate.qwait = NULL;
00349 mudstate.qsemfirst = NULL;
00350 mudstate.qsemlast = NULL;
00351 mudstate.badname_head = NULL;
00352 mudstate.mstat_ixrss[0] = 0;
00353 mudstate.mstat_ixrss[1] = 0;
00354 mudstate.mstat_idrss[0] = 0;
00355 mudstate.mstat_idrss[1] = 0;
00356 mudstate.mstat_isrss[0] = 0;
00357 mudstate.mstat_isrss[1] = 0;
00358 mudstate.mstat_secs[0] = 0;
00359 mudstate.mstat_secs[1] = 0;
00360 mudstate.mstat_curr = 0;
00361 mudstate.iter_alist.data = NULL;
00362 mudstate.iter_alist.len = 0;
00363 mudstate.iter_alist.next = NULL;
00364 mudstate.mod_alist = NULL;
00365 mudstate.mod_size = 0;
00366 mudstate.mod_al_id = NOTHING;
00367 mudstate.olist = NULL;
00368 mudstate.min_size = 0;
00369 mudstate.db_top = 0;
00370 mudstate.db_size = 0;
00371 mudstate.mail_db_top = 0;
00372 mudstate.mail_db_size = 0;
00373 mudstate.mail_freelist = 0;
00374 mudstate.freelist = NOTHING;
00375 mudstate.markbits = NULL;
00376 mudstate.func_nest_lev = 0;
00377 mudstate.func_invk_ctr = 0;
00378 mudstate.ntfy_nest_lev = 0;
00379 mudstate.lock_nest_lev = 0;
00380 mudstate.zone_nest_num = 0;
00381 mudstate.inpipe = 0;
00382 mudstate.pout = NULL;
00383 mudstate.poutnew = NULL;
00384 mudstate.poutbufc = NULL;
00385 mudstate.poutobj = -1;
00386 for(i = 0; i < MAX_GLOBAL_REGS; i++)
00387 mudstate.global_regs[i] = NULL;
00388 #ifdef SQL_SUPPORT
00389 memset(mudconf.sqlDB_type_A, '\0', 128);
00390 memset(mudconf.sqlDB_hostname_A, '\0', 128);
00391 memset(mudconf.sqlDB_username_A, '\0', 128);
00392 memset(mudconf.sqlDB_password_A, '\0', 128);
00393 memset(mudconf.sqlDB_dbname_A, '\0', 128);
00394 memset(mudconf.sqlDB_type_B, '\0', 128);
00395 memset(mudconf.sqlDB_hostname_B, '\0', 128);
00396 memset(mudconf.sqlDB_username_B, '\0', 128);
00397 memset(mudconf.sqlDB_password_B, '\0', 128);
00398 memset(mudconf.sqlDB_dbname_B, '\0', 128);
00399 memset(mudconf.sqlDB_type_C, '\0', 128);
00400 memset(mudconf.sqlDB_hostname_C, '\0', 128);
00401 memset(mudconf.sqlDB_username_C, '\0', 128);
00402 memset(mudconf.sqlDB_password_C, '\0', 128);
00403 memset(mudconf.sqlDB_dbname_C, '\0', 128);
00404 memset(mudconf.sqlDB_type_D, '\0', 128);
00405 memset(mudconf.sqlDB_hostname_D, '\0', 128);
00406 memset(mudconf.sqlDB_username_D, '\0', 128);
00407 memset(mudconf.sqlDB_password_D, '\0', 128);
00408 memset(mudconf.sqlDB_dbname_D, '\0', 128);
00409 memset(mudconf.sqlDB_type_E, '\0', 128);
00410 memset(mudconf.sqlDB_hostname_E, '\0', 128);
00411 memset(mudconf.sqlDB_username_E, '\0', 128);
00412 memset(mudconf.sqlDB_password_E, '\0', 128);
00413 memset(mudconf.sqlDB_dbname_E, '\0', 128);
00414 mudconf.sqlDB_init_A = 0;
00415 mudconf.sqlDB_init_B = 0;
00416 mudconf.sqlDB_init_C = 0;
00417 mudconf.sqlDB_init_D = 0;
00418 mudconf.sqlDB_init_E = 0;
00419 mudconf.sqlDB_max_queries = 4;
00420 memset(mudconf.sqlDB_mysql_socket, '\0', 128);
00421 #endif
00422 mudconf.exit_parent = 0;
00423 mudconf.room_parent = 0;
00424 }
00425
00426
00427
00428
00429
00430 void cf_log_notfound(dbref player, char *cmd, const char *thingname,
00431 char *thing)
00432 {
00433 char *buff;
00434
00435 if(mudstate.initializing) {
00436 log_error(LOG_STARTUP, "CNF", "NFND", "%s: %s %s not found.", cmd,
00437 thingname, thing);
00438 } else {
00439 buff = alloc_lbuf("cf_log_notfound");
00440 sprintf(buff, "%s %s not found", thingname, thing);
00441 notify(player, buff);
00442 free_lbuf(buff);
00443 }
00444 }
00445
00446
00447
00448
00449
00450
00451 void cf_log_syntax(dbref player, char *cmd, const char *template, char *arg)
00452 {
00453 if(mudstate.initializing) {
00454 log_error(LOG_STARTUP, "CNF", "SYNTX", "%s: %s %s", cmd, template, arg);
00455 } else {
00456 notify_printf(player, template, arg);
00457 }
00458 }
00459
00460
00461
00462
00463
00464
00465 int cf_status_from_succfail(dbref player, char *cmd, int success, int failure)
00466 {
00467 char *buff;
00468
00469
00470
00471
00472
00473
00474 if(success > 0)
00475 return ((failure == 0) ? 0 : 1);
00476
00477
00478
00479
00480
00481
00482
00483 if(failure == 0) {
00484 if(mudstate.initializing) {
00485 log_error(LOG_STARTUP, "CNF", "NDATA", "%s: Nothing to set", cmd);
00486 } else {
00487 notify(player, "Nothing to set");
00488 }
00489 }
00490 return -1;
00491 }
00492
00493
00494
00495
00496
00497
00498 int cf_int(int *vp, char *str, long extra, dbref player, char *cmd)
00499 {
00500
00501
00502
00503
00504 sscanf(str, "%d", vp);
00505 return 0;
00506 }
00507
00508
00509
00510
00511
00512
00513 NAMETAB bool_names[] = {
00514 {(char *)"true", 1, 0, 1},
00515 {(char *)"false", 1, 0, 0},
00516 {(char *)"yes", 1, 0, 1},
00517 {(char *)"no", 1, 0, 0},
00518 {(char *)"1", 1, 0, 1},
00519 {(char *)"0", 1, 0, 0},
00520 {NULL, 0, 0, 0}};
00521
00522
00523
00524 int cf_bool(int *vp, char *str, long extra, dbref player, char *cmd)
00525 {
00526 *vp = (int) search_nametab(GOD, bool_names, str);
00527 if(*vp < 0)
00528 *vp = (long) 0;
00529 return 0;
00530 }
00531
00532
00533
00534
00535
00536
00537 int cf_option(int *vp, char *str, long extra, dbref player, char *cmd)
00538 {
00539 int i;
00540
00541 i = search_nametab(GOD, (NAMETAB *) extra, str);
00542 if(i < 0) {
00543 cf_log_notfound(player, cmd, "Value", str);
00544 return -1;
00545 }
00546 *vp = i;
00547 return 0;
00548 }
00549
00550
00551
00552
00553
00554
00555 int cf_string(int *vp, char *str, long extra, dbref player, char *cmd)
00556 {
00557 int retval;
00558 char *buff;
00559
00560
00561
00562
00563
00564 retval = 0;
00565 if(strlen(str) >= extra) {
00566 str[extra - 1] = '\0';
00567 if(mudstate.initializing) {
00568 log_error(LOG_STARTUP, "CNF", "NFND", "%s: String truncated", cmd);
00569 } else {
00570 notify(player, "String truncated");
00571 }
00572 retval = 1;
00573 }
00574 StringCopy((char *) vp, str);
00575 return retval;
00576 }
00577
00578
00579
00580
00581
00582
00583 int cf_alias(int *vp, char *str, long extra, dbref player, char *cmd)
00584 {
00585 char *alias, *orig, *p;
00586 int *cp = NULL;
00587
00588 alias = strtok(str, " \t=,");
00589 orig = strtok(NULL, " \t=,");
00590 if(orig) {
00591 for(p = orig; *p; p++)
00592 *p = ToLower(*p);
00593 cp = hashfind(orig, (HASHTAB *) vp);
00594 if(cp == NULL) {
00595 for(p = orig; *p; p++)
00596 *p = ToUpper(*p);
00597 cp = hashfind(orig, (HASHTAB *) vp);
00598 if(cp == NULL) {
00599 cf_log_notfound(player, cmd, "Entry", orig);
00600 return -1;
00601 }
00602 }
00603 }
00604
00605 if(cp == NULL) {
00606 return -1;
00607 }
00608
00609 hashadd(alias, cp, (HASHTAB *) vp);
00610 return 0;
00611 }
00612
00613
00614
00615
00616
00617
00618 int cf_flagalias(int *vp, char *str, long extra, dbref player, char *cmd)
00619 {
00620 char *alias, *orig;
00621 int *cp, success;
00622
00623 success = 0;
00624 alias = strtok(str, " \t=,");
00625 orig = strtok(NULL, " \t=,");
00626
00627 cp = hashfind(orig, &mudstate.flags_htab);
00628 if(cp != NULL) {
00629 hashadd(alias, cp, &mudstate.flags_htab);
00630 success++;
00631 }
00632 if(!success)
00633 cf_log_notfound(player, cmd, "Flag", orig);
00634 return ((success > 0) ? 0 : -1);
00635 }
00636
00637
00638
00639
00640
00641
00642 int cf_or_in_bits(int *vp, char *str, long extra, dbref player, char *cmd)
00643 {
00644 char *sp;
00645 int f, success, failure;
00646
00647
00648
00649
00650
00651 success = failure = 0;
00652 sp = strtok(str, " \t");
00653 while (sp != NULL) {
00654
00655
00656
00657
00658
00659 f = search_nametab(GOD, (NAMETAB *) extra, sp);
00660 if(f > 0) {
00661 *vp |= f;
00662 success++;
00663 } else {
00664 cf_log_notfound(player, cmd, "Entry", sp);
00665 failure++;
00666 }
00667
00668
00669
00670
00671
00672 sp = strtok(NULL, " \t");
00673 }
00674 return cf_status_from_succfail(player, cmd, success, failure);
00675 }
00676
00677
00678
00679
00680
00681 int cf_modify_bits(int *vp, char *str, long extra, dbref player, char *cmd)
00682 {
00683 char *sp;
00684 int f, negate, success, failure;
00685
00686
00687
00688
00689
00690 success = failure = 0;
00691 sp = strtok(str, " \t");
00692 while (sp != NULL) {
00693
00694
00695
00696
00697
00698 negate = 0;
00699 if(*sp == '!') {
00700 negate = 1;
00701 sp++;
00702 }
00703
00704
00705
00706
00707 f = search_nametab(GOD, (NAMETAB *) extra, sp);
00708 if(f > 0) {
00709 if(negate)
00710 *vp &= ~f;
00711 else
00712 *vp |= f;
00713 success++;
00714 } else {
00715 cf_log_notfound(player, cmd, "Entry", sp);
00716 failure++;
00717 }
00718
00719
00720
00721
00722
00723 sp = strtok(NULL, " \t");
00724 }
00725 return cf_status_from_succfail(player, cmd, success, failure);
00726 }
00727
00728
00729
00730
00731
00732
00733 int cf_set_bits(int *vp, char *str, long extra, dbref player, char *cmd)
00734 {
00735 char *sp;
00736 int f, success, failure;
00737
00738
00739
00740
00741
00742 success = failure = 0;
00743 *vp = 0;
00744 sp = strtok(str, " \t");
00745 while (sp != NULL) {
00746
00747
00748
00749
00750
00751 f = search_nametab(GOD, (NAMETAB *) extra, sp);
00752 if(f > 0) {
00753 *vp |= f;
00754 success++;
00755 } else {
00756 cf_log_notfound(player, cmd, "Entry", sp);
00757 failure++;
00758 }
00759
00760
00761
00762
00763
00764 sp = strtok(NULL, " \t");
00765 }
00766 return cf_status_from_succfail(player, cmd, success, failure);
00767 }
00768
00769
00770
00771
00772
00773
00774 int cf_set_flags(int *vp, char *str, long extra, dbref player, char *cmd)
00775 {
00776 char *sp;
00777 FLAGENT *fp;
00778 FLAGSET *fset;
00779
00780 int success, failure;
00781
00782
00783
00784
00785
00786 success = failure = 0;
00787 sp = strtok(str, " \t");
00788 fset = (FLAGSET *) vp;
00789
00790 while (sp != NULL) {
00791
00792
00793
00794
00795
00796 fp = (FLAGENT *) hashfind(sp, &mudstate.flags_htab);
00797 if(fp != NULL) {
00798 if(success == 0) {
00799 (*fset).word1 = 0;
00800 (*fset).word2 = 0;
00801 }
00802 if(fp->flagflag & FLAG_WORD3)
00803 (*fset).word3 |= fp->flagvalue;
00804 else if(fp->flagflag & FLAG_WORD2)
00805 (*fset).word2 |= fp->flagvalue;
00806 else
00807 (*fset).word1 |= fp->flagvalue;
00808 success++;
00809 } else {
00810 cf_log_notfound(player, cmd, "Entry", sp);
00811 failure++;
00812 }
00813
00814
00815
00816
00817
00818 sp = strtok(NULL, " \t");
00819 }
00820 if((success == 0) && (failure == 0)) {
00821 (*fset).word1 = 0;
00822 (*fset).word2 = 0;
00823 return 0;
00824 }
00825 if(success > 0)
00826 return ((failure == 0) ? 0 : 1);
00827 return -1;
00828 }
00829
00830
00831
00832
00833
00834
00835 int cf_badname(int *vp, char *str, long extra, dbref player, char *cmd)
00836 {
00837 if(extra)
00838 badname_remove(str);
00839 else
00840 badname_add(str);
00841 return 0;
00842 }
00843
00844
00845
00846
00847
00848
00849 int cf_site(long **vp, char *str, long extra, dbref player, char *cmd)
00850 {
00851 SITE *site, *last, *head;
00852 char *addr_txt, *mask_txt;
00853 struct in_addr addr_num, mask_num;
00854
00855 addr_txt = strtok(str, " \t=,");
00856 mask_txt = NULL;
00857 if(addr_txt)
00858 mask_txt = strtok(NULL, " \t=,");
00859 if(!addr_txt || !*addr_txt || !mask_txt || !*mask_txt) {
00860 cf_log_syntax(player, cmd, "Missing host address or mask.", (char *) "");
00861 return -1;
00862 }
00863
00864 addr_num.s_addr = inet_addr(addr_txt);
00865 mask_num.s_addr = inet_addr(mask_txt);
00866
00867 if(addr_num.s_addr == -1) {
00868 cf_log_syntax(player, cmd, "Bad host address: ", addr_txt);
00869 return -1;
00870 }
00871 head = (SITE *) * vp;
00872
00873
00874
00875
00876 site = (SITE *) malloc(sizeof(SITE));
00877
00878
00879
00880
00881
00882 site->address.s_addr = addr_num.s_addr;
00883 site->mask.s_addr = mask_num.s_addr;
00884 site->flag = extra;
00885 site->next = NULL;
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896 if(mudstate.initializing) {
00897 if(head == NULL) {
00898 *vp = (long *) site;
00899 } else {
00900 for(last = head; last->next; last = last->next);
00901 last->next = site;
00902 }
00903 } else {
00904 site->next = head;
00905 *vp = (long *) site;
00906 }
00907 return 0;
00908 }
00909
00910
00911
00912
00913
00914
00915 int cf_cf_access(int *vp, char *str, long extra, dbref player, char *cmd)
00916 {
00917 CONF *tp;
00918 char *ap;
00919
00920 for(ap = str; *ap && !isspace(*ap); ap++);
00921 if(*ap)
00922 *ap++ = '\0';
00923
00924 for(tp = conftable; tp->pname; tp++) {
00925 if(!strcmp(tp->pname, str)) {
00926 return (cf_modify_bits(&tp->flags, ap, extra, player, cmd));
00927 }
00928 }
00929 cf_log_notfound(player, cmd, "Config directive", str);
00930 return -1;
00931 }
00932
00933
00934
00935
00936
00937
00938 int cf_include(int *vp, char *str, long extra, dbref player, char *cmd)
00939 {
00940 FILE *fp;
00941 char *cp, *ap, *zp, *buf;
00942
00943 extern int cf_set(char *, char *, dbref);
00944
00945 if(!mudstate.initializing)
00946 return -1;
00947
00948 fp = fopen(str, "r");
00949 if(fp == NULL) {
00950 cf_log_notfound(player, cmd, "Config file", str);
00951 return -1;
00952 }
00953 buf = alloc_lbuf("cf_include");
00954 while (1) {
00955 if(!fgets(buf, LBUF_SIZE, fp))
00956 break;
00957 cp = buf;
00958 if(!cp || !*cp || *cp == '#' || *cp == '\n')
00959 continue;
00960
00961
00962
00963
00964
00965
00966
00967
00968 for(cp = buf; *cp && *cp != '\n'; cp++);
00969 *cp = '\0';
00970
00971 for(cp = buf; *cp && isspace(*cp); cp++);
00972 if(*cp == '\0')
00973 continue;
00974
00975 for(ap = cp; *ap && !isspace(*ap); ap++);
00976 if(*ap)
00977 *ap++ = '\0';
00978
00979 for(; *ap && isspace(*ap); ap++);
00980
00981 for(zp = ap; *zp && (*zp != '#'); zp++);
00982
00983 if(*zp)
00984 *zp = '\0';
00985
00986 for(zp = zp - 1; zp >= ap && isspace(*zp); zp--)
00987 *zp = '\0';
00988
00989 cf_set(cp, ap, player);
00990 }
00991 if(ferror(fp))
00992 fprintf(stderr, "Error reading config file: %s\n", strerror(errno));
00993 free_lbuf(buf);
00994 fclose(fp);
00995 return 0;
00996 }
00997
00998 extern int cf_access(long *, char *, long, dbref, char *);
00999 extern int cf_cmd_alias(long *, char *, long, dbref, char *);
01000 extern int cf_acmd_access(long *, char *, long, dbref, char *);
01001 extern int cf_attr_access(long *, char *, long, dbref, char *);
01002 extern int cf_func_access(long *, char *, long, dbref, char *);
01003
01004
01005
01006
01007
01008 CONF conftable[] = {
01009 {(char *) "access",
01010 cf_access, CA_GOD, NULL,
01011 (long) access_nametab},
01012 {(char *) "alias",
01013 cf_cmd_alias, CA_GOD, (int *) &mudstate.command_htab, 0},
01014 {(char *) "allow_unloggedwho",
01015 cf_int, CA_GOD, &mudconf.allow_unloggedwho, 0},
01016 {(char *) "attr_access",
01017 cf_attr_access, CA_GOD, NULL,
01018 (long) attraccess_nametab},
01019 {(char *) "attr_alias",
01020 cf_alias, CA_GOD, (int *) &mudstate.attr_name_htab, 0},
01021 {(char *) "attr_cmd_access",
01022 cf_acmd_access, CA_GOD, NULL,
01023 (long) access_nametab},
01024 {(char *) "bad_name",
01025 cf_badname, CA_GOD, NULL, 0},
01026 {(char *) "badsite_file",
01027 cf_string, CA_DISABLED, (void *) mudconf.site_file, 32},
01028 {(char *) "btech_explode_reactor",
01029 cf_int, CA_GOD, &mudconf.btech_explode_reactor, 0},
01030 {(char *) "btech_explode_time",
01031 cf_int, CA_GOD, &mudconf.btech_explode_time, 0},
01032 {(char *) "btech_explode_ammo",
01033 cf_int, CA_GOD, &mudconf.btech_explode_ammo, 0},
01034 {(char *) "btech_explode_stop",
01035 cf_int, CA_GOD, &mudconf.btech_explode_stop, 0},
01036 {(char *) "btech_failures",
01037 cf_int, CA_GOD, &mudconf.btech_parts, 0},
01038 {(char *) "btech_ic",
01039 cf_int, CA_GOD, &mudconf.btech_ic, 0},
01040 {(char *) "btech_afterlife_dbref",
01041 cf_int, CA_GOD, &mudconf.afterlife_dbref, 0},
01042 {(char *) "btech_afterscen_dbref",
01043 cf_int, CA_GOD, &mudconf.afterscen_dbref, 0},
01044 {(char *) "btech_vcrit",
01045 cf_int, CA_GOD, &mudconf.btech_vcrit, 0},
01046 {(char *) "btech_dynspeed",
01047 cf_int, CA_GOD, &mudconf.btech_dynspeed, 0},
01048 {(char *) "btech_slowdown",
01049 cf_int, CA_GOD, &mudconf.btech_slowdown, 0},
01050 {(char *) "btech_fasaturn",
01051 cf_int, CA_GOD, &mudconf.btech_fasaturn, 0},
01052 {(char *) "btech_fasacrit",
01053 cf_int, CA_GOD, &mudconf.btech_fasacrit, 0},
01054 {(char *) "btech_fasaadvvtolcrit",
01055 cf_int, CA_GOD, &mudconf.btech_fasaadvvtolcrit, 0},
01056 {(char *) "btech_fasaadvvhlcrit",
01057 cf_int, CA_GOD, &mudconf.btech_fasaadvvhlcrit, 0},
01058 {(char *) "btech_fasaadvvhlfire",
01059 cf_int, CA_GOD, &mudconf.btech_fasaadvvhlfire, 0},
01060 {(char *) "btech_divrotordamage",
01061 cf_int, CA_GOD, &mudconf.btech_divrotordamage, 0},
01062 {(char *) "btech_moddamagewithrange",
01063 cf_int, CA_GOD, &mudconf.btech_moddamagewithrange, 0},
01064 {(char *) "btech_moddamagewithwoods",
01065 cf_int, CA_GOD, &mudconf.btech_moddamagewithwoods, 0},
01066 {(char *) "btech_hotloadaddshalfbthmod",
01067 cf_int, CA_GOD, &mudconf.btech_hotloadaddshalfbthmod, 0},
01068 {(char *) "btech_nofusionvtolfuel",
01069 cf_int, CA_GOD, &mudconf.btech_nofusionvtolfuel, 0},
01070 {(char *) "btech_tankfriendly",
01071 cf_int, CA_GOD, &mudconf.btech_tankfriendly, 0},
01072 {(char *) "btech_newcharge",
01073 cf_int, CA_GOD, &mudconf.btech_newcharge, 0},
01074 {(char *) "btech_tl3_charge",
01075 cf_int, CA_GOD, &mudconf.btech_tl3_charge, 0},
01076 {(char *) "btech_newterrain",
01077 cf_int, CA_GOD, &mudconf.btech_newterrain, 0},
01078 {(char *) "btech_xploss",
01079 cf_int, CA_GOD, &mudconf.btech_xploss, 0},
01080 {(char *) "btech_critlevel",
01081 cf_int, CA_GOD, &mudconf.btech_critlevel, 0},
01082 {(char *) "btech_tankshield",
01083 cf_int, CA_GOD, &mudconf.btech_tankshield, 0},
01084 {(char *) "btech_newstagger",
01085 cf_int, CA_GOD, &mudconf.btech_newstagger, 0},
01086 {(char *) "namechange_days",
01087 cf_int, CA_GOD, &mudconf.namechange_days, 0},
01088 {(char *) "allow_chanlurking",
01089 cf_int, CA_GOD, &mudconf.allow_chanlurking, 0},
01090 {(char *) "btech_skidcliff",
01091 cf_int, CA_GOD, &mudconf.btech_skidcliff, 0},
01092 {(char *) "btech_xp_bthmod",
01093 cf_int, CA_GOD, &mudconf.btech_xp_bthmod, 0},
01094 {(char *) "btech_xp_missilemod",
01095 cf_int, CA_GOD, &mudconf.btech_xp_missilemod, 0},
01096 {(char *) "btech_xp_ammomod",
01097 cf_int, CA_GOD, &mudconf.btech_xp_ammomod, 0},
01098 {(char *) "btech_defaultweapdam",
01099 cf_int, CA_GOD, &mudconf.btech_defaultweapdam, 0},
01100 {(char *) "btech_xp_modifier",
01101 cf_int, CA_GOD, &mudconf.btech_xp_modifier, 0},
01102 {(char *) "btech_defaultweapbv",
01103 cf_int, CA_GOD, &mudconf.btech_defaultweapbv, 0},
01104 {(char *) "btech_xp_usePilotBVMod",
01105 cf_int, CA_GOD, &mudconf.btech_xp_usePilotBVMod, 0},
01106 {(char *) "btech_oldxpsystem",
01107 cf_int, CA_GOD, &mudconf.btech_oldxpsystem, 0},
01108 {(char *) "btech_xp_vrtmod",
01109 cf_int, CA_GOD, &mudconf.btech_xp_vrtmod, 0},
01110 {(char *) "btech_extendedmovemod",
01111 cf_int, CA_GOD, &mudconf.btech_extendedmovemod, 0},
01112 {(char *) "btech_stacking",
01113 cf_int, CA_GOD, &mudconf.btech_stacking, 0},
01114 {(char *) "btech_stackdamage",
01115 cf_int, CA_GOD, &mudconf.btech_stackdamage, 0},
01116 {(char *) "btech_mw_losmap",
01117 cf_int, CA_GOD, &mudconf.btech_mw_losmap, 0},
01118 {(char *) "btech_exile_stun_code",
01119 cf_int, CA_GOD, &mudconf.btech_exile_stun_code, 0},
01120 {(char *) "btech_roll_on_backwalk",
01121 cf_int, CA_GOD, &mudconf.btech_roll_on_backwalk, 0},
01122 {(char *) "btech_usedmechstore",
01123 cf_int, CA_GOD, &mudconf.btech_usedmechstore, 0},
01124 {(char *) "btech_ooc_comsys",
01125 cf_int, CA_GOD, &mudconf.btech_ooc_comsys, 0},
01126 {(char *) "btech_idf_requires_spotter",
01127 cf_int, CA_GOD, &mudconf.btech_idf_requires_spotter, 0},
01128 {(char *) "btech_perunit_xpmod",
01129 cf_int, CA_GOD, &mudconf.btech_perunit_xpmod, 0},
01130 {(char *) "btech_vtol_ice_causes_fire",
01131 cf_int, CA_GOD, &mudconf.btech_vtol_ice_causes_fire, 0},
01132 {(char *) "btech_glancing_blows", cf_int, CA_GOD, &mudconf.btech_glancing_blows, 0},
01133 {(char *) "btech_inferno_penalty",
01134 cf_int, CA_GOD, &mudconf.btech_inferno_penalty, 0},
01135 #ifdef BT_FREETECHTIME
01136 {(char *) "btech_freetechtime",
01137 cf_int, CA_GOD, &mudconf.btech_freetechtime, 0},
01138 #endif
01139 #ifdef BT_COMPLEXREPAIRS
01140 {(char *) "btech_complexrepair",
01141 cf_int, CA_GOD, &mudconf.btech_complexrepair, 0},
01142 #endif
01143 #ifdef HUDINFO_SUPPORT
01144 {(char *) "hudinfo_show_mapinfo",
01145 cf_int, CA_GOD, &mudconf.hudinfo_show_mapinfo, 0},
01146 {(char *) "hudinfo_enabled",
01147 cf_int, CA_GOD, &mudconf.hudinfo_enabled, 0},
01148 #endif
01149 {(char *) "btech_seismic_see_stopped",
01150 cf_int, CA_GOD, &mudconf.btech_seismic_see_stopped, 0},
01151 {(char *) "btech_limitedrepairs",
01152 cf_int, CA_GOD, &mudconf.btech_limitedrepairs, 0},
01153 {(char *) "btech_stackpole",
01154 cf_int, CA_GOD, &mudconf.btech_stackpole, 0},
01155 {(char *) "btech_phys_use_pskill",
01156 cf_int, CA_GOD, &mudconf.btech_phys_use_pskill, 0},
01157 {(char *) "btech_erange",
01158 cf_int, CA_GOD, &mudconf.btech_erange, 0},
01159 {(char *) "btech_dig_only_fs",
01160 cf_int, CA_GOD, &mudconf.btech_dig_only_fs, 0},
01161 {(char *) "btech_digbonus",
01162 cf_int, CA_GOD, &mudconf.btech_digbonus, 0},
01163 {(char *) "cache_depth",
01164 cf_int, CA_DISABLED, &mudconf.cache_depth, 0},
01165 {(char *) "cache_names",
01166 cf_bool, CA_DISABLED, &mudconf.cache_names, 0},
01167 {(char *) "cache_trim",
01168 cf_bool, CA_GOD, &mudconf.cache_trim, 0},
01169 {(char *) "cache_width",
01170 cf_int, CA_DISABLED, &mudconf.cache_width, 0},
01171 {(char *) "check_interval",
01172 cf_int, CA_GOD, &mudconf.check_interval, 0},
01173 {(char *) "check_offset",
01174 cf_int, CA_GOD, &mudconf.check_offset, 0},
01175 {(char *) "clone_copies_cost",
01176 cf_bool, CA_GOD, &mudconf.clone_copy_cost, 0},
01177 {(char *) "commac_database",
01178 cf_string, CA_GOD, (void *) mudconf.commac_db, 128},
01179 {(char *) "command_quota_increment",
01180 cf_int, CA_GOD, &mudconf.cmd_quota_incr, 0},
01181 {(char *) "command_quota_max",
01182 cf_int, CA_GOD, &mudconf.cmd_quota_max, 0},
01183 {(char *) "compress_program",
01184 cf_string, CA_DISABLED, (void *) mudconf.compress, 128},
01185 {(char *) "compression",
01186 cf_bool, CA_GOD, &mudconf.compress_db, 0},
01187 {(char *) "concentrator_port",
01188 cf_int, CA_DISABLED, &mudconf.conc_port, 0},
01189 {(char *) "config_access",
01190 cf_cf_access, CA_GOD, NULL,
01191 (long) access_nametab},
01192 {(char *) "conn_timeout",
01193 cf_int, CA_GOD, &mudconf.conn_timeout, 0},
01194 {(char *) "connect_dir",
01195 cf_string, CA_DISABLED, (void *) mudconf.conn_dir, 32},
01196 {(char *) "connect_file",
01197 cf_string, CA_DISABLED, (void *) mudconf.conn_file, 32},
01198 {(char *) "connect_reg_file",
01199 cf_string, CA_DISABLED, (void *) mudconf.creg_file, 32},
01200 {(char *) "crash_database",
01201 cf_string, CA_DISABLED, (void *) mudconf.crashdb, 128},
01202 {(char *) "create_max_cost",
01203 cf_int, CA_GOD, &mudconf.createmax, 0},
01204 {(char *) "create_min_cost",
01205 cf_int, CA_GOD, &mudconf.createmin, 0},
01206 {(char *) "dark_sleepers",
01207 cf_bool, CA_GOD, &mudconf.dark_sleepers, 0},
01208 {(char *) "default_home",
01209 cf_int, CA_GOD, &mudconf.default_home, 0},
01210 {(char *) "dig_cost",
01211 cf_int, CA_GOD, &mudconf.digcost, 0},
01212 {(char *) "down_file",
01213 cf_string, CA_DISABLED, (void *) mudconf.down_file, 32},
01214 {(char *) "down_motd_message",
01215 cf_string, CA_GOD, (void *) mudconf.downmotd_msg, 4096},
01216 {(char *) "dump_interval",
01217 cf_int, CA_GOD, &mudconf.dump_interval, 0},
01218 {(char *) "dump_message",
01219 cf_string, CA_GOD, (void *) mudconf.dump_msg, 128},
01220 {(char *) "postdump_message",
01221 cf_string, CA_GOD, (void *) mudconf.postdump_msg, 128},
01222 {(char *) "dump_offset",
01223 cf_int, CA_GOD, &mudconf.dump_offset, 0},
01224 {(char *) "earn_limit",
01225 cf_int, CA_GOD, &mudconf.paylimit, 0},
01226 {(char *) "examine_flags",
01227 cf_bool, CA_GOD, &mudconf.ex_flags, 0},
01228 {(char *) "examine_public_attrs",
01229 cf_bool, CA_GOD, &mudconf.exam_public, 0},
01230 {(char *) "exit_flags",
01231 cf_set_flags, CA_GOD, (int *) &mudconf.exit_flags, 0},
01232 {(char *) "exit_quota",
01233 cf_int, CA_GOD, &mudconf.exit_quota, 0},
01234 {(char *) "events_daily_hour",
01235 cf_int, CA_GOD, &mudconf.events_daily_hour, 0},
01236 {(char *) "fascist_teleport",
01237 cf_bool, CA_GOD, &mudconf.fascist_tport, 0},
01238 {(char *) "fixed_home_message",
01239 cf_string, CA_DISABLED, (void *) mudconf.fixed_home_msg, 128},
01240 {(char *) "fixed_tel_message",
01241 cf_string, CA_DISABLED, (void *) mudconf.fixed_tel_msg, 128},
01242 {(char *) "find_money_chance",
01243 cf_int, CA_GOD, &mudconf.payfind, 0},
01244 {(char *) "flag_alias",
01245 cf_flagalias, CA_GOD, NULL, 0},
01246 {(char *) "forbid_site",
01247 cf_site, CA_GOD, (int *) &mudstate.access_list,
01248 H_FORBIDDEN},
01249 {(char *) "fork_dump",
01250 cf_bool, CA_GOD, &mudconf.fork_dump, 0},
01251 {(char *) "fork_vfork",
01252 cf_bool, CA_GOD, &mudconf.fork_vfork, 0},
01253 {(char *) "full_file",
01254 cf_string, CA_DISABLED, (void *) mudconf.full_file, 32},
01255 {(char *) "full_motd_message",
01256 cf_string, CA_GOD, (void *) mudconf.fullmotd_msg, 4096},
01257 {(char *) "function_access",
01258 cf_func_access, CA_GOD, NULL,
01259 (long) access_nametab},
01260 {(char *) "function_alias",
01261 cf_alias, CA_GOD, (int *) &mudstate.func_htab, 0},
01262 {(char *) "function_invocation_limit",
01263 cf_int, CA_GOD, &mudconf.func_invk_lim, 0},
01264 {(char *) "function_recursion_limit",
01265 cf_int, CA_GOD, &mudconf.func_nest_lim, 0},
01266 {(char *) "gdbm_database",
01267 cf_string, CA_DISABLED, (void *) mudconf.gdbm, 128},
01268 {(char *) "good_name",
01269 cf_badname, CA_GOD, NULL, 1},
01270 {(char *) "guest_char_num",
01271 cf_int, CA_DISABLED, &mudconf.guest_char, 0},
01272 {(char *) "guest_nuker",
01273 cf_int, CA_GOD, &mudconf.guest_nuker, 0},
01274 {(char *) "guest_prefix",
01275 cf_string, CA_DISABLED, (void *) mudconf.guest_prefix, 32},
01276 {(char *) "number_guests",
01277 cf_int, CA_DISABLED, &mudconf.number_guests, 0},
01278 {(char *) "guest_file",
01279 cf_string, CA_DISABLED, (void *) mudconf.guest_file, 32},
01280 {(char *) "guests_channel",
01281 cf_string, CA_DISABLED, (void *) mudconf.guests_channel, 32},
01282 {(char *) "have_specials",
01283 cf_bool, CA_DISABLED, &mudconf.have_specials, 0},
01284 {(char *) "have_comsys",
01285 cf_bool, CA_DISABLED, &mudconf.have_comsys, 0},
01286 {(char *) "have_macros",
01287 cf_bool, CA_DISABLED, &mudconf.have_macros, 0},
01288 {(char *) "have_mailer",
01289 cf_bool, CA_DISABLED, &mudconf.have_mailer, 0},
01290 {(char *) "have_zones",
01291 cf_bool, CA_DISABLED, &mudconf.have_zones, 0},
01292 {(char *) "hcode_database",
01293 cf_string, CA_GOD, (void *) mudconf.hcode_db, 128},
01294 #ifdef BT_ADVANCED_ECON
01295 {(char *) "econ_database",
01296 cf_string, CA_GOD, (void *) mudconf.econ_db, 128},
01297 #endif
01298 {(char *) "help_file",
01299 cf_string, CA_DISABLED, (void *) mudconf.help_file, 32},
01300 {(char *) "help_index",
01301 cf_string, CA_DISABLED, (void *) mudconf.help_indx, 32},
01302 {(char *) "hostnames",
01303 cf_bool, CA_GOD, &mudconf.use_hostname, 0},
01304 {(char *) "use_http",
01305 cf_bool, CA_DISABLED, &mudconf.use_http, 0},
01306 {(char *) "idle_wiz_dark",
01307 cf_bool, CA_GOD, &mudconf.idle_wiz_dark, 0},
01308 {(char *) "idle_interval",
01309 cf_int, CA_GOD, &mudconf.idle_interval, 0},
01310 {(char *) "idle_timeout",
01311 cf_int, CA_GOD, &mudconf.idle_timeout, 0},
01312 {(char *) "include",
01313 cf_include, CA_DISABLED, NULL, 0},
01314 {(char *) "indent_desc",
01315 cf_bool, CA_GOD, &mudconf.indent_desc, 0},
01316 {(char *) "initial_size",
01317 cf_int, CA_DISABLED, &mudconf.init_size, 0},
01318 {(char *) "input_database",
01319 cf_string, CA_DISABLED, (void *) mudconf.indb, 128},
01320 {(char *) "kill_guarantee_cost",
01321 cf_int, CA_GOD, &mudconf.killguarantee, 0},
01322 {(char *) "kill_max_cost",
01323 cf_int, CA_GOD, &mudconf.killmax, 0},
01324 {(char *) "kill_min_cost",
01325 cf_int, CA_GOD, &mudconf.killmin, 0},
01326 {(char *) "link_cost",
01327 cf_int, CA_GOD, &mudconf.linkcost, 0},
01328 {(char *) "list_access",
01329 cf_ntab_access, CA_GOD, (int *) list_names,
01330 (long) access_nametab},
01331 {(char *) "lock_recursion_limit",
01332 cf_int, CA_WIZARD, &mudconf.lock_nest_lim, 0},
01333 {(char *) "log",
01334 cf_modify_bits, CA_GOD, &mudconf.log_options,
01335 (long) logoptions_nametab},
01336 {(char *) "log_options",
01337 cf_modify_bits, CA_GOD, &mudconf.log_info,
01338 (long) logdata_nametab},
01339 {(char *) "logout_cmd_access",
01340 cf_ntab_access, CA_GOD, (int *) logout_cmdtable,
01341 (long) access_nametab},
01342 {(char *) "logout_cmd_alias",
01343 cf_alias, CA_GOD, (int *) &mudstate.logout_cmd_htab, 0},
01344 {(char *) "look_obey_terse",
01345 cf_bool, CA_GOD, &mudconf.terse_look, 0},
01346 {(char *) "machine_command_cost",
01347 cf_int, CA_GOD, &mudconf.machinecost, 0},
01348 {(char *) "mail_database",
01349 cf_string, CA_GOD, (void *) mudconf.mail_db, 128},
01350 {(char *) "mail_expiration",
01351 cf_int, CA_GOD, &mudconf.mail_expiration, 0},
01352 {(char *) "map_database",
01353 cf_string, CA_GOD, (void *) mudconf.map_db, 128},
01354 {(char *) "master_room",
01355 cf_int, CA_GOD, &mudconf.master_room, 0},
01356 {(char *) "match_own_commands",
01357 cf_bool, CA_GOD, &mudconf.match_mine, 0},
01358 {(char *) "max_players",
01359 cf_int, CA_GOD, &mudconf.max_players, 0},
01360 {(char *) "mech_database",
01361 cf_string, CA_GOD, (void *) mudconf.mech_db, 128},
01362 {(char *) "money_name_plural",
01363 cf_string, CA_GOD, (void *) mudconf.many_coins, 32},
01364 {(char *) "money_name_singular",
01365 cf_string, CA_GOD, (void *) mudconf.one_coin, 32},
01366 {(char *) "motd_file",
01367 cf_string, CA_DISABLED, (void *) mudconf.motd_file, 32},
01368 {(char *) "motd_message",
01369 cf_string, CA_GOD, (void *) mudconf.motd_msg, 4096},
01370 {(char *) "mud_name",
01371 cf_string, CA_GOD, (void *) mudconf.mud_name, 32},
01372 {(char *) "news_file",
01373 cf_string, CA_DISABLED, (void *) mudconf.news_file, 32},
01374 {(char *) "news_index",
01375 cf_string, CA_DISABLED, (void *) mudconf.news_indx, 32},
01376 {(char *) "newuser_file",
01377 cf_string, CA_DISABLED, (void *) mudconf.crea_file, 32},
01378 {(char *) "notify_recursion_limit",
01379 cf_int, CA_GOD, &mudconf.ntfy_nest_lim, 0},
01380 {(char *) "open_cost",
01381 cf_int, CA_GOD, &mudconf.opencost, 0},
01382 {(char *) "output_database",
01383 cf_string, CA_DISABLED, (void *) mudconf.outdb, 128},
01384 {(char *) "output_limit",
01385 cf_int, CA_GOD, &mudconf.output_limit, 0},
01386 {(char *) "page_cost",
01387 cf_int, CA_GOD, &mudconf.pagecost, 0},
01388 {(char *) "paranoid_allocate",
01389 cf_bool, CA_GOD, &mudconf.paranoid_alloc, 0},
01390 {(char *) "parent_recursion_limit",
01391 cf_int, CA_GOD, &mudconf.parent_nest_lim, 0},
01392 {(char *) "paycheck",
01393 cf_int, CA_GOD, &mudconf.paycheck, 0},
01394 {(char *) "pemit_far_players",
01395 cf_bool, CA_GOD, &mudconf.pemit_players, 0},
01396 {(char *) "pemit_any_object",
01397 cf_bool, CA_GOD, &mudconf.pemit_any, 0},
01398 {(char *) "permit_site",
01399 cf_site, CA_GOD, (int *) &mudstate.access_list, 0},
01400 {(char *) "player_flags",
01401 cf_set_flags, CA_GOD, (int *) &mudconf.player_flags, 0},
01402 {(char *) "player_listen",
01403 cf_bool, CA_GOD, &mudconf.player_listen, 0},
01404 {(char *) "player_match_own_commands",
01405 cf_bool, CA_GOD, &mudconf.match_mine_pl, 0},
01406 {(char *) "player_name_spaces",
01407 cf_bool, CA_GOD, &mudconf.name_spaces, 0},
01408 {(char *) "player_queue_limit",
01409 cf_int, CA_GOD, &mudconf.queuemax, 0},
01410 {(char *) "player_quota",
01411 cf_int, CA_GOD, &mudconf.player_quota, 0},
01412 {(char *) "player_starting_home",
01413 cf_int, CA_GOD, &mudconf.start_home, 0},
01414 {(char *) "player_starting_room",
01415 cf_int, CA_GOD, &mudconf.start_room, 0},
01416 {(char *) "plushelp_file",
01417 cf_string, CA_DISABLED, (void *) mudconf.plushelp_file, 32},
01418 {(char *) "plushelp_index",
01419 cf_string, CA_DISABLED, (void *) mudconf.plushelp_indx, 32},
01420 {(char *) "public_channel",
01421 cf_string, CA_DISABLED, (void *) mudconf.public_channel, 32},
01422 {(char *) "wiznews_file",
01423 cf_string, CA_DISABLED, (void *) mudconf.wiznews_file, 32},
01424 {(char *) "wiznews_index",
01425 cf_string, CA_DISABLED, (void *) mudconf.wiznews_indx, 32},
01426 {(char *) "port",
01427 cf_int, CA_DISABLED, &mudconf.port, 0},
01428 {(char *) "public_flags",
01429 cf_bool, CA_GOD, &mudconf.pub_flags, 0},
01430 {(char *) "queue_active_chunk",
01431 cf_int, CA_GOD, &mudconf.active_q_chunk, 0},
01432 {(char *) "queue_idle_chunk",
01433 cf_int, CA_GOD, &mudconf.queue_chunk, 0},
01434 {(char *) "quiet_look",
01435 cf_bool, CA_GOD, &mudconf.quiet_look, 0},
01436 {(char *) "quiet_whisper",
01437 cf_bool, CA_GOD, &mudconf.quiet_whisper, 0},
01438 {(char *) "quit_file",
01439 cf_string, CA_DISABLED, (void *) mudconf.quit_file, 32},
01440 {(char *) "quotas",
01441 cf_bool, CA_GOD, &mudconf.quotas, 0},
01442 {(char *) "read_remote_desc",
01443 cf_bool, CA_GOD, &mudconf.read_rem_desc, 0},
01444 {(char *) "read_remote_name",
01445 cf_bool, CA_GOD, &mudconf.read_rem_name, 0},
01446 {(char *) "register_create_file",
01447 cf_string, CA_DISABLED, (void *) mudconf.regf_file, 32},
01448 {(char *) "register_site",
01449 cf_site, CA_GOD, (int *) &mudstate.access_list,
01450 H_REGISTRATION},
01451 {(char *) "retry_limit",
01452 cf_int, CA_GOD, &mudconf.retry_limit, 0},
01453 {(char *) "robot_cost",
01454 cf_int, CA_GOD, &mudconf.robotcost, 0},
01455 {(char *) "robot_flags",
01456 cf_set_flags, CA_GOD, (int *) &mudconf.robot_flags, 0},
01457 {(char *) "robot_speech",
01458 cf_bool, CA_GOD, &mudconf.robot_speak, 0},
01459 {(char *) "room_flags",
01460 cf_set_flags, CA_GOD, (int *) &mudconf.room_flags, 0},
01461 {(char *) "room_quota",
01462 cf_int, CA_GOD, &mudconf.room_quota, 0},
01463 {(char *) "sacrifice_adjust",
01464 cf_int, CA_GOD, &mudconf.sacadjust, 0},
01465 {(char *) "sacrifice_factor",
01466 cf_int, CA_GOD, &mudconf.sacfactor, 0},
01467 {(char *) "search_cost",
01468 cf_int, CA_GOD, &mudconf.searchcost, 0},
01469 {(char *) "see_owned_dark",
01470 cf_bool, CA_GOD, &mudconf.see_own_dark, 0},
01471 {(char *) "show_unfindable_who",
01472 cf_bool, CA_GOD, &mudconf.show_unfindable_who, 1},
01473 #if 0
01474 {(char *) "signal_action",
01475 cf_option, CA_DISABLED, &mudconf.sig_action,
01476 (long) sigactions_nametab},
01477 #endif
01478 {(char *) "site_chars",
01479 cf_int, CA_GOD, &mudconf.site_chars, 0},
01480 {(char *) "space_compress",
01481 cf_bool, CA_GOD, &mudconf.space_compress, 0},
01482 {(char *) "stack_limit",
01483 cf_int, CA_GOD, &mudconf.stack_limit, 0},
01484 {(char *) "starting_money",
01485 cf_int, CA_GOD, &mudconf.paystart, 0},
01486 {(char *) "starting_quota",
01487 cf_int, CA_GOD, &mudconf.start_quota, 0},
01488 {(char *) "status_file",
01489 cf_string, CA_DISABLED, (void *) mudconf.status_file, 128},
01490 {(char *) "suspect_site",
01491 cf_site, CA_GOD, (int *) &mudstate.suspect_list,
01492 H_SUSPECT},
01493 {(char *) "sweep_dark",
01494 cf_bool, CA_GOD, &mudconf.sweep_dark, 0},
01495 {(char *) "switch_default_all",
01496 cf_bool, CA_GOD, &mudconf.switch_df_all, 0},
01497 {(char *) "terse_shows_contents",
01498 cf_bool, CA_GOD, &mudconf.terse_contents, 0},
01499 {(char *) "terse_shows_exits",
01500 cf_bool, CA_GOD, &mudconf.terse_exits, 0},
01501 {(char *) "terse_shows_move_messages",
01502 cf_bool, CA_GOD, &mudconf.terse_movemsg, 0},
01503 {(char *) "thing_flags",
01504 cf_set_flags, CA_GOD, (int *) &mudconf.thing_flags, 0},
01505 {(char *) "thing_quota",
01506 cf_int, CA_GOD, &mudconf.thing_quota, 0},
01507 {(char *) "timeslice",
01508 cf_int, CA_GOD, &mudconf.timeslice, 0},
01509 {(char *) "trace_output_limit",
01510 cf_int, CA_GOD, &mudconf.trace_limit, 0},
01511 {(char *) "trace_topdown",
01512 cf_bool, CA_GOD, &mudconf.trace_topdown, 0},
01513 {(char *) "trust_site",
01514 cf_site, CA_GOD, (int *) &mudstate.suspect_list, 0},
01515 {(char *) "uncompress_program",
01516 cf_string, CA_DISABLED, (void *) mudconf.uncompress, 128},
01517 {(char *) "unowned_safe",
01518 cf_bool, CA_GOD, &mudconf.safe_unowned, 0},
01519 {(char *) "user_attr_access",
01520 cf_modify_bits, CA_GOD, &mudconf.vattr_flags,
01521 (long) attraccess_nametab},
01522 {(char *) "wait_cost",
01523 cf_int, CA_GOD, &mudconf.waitcost, 0},
01524 {(char *) "wizard_help_file",
01525 cf_string, CA_DISABLED, (void *) mudconf.whelp_file, 32},
01526 {(char *) "wizard_help_index",
01527 cf_string, CA_DISABLED, (void *) mudconf.whelp_indx, 32},
01528 {(char *) "wizard_motd_file",
01529 cf_string, CA_DISABLED, (void *) mudconf.wizmotd_file, 32},
01530 {(char *) "wizard_motd_message",
01531 cf_string, CA_GOD, (void *) mudconf.wizmotd_msg, 4096},
01532 {(char *) "zone_recursion_limit",
01533 cf_int, CA_GOD, &mudconf.zone_nest_lim, 0},
01534 #ifdef SQL_SUPPORT
01535 {(char *) "sqlDB_type_A",
01536 cf_string, CA_GOD, (void *) mudconf.sqlDB_type_A, 128},
01537 {(char *) "sqlDB_hostname_A",
01538 cf_string, CA_GOD, (void *) mudconf.sqlDB_hostname_A, 128},
01539 {(char *) "sqlDB_username_A",
01540 cf_string, CA_GOD, (void *) mudconf.sqlDB_username_A, 128},
01541 {(char *) "sqlDB_password_A",
01542 cf_string, CA_GOD, (void *) mudconf.sqlDB_password_A, 128},
01543 {(char *) "sqlDB_dbname_A",
01544 cf_string, CA_GOD, (void *) mudconf.sqlDB_dbname_A, 128},
01545 {(char *) "sqlDB_type_B",
01546 cf_string, CA_GOD, (void *) mudconf.sqlDB_type_B, 128},
01547 {(char *) "sqlDB_hostname_B",
01548 cf_string, CA_GOD, (void *) mudconf.sqlDB_hostname_B, 128},
01549 {(char *) "sqlDB_username_B",
01550 cf_string, CA_GOD, (void *) mudconf.sqlDB_username_B, 128},
01551 {(char *) "sqlDB_password_B",
01552 cf_string, CA_GOD, (void *) mudconf.sqlDB_password_B, 128},
01553 {(char *) "sqlDB_dbname_B",
01554 cf_string, CA_GOD, (void *) mudconf.sqlDB_dbname_B, 128},
01555 {(char *) "sqlDB_type_C",
01556 cf_string, CA_GOD, (void *) mudconf.sqlDB_type_C, 128},
01557 {(char *) "sqlDB_hostname_C",
01558 cf_string, CA_GOD, (void *) mudconf.sqlDB_hostname_C, 128},
01559 {(char *) "sqlDB_username_C",
01560 cf_string, CA_GOD, (void *) mudconf.sqlDB_username_C, 128},
01561 {(char *) "sqlDB_password_C",
01562 cf_string, CA_GOD, (void *) mudconf.sqlDB_password_C, 128},
01563 {(char *) "sqlDB_dbname_C",
01564 cf_string, CA_GOD, (void *) mudconf.sqlDB_dbname_C, 128},
01565 {(char *) "sqlDB_type_D",
01566 cf_string, CA_GOD, (void *) mudconf.sqlDB_type_D, 128},
01567 {(char *) "sqlDB_hostname_D",
01568 cf_string, CA_GOD, (void *) mudconf.sqlDB_hostname_D, 128},
01569 {(char *) "sqlDB_username_D",
01570 cf_string, CA_GOD, (void *) mudconf.sqlDB_username_D, 128},
01571 {(char *) "sqlDB_password_D",
01572 cf_string, CA_GOD, (void *) mudconf.sqlDB_password_D, 128},
01573 {(char *) "sqlDB_dbname_D",
01574 cf_string, CA_GOD, (void *) mudconf.sqlDB_dbname_D, 128},
01575 {(char *) "sqlDB_type_E",
01576 cf_string, CA_GOD, (void *) mudconf.sqlDB_type_E, 128},
01577 {(char *) "sqlDB_hostname_E",
01578 cf_string, CA_GOD, (void *) mudconf.sqlDB_hostname_E, 128},
01579 {(char *) "sqlDB_username_E",
01580 cf_string, CA_GOD, (void *) mudconf.sqlDB_username_E, 128},
01581 {(char *) "sqlDB_password_E",
01582 cf_string, CA_GOD, (void *) mudconf.sqlDB_password_E, 128},
01583 {(char *) "sqlDB_dbname_E",
01584 cf_string, CA_GOD, (void *) mudconf.sqlDB_dbname_E, 128},
01585 {(char *) "sqlDB_mysql_socket",
01586 cf_string, CA_GOD, (void *) mudconf.sqlDB_mysql_socket, 128},
01587 {(char *) "sqlDB_sqlite_dbdir",
01588 cf_string, CA_GOD, (void *) mudconf.sqlDB_sqlite_dbdir, 128},
01589 {(char *) "sqlDB_max_queries",
01590 cf_int, CA_GOD, &mudconf.sqlDB_max_queries, 0},
01591 #endif
01592 {(char *) "exit_parent",
01593 cf_int, CA_GOD, &mudconf.exit_parent, 0},
01594 {(char *) "room_parent",
01595 cf_int, CA_GOD, &mudconf.room_parent, 0},
01596 {NULL, NULL, 0, NULL, 0}
01597 };
01598
01599
01600
01601
01602
01603 int cf_set(char *cp, char *ap, dbref player)
01604 {
01605 CONF *tp;
01606 int i;
01607 char *buff = NULL;
01608
01609
01610
01611
01612
01613
01614 for(tp = conftable; tp->pname; tp++) {
01615 if(!strcmp(tp->pname, cp)) {
01616 if(!mudstate.initializing && !check_access(player, tp->flags)) {
01617 notify(player, "Permission denied.");
01618 return (-1);
01619 }
01620 buff = alloc_lbuf("cf_set");
01621 StringCopy(buff, ap);
01622 i = tp->interpreter(tp->loc, ap, tp->extra, player, cp);
01623 if(!mudstate.initializing) {
01624 log_error(LOG_CONFIGMODS, "CFG", "UPDAT",
01625 "%s entered config directive: %s with args '%s'. Status: %s%s%s%s",
01626 Name(player), cp, buff, (i==0?"Success":(i==1?"Partial success":(i==-1?"Failure":"Strange"))));
01627
01628 }
01629 free_lbuf(buff);
01630 return i;
01631 }
01632 }
01633
01634
01635
01636
01637
01638 cf_log_notfound(player, (char *) "Set", "Config directive", cp);
01639 return (-1);
01640 }
01641
01642
01643
01644
01645
01646 void do_admin(dbref player, dbref cause, int extra, char *kw, char *value)
01647 {
01648 int i;
01649
01650 i = cf_set(kw, value, player);
01651 if((i >= 0) && !Quiet(player))
01652 notify(player, "Set.");
01653 return;
01654 }
01655
01656
01657
01658
01659
01660 int cf_read(char *fn)
01661 {
01662 int retval;
01663
01664 StringCopy(mudconf.config_file, fn);
01665 mudstate.initializing = 1;
01666 retval = cf_include(NULL, fn, 0, 0, (char *) "init");
01667 mudstate.initializing = 0;
01668
01669
01670
01671
01672
01673 if(!*mudconf.outdb) {
01674 StringCopy(mudconf.outdb, mudconf.indb);
01675 strcat(mudconf.outdb, ".out");
01676 }
01677 if(!*mudconf.crashdb) {
01678 StringCopy(mudconf.crashdb, mudconf.indb);
01679 strcat(mudconf.crashdb, ".CRASH");
01680 }
01681 if(!*mudconf.gdbm) {
01682 StringCopy(mudconf.gdbm, mudconf.indb);
01683 strcat(mudconf.gdbm, ".gdbm");
01684 }
01685 return retval;
01686 }
01687
01688
01689
01690
01691
01692 void list_cf_access(dbref player)
01693 {
01694 CONF *tp;
01695 char *buff;
01696
01697 buff = alloc_mbuf("list_cf_access");
01698 for(tp = conftable; tp->pname; tp++) {
01699 if(God(player) || check_access(player, tp->flags)) {
01700 sprintf(buff, "%s:", tp->pname);
01701 listset_nametab(player, access_nametab, tp->flags, buff, 1);
01702 }
01703 }
01704 free_mbuf(buff);
01705 }
01706
01707
01708
01709
01710 void fun_config(char *buff, char **bufc, dbref player, dbref cause,
01711 char *fargs[], int nfargs, char *cargs[], int ncargs)
01712 {
01713 CONF *cp;
01714
01715 for(cp = conftable; cp->pname; ++cp) {
01716 if(!strcmp(cp->pname, fargs[0])) {
01717
01718
01719
01720 if(cp->flags == CA_DISABLED) {
01721 safe_str("#-1 PERMISSION DENIED", buff, bufc);
01722 return;
01723 }
01724 if(cp->interpreter == cf_string) {
01725 safe_str((char *) cp->loc, buff, bufc);
01726 return;
01727 }
01728
01729
01730
01731 if(cp->interpreter == cf_int || cp->interpreter == cf_bool) {
01732 safe_tprintf_str(buff, bufc, "%d", *(int *) cp->loc);
01733 return;
01734 }
01735
01736
01737 safe_str("#-1 UNCONVERTABLE CONF TYPE", buff, bufc);
01738 return;
01739 }
01740 }
01741 safe_str("#-1", buff, bufc);
01742 }