src/conf.c

Go to the documentation of this file.
00001 /*
00002  * conf.c:      set up configuration information and static data
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 /* default (runtime-resettable) cache parameters */
00023 
00024 #define CACHE_DEPTH     10
00025 #define CACHE_WIDTH     20
00026 
00027 /*
00028  * ---------------------------------------------------------------------------
00029  * * CONFPARM: Data used to find fields in CONFDATA.
00030  */
00031 
00032 typedef struct confparm CONF;
00033 struct confparm {
00034         char *pname;                            /* parm name */
00035         int (*interpreter) ();          /* routine to interp parameter */
00036         int flags;                                      /* control flags */
00037         int *loc;                                       /* where to store value */
00038         long extra;                                     /* extra data for interpreter */
00039 };
00040 
00041 /*
00042  * ---------------------------------------------------------------------------
00043  * * External symbols.
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  * * cf_init: Initialize mudconf to default values.
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          * -- ??? Running SC on a non-SC DB may cause problems
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                                                                                  * Everything for now...
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  * * cf_log_notfound: Log a 'parameter not found' error.
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  * * cf_log_syntax: Log a syntax error.
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  * * cf_status_from_succfail: Return command status from succ and fail info
00463  */
00464 
00465 int cf_status_from_succfail(dbref player, char *cmd, int success, int failure)
00466 {
00467         char *buff;
00468 
00469         /*
00470          * If any successes, return SUCCESS(0) if no failures or * * * * *
00471          * PARTIAL_SUCCESS(1) if any failures.
00472          */
00473 
00474         if(success > 0)
00475                 return ((failure == 0) ? 0 : 1);
00476 
00477         /*
00478          * No successes.  If no failures indicate nothing done. Always return
00479          *
00480          * *  * *  * *  * *  * * FAILURE(-1)
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  * * cf_int: Set integer parameter.
00496  */
00497 
00498 int cf_int(int *vp, char *str, long extra, dbref player, char *cmd)
00499 {
00500         /*
00501          * Copy the numeric value to the parameter
00502          */
00503 
00504         sscanf(str, "%d", vp);
00505         return 0;
00506 }
00507 /* *INDENT-OFF* */
00508 
00509 /* ---------------------------------------------------------------------------
00510  * cf_bool: Set boolean parameter.
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 /* *INDENT-ON* */
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  * * cf_option: Select one option from many choices.
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  * * cf_string: Set string parameter.
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          * Copy the string to the buffer if it is not too big
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  * * cf_alias: define a generic hash table alias.
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  * * cf_flagalias: define a flag alias.
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  * * cf_or_in_bits: OR in bits from namelist to a word.
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          * Walk through the tokens
00649          */
00650 
00651         success = failure = 0;
00652         sp = strtok(str, " \t");
00653         while (sp != NULL) {
00654 
00655                 /*
00656                  * Set the appropriate bit
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                  * Get the next token
00670                  */
00671 
00672                 sp = strtok(NULL, " \t");
00673         }
00674         return cf_status_from_succfail(player, cmd, success, failure);
00675 }
00676 
00677 /*
00678  * ---------------------------------------------------------------------------
00679  * * cf_modify_bits: set or clear bits in a flag word from a namelist.
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          * Walk through the tokens
00688          */
00689 
00690         success = failure = 0;
00691         sp = strtok(str, " \t");
00692         while (sp != NULL) {
00693 
00694                 /*
00695                  * Check for negation
00696                  */
00697 
00698                 negate = 0;
00699                 if(*sp == '!') {
00700                         negate = 1;
00701                         sp++;
00702                 }
00703                 /*
00704                  * Set or clear the appropriate bit
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                  * Get the next token
00721                  */
00722 
00723                 sp = strtok(NULL, " \t");
00724         }
00725         return cf_status_from_succfail(player, cmd, success, failure);
00726 }
00727 
00728 /*
00729  * ---------------------------------------------------------------------------
00730  * * cf_set_bits: Clear flag word and then set specified bits from namelist.
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          * Walk through the tokens
00740          */
00741 
00742         success = failure = 0;
00743         *vp = 0;
00744         sp = strtok(str, " \t");
00745         while (sp != NULL) {
00746 
00747                 /*
00748                  * Set the appropriate bit
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                  * Get the next token
00762                  */
00763 
00764                 sp = strtok(NULL, " \t");
00765         }
00766         return cf_status_from_succfail(player, cmd, success, failure);
00767 }
00768 
00769 /*
00770  * ---------------------------------------------------------------------------
00771  * * cf_set_flags: Clear flag word and then set from a flags htab.
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          * Walk through the tokens
00784          */
00785 
00786         success = failure = 0;
00787         sp = strtok(str, " \t");
00788         fset = (FLAGSET *) vp;
00789 
00790         while (sp != NULL) {
00791 
00792                 /*
00793                  * Set the appropriate bit
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                  * Get the next token
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  * * cf_badname: Disallow use of player name/alias.
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  * * cf_site: Update site information
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          * Parse the access entry and allocate space for it
00874          */
00875 
00876         site = (SITE *) malloc(sizeof(SITE));
00877 
00878         /*
00879          * Initialize the site entry
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          * Link in the entry.  Link it at the start if not initializing, at *
00889          *
00890          * *  * *  * *  * *  * * the end if initializing.  This is so that
00891          * entries  * in * the * config * * * file are processed as you would
00892          * think they * * would be, * while * entries * * made while running
00893          * are processed * * first.
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  * * cf_cf_access: Set access on config directives
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  * * cf_include: Read another config file.  Only valid during startup.
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                  * Not a comment line or an empty one. Strip off the NL and any
00963                  * characters following it. Then, split the line into the command
00964                  * and argument portions (separated by a space). Also, trim off the
00965                  * trailing comment, if any (delimited by #)
00966                  */
00967 
00968                 for(cp = buf; *cp && *cp != '\n'; cp++);
00969                 *cp = '\0';                             /* strip \n */
00970 
00971                 for(cp = buf; *cp && isspace(*cp); cp++);       /* strip spaces */
00972                 if(*cp == '\0')                 /* skip line if nothing left */
00973                         continue;
00974 
00975                 for(ap = cp; *ap && !isspace(*ap); ap++);       /* skip over command */
00976                 if(*ap)
00977                         *ap++ = '\0';           /* trim command */
00978 
00979                 for(; *ap && isspace(*ap); ap++);       /* skip spaces */
00980 
00981                 for(zp = ap; *zp && (*zp != '#'); zp++);        /* find comment */
00982 
00983                 if(*zp)
00984                         *zp = '\0';                     /* zap comment */
00985 
00986                 for(zp = zp - 1; zp >= ap && isspace(*zp); zp--)
00987                         *zp = '\0';                     /* zap trailing spaces */
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  * conftable: Table for parsing the configuration file.
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  * * cf_set: Set config parameter.
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          * Search the config parameter table for the command. If we find it,
01611          * call the handler to parse the argument.
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          * Config directive not found.  Complain about it.
01636          */
01637 
01638         cf_log_notfound(player, (char *) "Set", "Config directive", cp);
01639         return (-1);
01640 }
01641 
01642 /*
01643  * ---------------------------------------------------------------------------
01644  * * do_admin: Command handler to set config params at runtime
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  * * cf_read: Read in config parameters from named file
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          * Fill in missing DB file names
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  * * list_cf_access: List access to config directives.
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  ** fun_config: returns the option set in mudconf
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                         /* ::FIX:: [cad] little hack. I don't think it's necessairy to need god privs
01718                          ** to read options so check_access doesn't work
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                         /* [cad] bool can be returned as 0|1 or true|false softcoders should
01730                            decide how they want it */
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                         /* [cad] no other idea what to do with the hashtables and stuff */
01737                         safe_str("#-1 UNCONVERTABLE CONF TYPE", buff, bufc);
01738                         return;
01739                 }
01740         }
01741         safe_str("#-1", buff, bufc);
01742 }

Generated on Mon May 28 04:25:19 2007 for BattletechMUX by  doxygen 1.4.7