/*
* conf.c: set up configuration information and static data
*/
/*
* $Id: conf.c,v 1.5 2005/08/08 09:43:06 murrayma Exp $
*/
#include "copyright.h"
#include "config.h"
#include "mudconf.h"
#include "db.h"
#include "externs.h"
#include "interface.h"
#include "command.h"
#include "htab.h"
#include "alloc.h"
#include "attrs.h"
#include "flags.h"
#include "powers.h"
#ifdef SQL_SUPPORT
#include "sqlchild.h"
#endif
/* default (runtime-resettable) cache parameters */
#define CACHE_DEPTH 10
#define CACHE_WIDTH 20
/*
* ---------------------------------------------------------------------------
* * CONFPARM: Data used to find fields in CONFDATA.
*/
typedef struct confparm CONF;
struct confparm {
char *pname; /*
* parm name
*/
int (*interpreter) (); /*
* routine to interp parameter
*/
int flags; /*
* control flags
*/
int *loc; /*
* where to store value
*/
long extra; /*
* extra data for interpreter
*/
};
/*
* ---------------------------------------------------------------------------
* * External symbols.
*/
CONFDATA mudconf;
STATEDATA mudstate;
#ifndef STANDALONE
extern NAMETAB logdata_nametab[];
extern NAMETAB logoptions_nametab[];
extern NAMETAB access_nametab[];
extern NAMETAB attraccess_nametab[];
extern NAMETAB list_names[];
#if 0
extern NAMETAB sigactions_nametab[];
#endif
extern CONF conftable[];
#endif
/*
* ---------------------------------------------------------------------------
* * cf_init: Initialize mudconf to default values.
*/
void cf_init(void)
{
#ifndef STANDALONE
int i;
StringCopy(mudconf.indb, "tinymush.db");
StringCopy(mudconf.outdb, "");
StringCopy(mudconf.crashdb, "");
StringCopy(mudconf.gdbm, "");
StringCopy(mudconf.mail_db, "mail.db");
StringCopy(mudconf.commac_db, "commac.db");
StringCopy(mudconf.hcode_db, "hcode.db");
#ifdef BT_ADVANCED_ECON
StringCopy(mudconf.econ_db, "econ.db");
#endif
StringCopy(mudconf.mech_db, "mechs");
StringCopy(mudconf.map_db, "maps");
mudconf.compress_db = 0;
StringCopy(mudconf.compress, "gzip");
StringCopy(mudconf.uncompress, "gzip -d");
StringCopy(mudconf.status_file, "shutdown.status");
mudconf.allow_unloggedwho = 0;
mudconf.btech_explode_reactor = 1;
mudconf.btech_explode_time = 120;
mudconf.btech_explode_ammo = 1;
mudconf.btech_explode_stop = 0;
mudconf.btech_stackpole = 1;
mudconf.btech_phys_use_pskill = 1;
mudconf.btech_erange = 1;
mudconf.btech_dig_only_fs = 0;
mudconf.btech_digbonus = 3;
mudconf.btech_vcrit = 2;
mudconf.btech_dynspeed = 1;
mudconf.btech_ic = 1;
mudconf.btech_parts = 1;
mudconf.btech_slowdown = 2;
mudconf.btech_fasaturn = 1;
mudconf.btech_fasacrit = 0;
mudconf.btech_fasaadvvtolcrit = 0;
mudconf.btech_fasaadvvhlcrit = 0;
mudconf.btech_fasaadvvhlfire = 0;
mudconf.btech_divrotordamage = 0;
mudconf.btech_moddamagewithrange = 0;
mudconf.btech_moddamagewithwoods = 0;
mudconf.btech_hotloadaddshalfbthmod = 0;
mudconf.btech_nofusionvtolfuel = 0;
mudconf.btech_tankfriendly = 0;
mudconf.btech_newterrain = 0;
mudconf.btech_skidcliff = 0;
mudconf.btech_xp_bthmod = 0;
mudconf.btech_xp_missilemod = 100;
mudconf.btech_xp_ammomod = 100;
mudconf.btech_defaultweapdam = 5;
mudconf.btech_xp_modifier = 100;
mudconf.btech_defaultweapbv = 120;
mudconf.btech_xp_usePilotBVMod = 1;
mudconf.btech_oldxpsystem = 1;
mudconf.btech_xp_vrtmod = 0;
mudconf.btech_limitedrepairs = 0;
mudconf.btech_newcharge = 0;
mudconf.btech_xploss = 666;
mudconf.btech_critlevel = 100;
mudconf.btech_tankshield = 0;
mudconf.btech_newstagger = 0;
mudconf.btech_extendedmovemod = 1;
mudconf.btech_stacking = 2;
mudconf.btech_stackdamage = 100;
mudconf.btech_mw_losmap = 1;
mudconf.btech_seismic_see_stopped = 0;
mudconf.btech_exile_stun_code = 0;
mudconf.btech_roll_on_backwalk = 1 ;
mudconf.btech_usedmechstore = 0;
mudconf.btech_ooc_comsys = 0;
mudconf.btech_idf_requires_spotter = 1;
#ifdef BT_FREETECHTIME
mudconf.btech_freetechtime = 0;
#endif
#ifdef BT_COMPLEXREPAIRS
mudconf.btech_complexrepair = 1;
#endif
#ifdef HUDINFO_SUPPORT
mudconf.hudinfo_show_mapinfo = 0;
mudconf.hudinfo_enabled;
#endif
mudconf.namechange_days = 60;
mudconf.allow_chanlurking = 0;
mudconf.afterlife_dbref = 220;
mudconf.afterscen_dbref = 801;
mudconf.port = 6250;
mudconf.conc_port = 6251;
mudconf.init_size = 1000;
mudconf.guest_char = -1;
mudconf.guest_nuker = 1;
mudconf.number_guests = 30;
StringCopy(mudconf.guest_prefix, "Guest");
StringCopy(mudconf.guest_file, "text/guest.txt");
StringCopy(mudconf.conn_file, "text/connect.txt");
StringCopy(mudconf.conn_dir, "");
StringCopy(mudconf.creg_file, "text/register.txt");
StringCopy(mudconf.regf_file, "text/create_reg.txt");
StringCopy(mudconf.motd_file, "text/motd.txt");
StringCopy(mudconf.wizmotd_file, "text/wizmotd.txt");
StringCopy(mudconf.quit_file, "text/quit.txt");
StringCopy(mudconf.down_file, "text/down.txt");
StringCopy(mudconf.full_file, "text/full.txt");
StringCopy(mudconf.site_file, "text/badsite.txt");
StringCopy(mudconf.crea_file, "text/newuser.txt");
StringCopy(mudconf.help_file, "text/help.txt");
StringCopy(mudconf.help_indx, "text/help.indx");
StringCopy(mudconf.news_file, "text/news.txt");
StringCopy(mudconf.news_indx, "text/news.indx");
StringCopy(mudconf.whelp_file, "text/wizhelp.txt");
StringCopy(mudconf.whelp_indx, "text/wizhelp.indx");
StringCopy(mudconf.plushelp_file, "text/plushelp.txt");
StringCopy(mudconf.plushelp_indx, "text/plushelp.indx");
StringCopy(mudconf.wiznews_file, "text/wiznews.txt");
StringCopy(mudconf.wiznews_indx, "text/wiznews.indx");
StringCopy(mudconf.motd_msg, "");
StringCopy(mudconf.wizmotd_msg, "");
StringCopy(mudconf.downmotd_msg, "");
StringCopy(mudconf.fullmotd_msg, "");
StringCopy(mudconf.dump_msg, "");
StringCopy(mudconf.postdump_msg, "");
StringCopy(mudconf.fixed_home_msg, "");
StringCopy(mudconf.fixed_tel_msg, "");
StringCopy(mudconf.public_channel, "Public");
StringCopy(mudconf.guests_channel, "Guests");
StringCopy(mudconf.pueblo_msg, "</xch_mudtext><img xch_mode=html>");
mudconf.indent_desc = 0;
mudconf.name_spaces = 1;
mudconf.fork_dump = 1;
mudconf.fork_vfork = 0;
mudconf.have_specials = 1;
mudconf.have_comsys = 1;
mudconf.have_macros = 1;
mudconf.have_mailer = 1;
mudconf.have_zones = 1;
mudconf.paranoid_alloc = 0;
mudconf.sig_action = SA_DFLT;
mudconf.max_players = -1;
mudconf.dump_interval = 3600;
mudconf.check_interval = 600;
mudconf.events_daily_hour = 7;
mudconf.dump_offset = 0;
mudconf.check_offset = 300;
mudconf.idle_timeout = 3600;
mudconf.conn_timeout = 120;
mudconf.idle_interval = 60;
mudconf.retry_limit = 3;
mudconf.output_limit = 16384;
mudconf.paycheck = 0;
mudconf.paystart = 0;
mudconf.paylimit = 10000;
mudconf.start_quota = 20;
mudconf.site_chars = 25;
mudconf.payfind = 0;
mudconf.digcost = 10;
mudconf.linkcost = 1;
mudconf.opencost = 1;
mudconf.createmin = 10;
mudconf.createmax = 505;
mudconf.killmin = 10;
mudconf.killmax = 100;
mudconf.killguarantee = 100;
mudconf.robotcost = 1000;
mudconf.pagecost = 10;
mudconf.searchcost = 100;
mudconf.waitcost = 10;
mudconf.machinecost = 64;
mudconf.exit_quota = 1;
mudconf.player_quota = 1;
mudconf.room_quota = 1;
mudconf.thing_quota = 1;
mudconf.mail_expiration = 14;
mudconf.use_http = 0;
mudconf.queuemax = 100;
mudconf.queue_chunk = 10;
mudconf.active_q_chunk = 10;
mudconf.sacfactor = 5;
mudconf.sacadjust = -1;
mudconf.use_hostname = 1;
mudconf.quotas = 0;
mudconf.ex_flags = 1;
mudconf.robot_speak = 1;
mudconf.clone_copy_cost = 0;
mudconf.pub_flags = 1;
mudconf.quiet_look = 1;
mudconf.exam_public = 1;
mudconf.read_rem_desc = 0;
mudconf.read_rem_name = 0;
mudconf.sweep_dark = 0;
mudconf.player_listen = 0;
mudconf.quiet_whisper = 1;
mudconf.dark_sleepers = 1;
mudconf.see_own_dark = 1;
mudconf.idle_wiz_dark = 0;
mudconf.pemit_players = 0;
mudconf.pemit_any = 0;
mudconf.match_mine = 0;
mudconf.match_mine_pl = 0;
mudconf.switch_df_all = 1;
mudconf.fascist_tport = 0;
mudconf.terse_look = 1;
mudconf.terse_contents = 1;
mudconf.terse_exits = 1;
mudconf.terse_movemsg = 1;
mudconf.trace_topdown = 1;
mudconf.trace_limit = 200;
mudconf.safe_unowned = 0;
/*
* -- ??? Running SC on a non-SC DB may cause problems
*/
mudconf.space_compress = 1;
mudconf.start_room = 0;
mudconf.start_home = -1;
mudconf.default_home = -1;
mudconf.master_room = -1;
mudconf.player_flags.word1 = 0;
mudconf.player_flags.word2 = 0;
mudconf.room_flags.word1 = 0;
mudconf.room_flags.word2 = 0;
mudconf.exit_flags.word1 = 0;
mudconf.exit_flags.word2 = 0;
mudconf.thing_flags.word1 = 0;
mudconf.thing_flags.word2 = 0;
mudconf.robot_flags.word1 = ROBOT;
mudconf.robot_flags.word2 = 0;
mudconf.vattr_flags = AF_ODARK;
StringCopy(mudconf.mud_name, "TinyMUX");
StringCopy(mudconf.one_coin, "penny");
StringCopy(mudconf.many_coins, "pennies");
mudconf.timeslice = 100;
mudconf.cmd_quota_max = 100;
mudconf.cmd_quota_incr = 5;
mudconf.control_flags = 0xffffffff; /*
* Everything for now...
*/
mudconf.log_options =
LOG_ALWAYS | LOG_BUGS | LOG_SECURITY | LOG_NET | LOG_LOGIN |
LOG_DBSAVES | LOG_CONFIGMODS | LOG_SHOUTS | LOG_STARTUP |
LOG_WIZARD | LOG_PROBLEMS | LOG_PCREATES;
mudconf.log_info = LOGOPT_TIMESTAMP | LOGOPT_LOC;
mudconf.markdata[0] = 0x01;
mudconf.markdata[1] = 0x02;
mudconf.markdata[2] = 0x04;
mudconf.markdata[3] = 0x08;
mudconf.markdata[4] = 0x10;
mudconf.markdata[5] = 0x20;
mudconf.markdata[6] = 0x40;
mudconf.markdata[7] = 0x80;
mudconf.func_nest_lim = 50;
mudconf.func_invk_lim = 2500;
mudconf.ntfy_nest_lim = 20;
mudconf.lock_nest_lim = 20;
mudconf.parent_nest_lim = 10;
mudconf.zone_nest_lim = 20;
mudconf.stack_limit = 50;
mudconf.cache_trim = 0;
mudconf.cache_depth = CACHE_DEPTH;
mudconf.cache_width = CACHE_WIDTH;
mudconf.cache_names = 1;
mudstate.events_flag = 0;
mudstate.events_lasthour = -1;
mudstate.initializing = 0;
mudstate.panicking = 0;
mudstate.dumping = 0;
mudstate.logging = 0;
mudstate.epoch = 0;
mudstate.generation = 0;
mudstate.curr_player = NOTHING;
mudstate.curr_enactor = NOTHING;
mudstate.shutdown_flag = 0;
mudstate.attr_next = A_USER_START;
mudstate.debug_cmd = (char *) "< init >";
StringCopy(mudstate.doing_hdr, "Doing");
mudstate.access_list = NULL;
mudstate.suspect_list = NULL;
mudstate.qfirst = NULL;
mudstate.qlast = NULL;
mudstate.qlfirst = NULL;
mudstate.qllast = NULL;
mudstate.qwait = NULL;
mudstate.qsemfirst = NULL;
mudstate.qsemlast = NULL;
mudstate.badname_head = NULL;
mudstate.mstat_ixrss[0] = 0;
mudstate.mstat_ixrss[1] = 0;
mudstate.mstat_idrss[0] = 0;
mudstate.mstat_idrss[1] = 0;
mudstate.mstat_isrss[0] = 0;
mudstate.mstat_isrss[1] = 0;
mudstate.mstat_secs[0] = 0;
mudstate.mstat_secs[1] = 0;
mudstate.mstat_curr = 0;
mudstate.iter_alist.data = NULL;
mudstate.iter_alist.len = 0;
mudstate.iter_alist.next = NULL;
mudstate.mod_alist = NULL;
mudstate.mod_size = 0;
mudstate.mod_al_id = NOTHING;
mudstate.olist = NULL;
mudstate.min_size = 0;
mudstate.db_top = 0;
mudstate.db_size = 0;
mudstate.mail_db_top = 0;
mudstate.mail_db_size = 0;
mudstate.mail_freelist = 0;
mudstate.freelist = NOTHING;
mudstate.markbits = NULL;
mudstate.func_nest_lev = 0;
mudstate.func_invk_ctr = 0;
mudstate.ntfy_nest_lev = 0;
mudstate.lock_nest_lev = 0;
mudstate.zone_nest_num = 0;
mudstate.inpipe = 0;
mudstate.pout = NULL;
mudstate.poutnew = NULL;
mudstate.poutbufc = NULL;
mudstate.poutobj = -1;
for (i = 0; i < MAX_GLOBAL_REGS; i++)
mudstate.global_regs[i] = NULL;
#else
mudconf.paylimit = 10000;
mudconf.digcost = 10;
mudconf.opencost = 1;
mudconf.robotcost = 1000;
mudconf.createmin = 5;
mudconf.createmax = 505;
mudconf.sacfactor = 5;
mudconf.sacadjust = -1;
mudconf.room_quota = 1;
mudconf.exit_quota = 1;
mudconf.thing_quota = 1;
mudconf.player_quota = 1;
mudconf.quotas = 0;
mudconf.start_room = 0;
mudconf.start_home = -1;
mudconf.default_home = -1;
mudconf.vattr_flags = AF_ODARK;
mudconf.log_options = 0xffffffff;
mudconf.log_info = 0;
mudconf.markdata[0] = 0x01;
mudconf.markdata[1] = 0x02;
mudconf.markdata[2] = 0x04;
mudconf.markdata[3] = 0x08;
mudconf.markdata[4] = 0x10;
mudconf.markdata[5] = 0x20;
mudconf.markdata[6] = 0x40;
mudconf.markdata[7] = 0x80;
mudconf.ntfy_nest_lim = 20;
mudconf.cache_trim = 0;
mudstate.logging = 0;
mudstate.attr_next = A_USER_START;
mudstate.iter_alist.data = NULL;
mudstate.iter_alist.len = 0;
mudstate.iter_alist.next = NULL;
mudstate.mod_alist = NULL;
mudstate.mod_size = 0;
mudstate.mod_al_id = NOTHING;
mudstate.min_size = 0;
mudstate.db_top = 0;
mudstate.db_size = 0;
mudstate.freelist = NOTHING;
mudstate.markbits = NULL;
#endif /*
* * STANDALONE
*/
#ifdef SQL_SUPPORT
memset(mudconf.sqlDB_type_A, '\0', 128);
memset(mudconf.sqlDB_hostname_A, '\0', 128);
memset(mudconf.sqlDB_username_A, '\0', 128);
memset(mudconf.sqlDB_password_A, '\0', 128);
memset(mudconf.sqlDB_dbname_A, '\0', 128);
memset(mudconf.sqlDB_type_B, '\0', 128);
memset(mudconf.sqlDB_hostname_B, '\0', 128);
memset(mudconf.sqlDB_username_B, '\0', 128);
memset(mudconf.sqlDB_password_B, '\0', 128);
memset(mudconf.sqlDB_dbname_B, '\0', 128);
memset(mudconf.sqlDB_type_C, '\0', 128);
memset(mudconf.sqlDB_hostname_C, '\0', 128);
memset(mudconf.sqlDB_username_C, '\0', 128);
memset(mudconf.sqlDB_password_C, '\0', 128);
memset(mudconf.sqlDB_dbname_C, '\0', 128);
memset(mudconf.sqlDB_type_D, '\0', 128);
memset(mudconf.sqlDB_hostname_D, '\0', 128);
memset(mudconf.sqlDB_username_D, '\0', 128);
memset(mudconf.sqlDB_password_D, '\0', 128);
memset(mudconf.sqlDB_dbname_D, '\0', 128);
memset(mudconf.sqlDB_type_E, '\0', 128);
memset(mudconf.sqlDB_hostname_E, '\0', 128);
memset(mudconf.sqlDB_username_E, '\0', 128);
memset(mudconf.sqlDB_password_E, '\0', 128);
memset(mudconf.sqlDB_dbname_E, '\0', 128);
mudconf.sqlDB_init_A = 0;
mudconf.sqlDB_init_B = 0;
mudconf.sqlDB_init_C = 0;
mudconf.sqlDB_init_D = 0;
mudconf.sqlDB_init_E = 0;
mudconf.sqlDB_max_queries = 4;
memset(mudconf.sqlDB_mysql_socket, '\0', 128);
#endif
#ifdef EXTENDED_DEFAULT_PARENTS
mudconf.exit_parent = 0;
mudconf.room_parent = 0;
#endif
}
#ifndef STANDALONE
/*
* ---------------------------------------------------------------------------
* * cf_log_notfound: Log a 'parameter not found' error.
*/
void cf_log_notfound(player, cmd, thingname, thing)
dbref player;
char *cmd, *thing;
const char *thingname;
{
char *buff;
if (mudstate.initializing) {
STARTLOG(LOG_STARTUP, "CNF", "NFND") {
buff = alloc_lbuf("cf_log_notfound.LOG");
sprintf(buff, "%s: %s %s not found", cmd, thingname, thing);
log_text(buff);
free_lbuf(buff);
ENDLOG;
}
} else {
buff = alloc_lbuf("cf_log_notfound");
sprintf(buff, "%s %s not found", thingname, thing);
notify(player, buff);
free_lbuf(buff);
}
}
/*
* ---------------------------------------------------------------------------
* * cf_log_syntax: Log a syntax error.
*/
void cf_log_syntax(player, cmd, template, arg)
dbref player;
char *cmd, *arg;
const char *template;
{
char *buff;
if (mudstate.initializing) {
STARTLOG(LOG_STARTUP, "CNF", "SYNTX") {
buff = alloc_lbuf("cf_log_syntax.LOG");
sprintf(buff, template, arg);
log_text(cmd);
log_text((char *) ": ");
log_text(buff);
free_lbuf(buff);
ENDLOG;
}} else {
buff = alloc_lbuf("cf_log_syntax");
sprintf(buff, template, arg);
notify(player, buff);
free_lbuf(buff);
}
}
/*
* ---------------------------------------------------------------------------
* * cf_status_from_succfail: Return command status from succ and fail info
*/
int cf_status_from_succfail(player, cmd, success, failure)
dbref player;
char *cmd;
int success, failure;
{
char *buff;
/*
* If any successes, return SUCCESS(0) if no failures or * * * * *
* PARTIAL_SUCCESS(1) if any failures.
*/
if (success > 0)
return ((failure == 0) ? 0 : 1);
/*
* No successes. If no failures indicate nothing done. Always return
*
* * * * * * * * * * FAILURE(-1)
*/
if (failure == 0) {
if (mudstate.initializing) {
STARTLOG(LOG_STARTUP, "CNF", "NDATA") {
buff = alloc_lbuf("cf_status_from_succfail.LOG");
sprintf(buff, "%s: Nothing to set", cmd);
log_text(buff);
free_lbuf(buff);
ENDLOG;
}
} else {
notify(player, "Nothing to set");
}
}
return -1;
}
/*
* ---------------------------------------------------------------------------
* * cf_int: Set integer parameter.
*/
int cf_int(int *vp, char *str, long extra, dbref player, char *cmd)
{
/*
* Copy the numeric value to the parameter
*/
sscanf(str, "%d", vp);
return 0;
}
/* *INDENT-OFF* */
/* ---------------------------------------------------------------------------
* cf_bool: Set boolean parameter.
*/
NAMETAB bool_names[] = {
{(char *)"true", 1, 0, 1},
{(char *)"false", 1, 0, 0},
{(char *)"yes", 1, 0, 1},
{(char *)"no", 1, 0, 0},
{(char *)"1", 1, 0, 1},
{(char *)"0", 1, 0, 0},
{NULL, 0, 0, 0}};
/* *INDENT-ON* */
int cf_bool(int *vp, char *str, long extra, dbref player, char *cmd)
{
*vp = (int) search_nametab(GOD, bool_names, str);
if (*vp < 0)
*vp = (long) 0;
return 0;
}
/*
* ---------------------------------------------------------------------------
* * cf_option: Select one option from many choices.
*/
int cf_option(int *vp, char *str, long extra, dbref player, char *cmd)
{
int i;
i = search_nametab(GOD, (NAMETAB *) extra, str);
if (i < 0) {
cf_log_notfound(player, cmd, "Value", str);
return -1;
}
*vp = i;
return 0;
}
/*
* ---------------------------------------------------------------------------
* * cf_string: Set string parameter.
*/
int cf_string(int *vp, char *str, long extra, dbref player, char *cmd)
{
int retval;
char *buff;
/*
* Copy the string to the buffer if it is not too big
*/
retval = 0;
if (strlen(str) >= extra) {
str[extra - 1] = '\0';
if (mudstate.initializing) {
STARTLOG(LOG_STARTUP, "CNF", "NFND") {
buff = alloc_lbuf("cf_string.LOG");
sprintf(buff, "%s: String truncated", cmd);
log_text(buff);
free_lbuf(buff);
ENDLOG;
}
} else {
notify(player, "String truncated");
}
retval = 1;
}
StringCopy((char *) vp, str);
return retval;
}
/*
* ---------------------------------------------------------------------------
* * cf_alias: define a generic hash table alias.
*/
int cf_alias(int *vp, char *str, long extra, dbref player, char *cmd)
{
char *alias, *orig, *p;
int *cp = NULL;
alias = strtok(str, " \t=,");
orig = strtok(NULL, " \t=,");
if (orig) {
for (p = orig; *p; p++)
*p = ToLower(*p);
cp = hashfind(orig, (HASHTAB *) vp);
if (cp == NULL) {
for (p = orig; *p; p++)
*p = ToUpper(*p);
cp = hashfind(orig, (HASHTAB *) vp);
if (cp == NULL) {
cf_log_notfound(player, cmd, "Entry", orig);
return -1;
}
}
}
if (cp == NULL) {
return -1;
}
hashadd(alias, cp, (HASHTAB *) vp);
return 0;
}
/*
* ---------------------------------------------------------------------------
* * cf_flagalias: define a flag alias.
*/
int cf_flagalias(int *vp, char *str, long extra, dbref player, char *cmd)
{
char *alias, *orig;
int *cp, success;
success = 0;
alias = strtok(str, " \t=,");
orig = strtok(NULL, " \t=,");
cp = hashfind(orig, &mudstate.flags_htab);
if (cp != NULL) {
hashadd(alias, cp, &mudstate.flags_htab);
success++;
}
if (!success)
cf_log_notfound(player, cmd, "Flag", orig);
return ((success > 0) ? 0 : -1);
}
/*
* ---------------------------------------------------------------------------
* * cf_or_in_bits: OR in bits from namelist to a word.
*/
int cf_or_in_bits(int *vp, char *str, long extra, dbref player, char *cmd)
{
char *sp;
int f, success, failure;
/*
* Walk through the tokens
*/
success = failure = 0;
sp = strtok(str, " \t");
while (sp != NULL) {
/*
* Set the appropriate bit
*/
f = search_nametab(GOD, (NAMETAB *) extra, sp);
if (f > 0) {
*vp |= f;
success++;
} else {
cf_log_notfound(player, cmd, "Entry", sp);
failure++;
}
/*
* Get the next token
*/
sp = strtok(NULL, " \t");
}
return cf_status_from_succfail(player, cmd, success, failure);
}
/*
* ---------------------------------------------------------------------------
* * cf_modify_bits: set or clear bits in a flag word from a namelist.
*/
int cf_modify_bits(int *vp, char *str, long extra, dbref player, char *cmd)
{
char *sp;
int f, negate, success, failure;
/*
* Walk through the tokens
*/
success = failure = 0;
sp = strtok(str, " \t");
while (sp != NULL) {
/*
* Check for negation
*/
negate = 0;
if (*sp == '!') {
negate = 1;
sp++;
}
/*
* Set or clear the appropriate bit
*/
f = search_nametab(GOD, (NAMETAB *) extra, sp);
if (f > 0) {
if (negate)
*vp &= ~f;
else
*vp |= f;
success++;
} else {
cf_log_notfound(player, cmd, "Entry", sp);
failure++;
}
/*
* Get the next token
*/
sp = strtok(NULL, " \t");
}
return cf_status_from_succfail(player, cmd, success, failure);
}
/*
* ---------------------------------------------------------------------------
* * cf_set_bits: Clear flag word and then set specified bits from namelist.
*/
int cf_set_bits(int *vp, char *str, long extra, dbref player, char *cmd)
{
char *sp;
int f, success, failure;
/*
* Walk through the tokens
*/
success = failure = 0;
*vp = 0;
sp = strtok(str, " \t");
while (sp != NULL) {
/*
* Set the appropriate bit
*/
f = search_nametab(GOD, (NAMETAB *) extra, sp);
if (f > 0) {
*vp |= f;
success++;
} else {
cf_log_notfound(player, cmd, "Entry", sp);
failure++;
}
/*
* Get the next token
*/
sp = strtok(NULL, " \t");
}
return cf_status_from_succfail(player, cmd, success, failure);
}
/*
* ---------------------------------------------------------------------------
* * cf_set_flags: Clear flag word and then set from a flags htab.
*/
int cf_set_flags(int *vp, char *str, long extra, dbref player, char *cmd)
{
char *sp;
FLAGENT *fp;
FLAGSET *fset;
int success, failure;
/*
* Walk through the tokens
*/
success = failure = 0;
sp = strtok(str, " \t");
fset = (FLAGSET *) vp;
while (sp != NULL) {
/*
* Set the appropriate bit
*/
fp = (FLAGENT *) hashfind(sp, &mudstate.flags_htab);
if (fp != NULL) {
if (success == 0) {
(*fset).word1 = 0;
(*fset).word2 = 0;
}
if (fp->flagflag & FLAG_WORD3)
(*fset).word3 |= fp->flagvalue;
else if (fp->flagflag & FLAG_WORD2)
(*fset).word2 |= fp->flagvalue;
else
(*fset).word1 |= fp->flagvalue;
success++;
} else {
cf_log_notfound(player, cmd, "Entry", sp);
failure++;
}
/*
* Get the next token
*/
sp = strtok(NULL, " \t");
}
if ((success == 0) && (failure == 0)) {
(*fset).word1 = 0;
(*fset).word2 = 0;
return 0;
}
if (success > 0)
return ((failure == 0) ? 0 : 1);
return -1;
}
/*
* ---------------------------------------------------------------------------
* * cf_badname: Disallow use of player name/alias.
*/
int cf_badname(int *vp, char *str, long extra, dbref player, char *cmd)
{
if (extra)
badname_remove(str);
else
badname_add(str);
return 0;
}
/*
* ---------------------------------------------------------------------------
* * cf_site: Update site information
*/
int cf_site(long **vp, char *str, long extra, dbref player, char *cmd)
{
SITE *site, *last, *head;
char *addr_txt, *mask_txt;
struct in_addr addr_num, mask_num;
addr_txt = strtok(str, " \t=,");
mask_txt = NULL;
if (addr_txt)
mask_txt = strtok(NULL, " \t=,");
if (!addr_txt || !*addr_txt || !mask_txt || !*mask_txt) {
cf_log_syntax(player, cmd, "Missing host address or mask.",
(char *) "");
return -1;
}
addr_num.s_addr = inet_addr(addr_txt);
mask_num.s_addr = inet_addr(mask_txt);
if (addr_num.s_addr == -1) {
cf_log_syntax(player, cmd, "Bad host address: %s", addr_txt);
return -1;
}
head = (SITE *) * vp;
/*
* Parse the access entry and allocate space for it
*/
site = (SITE *) malloc(sizeof(SITE));
/*
* Initialize the site entry
*/
site->address.s_addr = addr_num.s_addr;
site->mask.s_addr = mask_num.s_addr;
site->flag = extra;
site->next = NULL;
/*
* Link in the entry. Link it at the start if not initializing, at *
*
* * * * * * * * * * the end if initializing. This is so that
* entries * in * the * config * * * file are processed as you would
* think they * * would be, * while * entries * * made while running
* are processed * * first.
*/
if (mudstate.initializing) {
if (head == NULL) {
*vp = (long *) site;
} else {
for (last = head; last->next; last = last->next);
last->next = site;
}
} else {
site->next = head;
*vp = (long *) site;
}
return 0;
}
/*
* ---------------------------------------------------------------------------
* * cf_cf_access: Set access on config directives
*/
int cf_cf_access(int *vp, char *str, long extra, dbref player, char *cmd)
{
CONF *tp;
char *ap;
for (ap = str; *ap && !isspace(*ap); ap++);
if (*ap)
*ap++ = '\0';
for (tp = conftable; tp->pname; tp++) {
if (!strcmp(tp->pname, str)) {
return (cf_modify_bits(&tp->flags, ap, extra, player, cmd));
}
}
cf_log_notfound(player, cmd, "Config directive", str);
return -1;
}
/*
* ---------------------------------------------------------------------------
* * cf_include: Read another config file. Only valid during startup.
*/
int cf_include(int *vp, char *str, long extra, dbref player, char *cmd)
{
FILE *fp;
char *cp, *ap, *zp, *buf;
extern int cf_set(char *, char *, dbref);
if (!mudstate.initializing)
return -1;
fp = fopen(str, "r");
if (fp == NULL) {
cf_log_notfound(player, cmd, "Config file", str);
return -1;
}
buf = alloc_lbuf("cf_include");
while (1) {
if (!fgets(buf, LBUF_SIZE, fp))
break;
cp = buf;
if (!cp || !*cp || *cp == '#' || *cp == '\n')
continue;
/*
* Not a comment line or an empty one. Strip off the NL and any
* characters following it. Then, split the line into the command
* and argument portions (separated by a space). Also, trim off the
* trailing comment, if any (delimited by #)
*/
for (cp = buf; *cp && *cp != '\n'; cp++);
*cp = '\0'; /* strip \n */
for (cp = buf; *cp && isspace(*cp); cp++); /* strip spaces */
if (*cp == '\0') /* skip line if nothing left */
continue;
for (ap = cp; *ap && !isspace(*ap); ap++); /* skip over command */
if (*ap)
*ap++ = '\0'; /* trim command */
for (; *ap && isspace(*ap); ap++); /* skip spaces */
for (zp = ap; *zp && (*zp != '#'); zp++); /* find comment */
if (*zp)
*zp = '\0'; /* zap comment */
for (zp = zp - 1; zp >= ap && isspace(*zp); zp--)
*zp = '\0'; /* zap trailing spaces */
cf_set(cp, ap, player);
}
if (ferror(fp))
fprintf(stderr, "Error reading config file: %s\n",
strerror(errno));
free_lbuf(buf);
fclose(fp);
return 0;
}
extern int cf_access(long *, char *, long, dbref, char *);
extern int cf_cmd_alias(long *, char *, long, dbref, char *);
extern int cf_acmd_access(long *, char *, long, dbref, char *);
extern int cf_attr_access(long *, char *, long, dbref, char *);
extern int cf_func_access(long *, char *, long, dbref, char *);
/* *INDENT-OFF* */
/* ---------------------------------------------------------------------------
* conftable: Table for parsing the configuration file.
*/
CONF conftable[] = {
{(char *)"access",
cf_access, CA_GOD, NULL,
(long)access_nametab},
{(char *)"alias",
cf_cmd_alias, CA_GOD, (int *)&mudstate.command_htab, 0},
{(char *)"allow_unloggedwho",
cf_int, CA_GOD, &mudconf.allow_unloggedwho, 0},
{(char *)"attr_access",
cf_attr_access, CA_GOD, NULL,
(long)attraccess_nametab},
{(char *)"attr_alias",
cf_alias, CA_GOD, (int *)&mudstate.attr_name_htab,0},
{(char *)"attr_cmd_access",
cf_acmd_access, CA_GOD, NULL,
(long)access_nametab},
{(char *)"bad_name",
cf_badname, CA_GOD, NULL, 0},
{(char *)"badsite_file",
cf_string, CA_DISABLED, (int *)mudconf.site_file, 32},
{(char *)"btech_explode_reactor",
cf_int, CA_GOD, &mudconf.btech_explode_reactor, 0},
{(char *)"btech_explode_time",
cf_int, CA_GOD, &mudconf.btech_explode_time, 0},
{(char *)"btech_explode_ammo",
cf_int, CA_GOD, &mudconf.btech_explode_ammo, 0},
{(char *)"btech_explode_stop",
cf_int, CA_GOD, &mudconf.btech_explode_stop, 0},
{(char *)"btech_failures",
cf_int, CA_GOD, &mudconf.btech_parts, 0},
{(char *)"btech_ic",
cf_int, CA_GOD, &mudconf.btech_ic, 0},
{(char *)"btech_afterlife_dbref",
cf_int, CA_GOD, &mudconf.afterlife_dbref, 0},
{(char *)"btech_afterscen_dbref",
cf_int, CA_GOD, &mudconf.afterscen_dbref, 0},
{(char *)"btech_vcrit",
cf_int, CA_GOD, &mudconf.btech_vcrit, 0},
{(char *)"btech_dynspeed",
cf_int, CA_GOD, &mudconf.btech_dynspeed, 0},
{(char *)"btech_slowdown",
cf_int, CA_GOD, &mudconf.btech_slowdown, 0},
{(char *)"btech_fasaturn",
cf_int, CA_GOD, &mudconf.btech_fasaturn, 0},
{(char *)"btech_fasacrit",
cf_int, CA_GOD, &mudconf.btech_fasacrit, 0},
{(char *)"btech_fasaadvvtolcrit",
cf_int, CA_GOD, &mudconf.btech_fasaadvvtolcrit, 0},
{(char *)"btech_fasaadvvhlcrit",
cf_int, CA_GOD, &mudconf.btech_fasaadvvhlcrit, 0},
{(char *)"btech_fasaadvvhlfire",
cf_int, CA_GOD, &mudconf.btech_fasaadvvhlfire, 0},
{(char *)"btech_divrotordamage",
cf_int, CA_GOD, &mudconf.btech_divrotordamage, 0},
{(char *)"btech_moddamagewithrange",
cf_int, CA_GOD, &mudconf.btech_moddamagewithrange, 0},
{(char *)"btech_moddamagewithwoods",
cf_int, CA_GOD, &mudconf.btech_moddamagewithwoods, 0},
{(char *)"btech_hotloadaddshalfbthmod",
cf_int, CA_GOD, &mudconf.btech_hotloadaddshalfbthmod, 0},
{(char *)"btech_nofusionvtolfuel",
cf_int, CA_GOD, &mudconf.btech_nofusionvtolfuel, 0},
{(char *)"btech_tankfriendly",
cf_int, CA_GOD, &mudconf.btech_tankfriendly, 0},
{(char *)"btech_newcharge",
cf_int, CA_GOD, &mudconf.btech_newcharge, 0},
{(char *)"btech_newterrain",
cf_int, CA_GOD, &mudconf.btech_newterrain, 0},
{(char *)"btech_xploss",
cf_int, CA_GOD, &mudconf.btech_xploss, 0},
{(char *)"btech_critlevel",
cf_int, CA_GOD, &mudconf.btech_critlevel, 0},
{(char *)"btech_tankshield",
cf_int, CA_GOD, &mudconf.btech_tankshield, 0},
{(char *)"btech_newstagger",
cf_int, CA_GOD, &mudconf.btech_newstagger, 0},
{(char *)"namechange_days",
cf_int, CA_GOD, &mudconf.namechange_days, 0},
{(char *)"allow_chanlurking",
cf_int, CA_GOD, &mudconf.allow_chanlurking, 0},
{(char *)"btech_skidcliff",
cf_int, CA_GOD, &mudconf.btech_skidcliff, 0},
{(char *)"btech_xp_bthmod",
cf_int, CA_GOD, &mudconf.btech_xp_bthmod, 0},
{(char *)"btech_xp_missilemod",
cf_int, CA_GOD, &mudconf.btech_xp_missilemod, 0},
{(char *)"btech_xp_ammomod",
cf_int, CA_GOD, &mudconf.btech_xp_ammomod, 0},
{(char *)"btech_defaultweapdam",
cf_int, CA_GOD, &mudconf.btech_defaultweapdam, 0},
{(char *)"btech_xp_modifier",
cf_int, CA_GOD, &mudconf.btech_xp_modifier, 0},
{(char *)"btech_defaultweapbv",
cf_int, CA_GOD, &mudconf.btech_defaultweapbv, 0},
{(char *)"btech_xp_usePilotBVMod",
cf_int, CA_GOD, &mudconf.btech_xp_usePilotBVMod, 0},
{(char *)"btech_oldxpsystem",
cf_int, CA_GOD, &mudconf.btech_oldxpsystem, 0},
{(char *)"btech_xp_vrtmod",
cf_int, CA_GOD, &mudconf.btech_xp_vrtmod, 0},
{(char *)"btech_extendedmovemod",
cf_int, CA_GOD, &mudconf.btech_extendedmovemod, 0},
{(char *)"btech_stacking",
cf_int, CA_GOD, &mudconf.btech_stacking, 0},
{(char *)"btech_stackdamage",
cf_int, CA_GOD, &mudconf.btech_stackdamage, 0},
{(char *)"btech_mw_losmap",
cf_int, CA_GOD, &mudconf.btech_mw_losmap, 0},
{(char *)"btech_exile_stun_code",
cf_int, CA_GOD, &mudconf.btech_exile_stun_code, 0},
{(char *)"btech_roll_on_backwalk",
cf_int, CA_GOD, &mudconf.btech_roll_on_backwalk, 0},
{(char *)"btech_usedmechstore",
cf_int, CA_GOD, &mudconf.btech_usedmechstore, 0},
{(char *)"btech_ooc_comsys",
cf_int, CA_GOD, &mudconf.btech_ooc_comsys, 0},
{(char *)"btech_idf_requires_spotter",
cf_int, CA_GOD, &mudconf.btech_idf_requires_spotter, 0},
#ifdef BT_FREETECHTIME
{(char *)"btech_freetechtime",
cf_int, CA_GOD, &mudconf.btech_freetechtime, 0},
#endif
#ifdef BT_COMPLEXREPAIRS
{(char *)"btech_complexrepair",
cf_int, CA_GOD, &mudconf.btech_complexrepair, 0},
#endif
#ifdef HUDINFO_SUPPORT
{(char *)"hudinfo_show_mapinfo",
cf_int, CA_GOD, &mudconf.hudinfo_show_mapinfo, 0},
{(char *)"hudinfo_enabled",
cf_int, CA_GOD, &mudconf.hudinfo_enabled, 0},
#endif
{(char *)"btech_seismic_see_stopped",
cf_int, CA_GOD, &mudconf.btech_seismic_see_stopped, 0},
{(char *)"btech_limitedrepairs",
cf_int, CA_GOD, &mudconf.btech_limitedrepairs, 0},
{(char *)"btech_stackpole",
cf_int, CA_GOD, &mudconf.btech_stackpole, 0},
{(char *)"btech_phys_use_pskill",
cf_int, CA_GOD, &mudconf.btech_phys_use_pskill, 0},
{(char *)"btech_erange",
cf_int, CA_GOD, &mudconf.btech_erange, 0},
{(char *)"btech_dig_only_fs",
cf_int, CA_GOD, &mudconf.btech_dig_only_fs, 0},
{(char *)"btech_digbonus",
cf_int, CA_GOD, &mudconf.btech_digbonus, 0},
{(char *)"cache_depth",
cf_int, CA_DISABLED, &mudconf.cache_depth, 0},
{(char *)"cache_names",
cf_bool, CA_DISABLED, &mudconf.cache_names, 0},
{(char *)"cache_trim",
cf_bool, CA_GOD, &mudconf.cache_trim, 0},
{(char *)"cache_width",
cf_int, CA_DISABLED, &mudconf.cache_width, 0},
{(char *)"check_interval",
cf_int, CA_GOD, &mudconf.check_interval, 0},
{(char *)"check_offset",
cf_int, CA_GOD, &mudconf.check_offset, 0},
{(char *)"clone_copies_cost",
cf_bool, CA_GOD, &mudconf.clone_copy_cost, 0},
{(char *)"commac_database",
cf_string, CA_GOD, (int *)mudconf.commac_db, 128},
{(char *)"command_quota_increment",
cf_int, CA_GOD, &mudconf.cmd_quota_incr, 0},
{(char *)"command_quota_max",
cf_int, CA_GOD, &mudconf.cmd_quota_max, 0},
{(char *)"compress_program",
cf_string, CA_DISABLED, (int *)mudconf.compress, 128},
{(char *)"compression",
cf_bool, CA_GOD, &mudconf.compress_db, 0},
{(char *)"concentrator_port",
cf_int, CA_DISABLED, &mudconf.conc_port, 0},
{(char *)"config_access",
cf_cf_access, CA_GOD, NULL,
(long)access_nametab},
{(char *)"conn_timeout",
cf_int, CA_GOD, &mudconf.conn_timeout, 0},
{(char *)"connect_dir",
cf_string, CA_DISABLED, (int *)mudconf.conn_dir, 32},
{(char *)"connect_file",
cf_string, CA_DISABLED, (int *)mudconf.conn_file, 32},
{(char *)"connect_reg_file",
cf_string, CA_DISABLED, (int *)mudconf.creg_file, 32},
{(char *)"crash_database",
cf_string, CA_DISABLED, (int *)mudconf.crashdb, 128},
{(char *)"create_max_cost",
cf_int, CA_GOD, &mudconf.createmax, 0},
{(char *)"create_min_cost",
cf_int, CA_GOD, &mudconf.createmin, 0},
{(char *)"dark_sleepers",
cf_bool, CA_GOD, &mudconf.dark_sleepers, 0},
{(char *)"default_home",
cf_int, CA_GOD, &mudconf.default_home, 0},
{(char *)"dig_cost",
cf_int, CA_GOD, &mudconf.digcost, 0},
{(char *)"down_file",
cf_string, CA_DISABLED, (int *)mudconf.down_file, 32},
{(char *)"down_motd_message",
cf_string, CA_GOD, (int *)mudconf.downmotd_msg, 4096},
{(char *)"dump_interval",
cf_int, CA_GOD, &mudconf.dump_interval, 0},
{(char *)"dump_message",
cf_string, CA_GOD, (int *)mudconf.dump_msg, 128},
{(char *)"postdump_message",
cf_string, CA_GOD, (int *)mudconf.postdump_msg, 128},
{(char *)"pueblo_message",
cf_string, CA_GOD, (int *) mudconf.pueblo_msg, 1024},
{(char *)"dump_offset",
cf_int, CA_GOD, &mudconf.dump_offset, 0},
{(char *)"earn_limit",
cf_int, CA_GOD, &mudconf.paylimit, 0},
{(char *)"examine_flags",
cf_bool, CA_GOD, &mudconf.ex_flags, 0},
{(char *)"examine_public_attrs",
cf_bool, CA_GOD, &mudconf.exam_public, 0},
{(char *)"exit_flags",
cf_set_flags, CA_GOD, (int *)&mudconf.exit_flags, 0},
{(char *)"exit_quota",
cf_int, CA_GOD, &mudconf.exit_quota, 0},
{(char *)"events_daily_hour",
cf_int, CA_GOD, &mudconf.events_daily_hour, 0},
{(char *)"fascist_teleport",
cf_bool, CA_GOD, &mudconf.fascist_tport, 0},
{(char *)"fixed_home_message",
cf_string, CA_DISABLED, (int *)mudconf.fixed_home_msg, 128},
{(char *)"fixed_tel_message",
cf_string, CA_DISABLED, (int *)mudconf.fixed_tel_msg, 128},
{(char *)"find_money_chance",
cf_int, CA_GOD, &mudconf.payfind, 0},
{(char *)"flag_alias",
cf_flagalias, CA_GOD, NULL, 0},
{(char *)"forbid_site",
cf_site, CA_GOD, (int *)&mudstate.access_list,
H_FORBIDDEN},
{(char *)"fork_dump",
cf_bool, CA_GOD, &mudconf.fork_dump, 0},
{(char *)"fork_vfork",
cf_bool, CA_GOD, &mudconf.fork_vfork, 0},
{(char *)"full_file",
cf_string, CA_DISABLED, (int *)mudconf.full_file, 32},
{(char *)"full_motd_message",
cf_string, CA_GOD, (int *)mudconf.fullmotd_msg, 4096},
{(char *)"function_access",
cf_func_access, CA_GOD, NULL,
(long)access_nametab},
{(char *)"function_alias",
cf_alias, CA_GOD, (int *)&mudstate.func_htab, 0},
{(char *)"function_invocation_limit",
cf_int, CA_GOD, &mudconf.func_invk_lim, 0},
{(char *)"function_recursion_limit",
cf_int, CA_GOD, &mudconf.func_nest_lim, 0},
{(char *)"gdbm_database",
cf_string, CA_DISABLED, (int *)mudconf.gdbm, 128},
{(char *)"good_name",
cf_badname, CA_GOD, NULL, 1},
{(char *)"guest_char_num",
cf_int, CA_DISABLED, &mudconf.guest_char, 0},
{(char *)"guest_nuker",
cf_int, CA_GOD, &mudconf.guest_nuker, 0},
{(char *)"guest_prefix",
cf_string, CA_DISABLED, (int *)mudconf.guest_prefix, 32},
{(char *)"number_guests",
cf_int, CA_DISABLED, &mudconf.number_guests, 0},
{(char *)"guest_file",
cf_string, CA_DISABLED, (int *)mudconf.guest_file, 32},
{(char *)"guests_channel",
cf_string, CA_DISABLED, (int *)mudconf.guests_channel, 32},
{(char *)"have_specials",
cf_bool, CA_DISABLED, &mudconf.have_specials, 0},
{(char *)"have_comsys",
cf_bool, CA_DISABLED, &mudconf.have_comsys, 0},
{(char *)"have_macros",
cf_bool, CA_DISABLED, &mudconf.have_macros, 0},
{(char *)"have_mailer",
cf_bool, CA_DISABLED, &mudconf.have_mailer, 0},
{(char *)"have_zones",
cf_bool, CA_DISABLED, &mudconf.have_zones, 0},
{(char *)"hcode_database",
cf_string, CA_GOD, (int *)mudconf.hcode_db, 128},
#ifdef BT_ADVANCED_ECON
{(char *)"econ_database",
cf_string, CA_GOD, (int *)mudconf.econ_db, 128},
#endif
{(char *)"help_file",
cf_string, CA_DISABLED, (int *)mudconf.help_file, 32},
{(char *)"help_index",
cf_string, CA_DISABLED, (int *)mudconf.help_indx, 32},
{(char *)"hostnames",
cf_bool, CA_GOD, &mudconf.use_hostname, 0},
{(char *)"use_http",
cf_bool, CA_DISABLED, &mudconf.use_http, 0},
{(char *)"idle_wiz_dark",
cf_bool, CA_GOD, &mudconf.idle_wiz_dark, 0},
{(char *)"idle_interval",
cf_int, CA_GOD, &mudconf.idle_interval, 0},
{(char *)"idle_timeout",
cf_int, CA_GOD, &mudconf.idle_timeout, 0},
{(char *)"include",
cf_include, CA_DISABLED, NULL, 0},
{(char *)"indent_desc",
cf_bool, CA_GOD, &mudconf.indent_desc, 0},
{(char *)"initial_size",
cf_int, CA_DISABLED, &mudconf.init_size, 0},
{(char *)"input_database",
cf_string, CA_DISABLED, (int *)mudconf.indb, 128},
{(char *)"kill_guarantee_cost",
cf_int, CA_GOD, &mudconf.killguarantee, 0},
{(char *)"kill_max_cost",
cf_int, CA_GOD, &mudconf.killmax, 0},
{(char *)"kill_min_cost",
cf_int, CA_GOD, &mudconf.killmin, 0},
{(char *)"link_cost",
cf_int, CA_GOD, &mudconf.linkcost, 0},
{(char *)"list_access",
cf_ntab_access, CA_GOD, (int *)list_names,
(long)access_nametab},
{(char *)"lock_recursion_limit",
cf_int, CA_WIZARD, &mudconf.lock_nest_lim, 0},
{(char *)"log",
cf_modify_bits, CA_GOD, &mudconf.log_options,
(long)logoptions_nametab},
{(char *)"log_options",
cf_modify_bits, CA_GOD, &mudconf.log_info,
(long)logdata_nametab},
{(char *)"logout_cmd_access",
cf_ntab_access, CA_GOD, (int *)logout_cmdtable,
(long)access_nametab},
{(char *)"logout_cmd_alias",
cf_alias, CA_GOD, (int *)&mudstate.logout_cmd_htab,0},
{(char *)"look_obey_terse",
cf_bool, CA_GOD, &mudconf.terse_look, 0},
{(char *)"machine_command_cost",
cf_int, CA_GOD, &mudconf.machinecost, 0},
{(char *)"mail_database",
cf_string, CA_GOD, (int *)mudconf.mail_db, 128},
{(char *)"mail_expiration",
cf_int, CA_GOD, &mudconf.mail_expiration, 0},
{(char *)"map_database",
cf_string, CA_GOD, (int *)mudconf.map_db, 128},
{(char *)"master_room",
cf_int, CA_GOD, &mudconf.master_room, 0},
{(char *)"match_own_commands",
cf_bool, CA_GOD, &mudconf.match_mine, 0},
{(char *)"max_players",
cf_int, CA_GOD, &mudconf.max_players, 0},
{(char *)"mech_database",
cf_string, CA_GOD, (int *)mudconf.mech_db, 128},
{(char *)"money_name_plural",
cf_string, CA_GOD, (int *)mudconf.many_coins, 32},
{(char *)"money_name_singular",
cf_string, CA_GOD, (int *)mudconf.one_coin, 32},
{(char *)"motd_file",
cf_string, CA_DISABLED, (int *)mudconf.motd_file, 32},
{(char *)"motd_message",
cf_string, CA_GOD, (int *)mudconf.motd_msg, 4096},
{(char *)"mud_name",
cf_string, CA_GOD, (int *)mudconf.mud_name, 32},
{(char *)"news_file",
cf_string, CA_DISABLED, (int *)mudconf.news_file, 32},
{(char *)"news_index",
cf_string, CA_DISABLED, (int *)mudconf.news_indx, 32},
{(char *)"newuser_file",
cf_string, CA_DISABLED, (int *)mudconf.crea_file, 32},
{(char *)"notify_recursion_limit",
cf_int, CA_GOD, &mudconf.ntfy_nest_lim, 0},
{(char *)"open_cost",
cf_int, CA_GOD, &mudconf.opencost, 0},
{(char *)"output_database",
cf_string, CA_DISABLED, (int *)mudconf.outdb, 128},
{(char *)"output_limit",
cf_int, CA_GOD, &mudconf.output_limit, 0},
{(char *)"page_cost",
cf_int, CA_GOD, &mudconf.pagecost, 0},
{(char *)"paranoid_allocate",
cf_bool, CA_GOD, &mudconf.paranoid_alloc, 0},
{(char *)"parent_recursion_limit",
cf_int, CA_GOD, &mudconf.parent_nest_lim, 0},
{(char *)"paycheck",
cf_int, CA_GOD, &mudconf.paycheck, 0},
{(char *)"pemit_far_players",
cf_bool, CA_GOD, &mudconf.pemit_players, 0},
{(char *)"pemit_any_object",
cf_bool, CA_GOD, &mudconf.pemit_any, 0},
{(char *)"permit_site",
cf_site, CA_GOD, (int *)&mudstate.access_list, 0},
{(char *)"player_flags",
cf_set_flags, CA_GOD, (int *)&mudconf.player_flags, 0},
{(char *)"player_listen",
cf_bool, CA_GOD, &mudconf.player_listen, 0},
{(char *)"player_match_own_commands",
cf_bool, CA_GOD, &mudconf.match_mine_pl, 0},
{(char *)"player_name_spaces",
cf_bool, CA_GOD, &mudconf.name_spaces, 0},
{(char *)"player_queue_limit",
cf_int, CA_GOD, &mudconf.queuemax, 0},
{(char *)"player_quota",
cf_int, CA_GOD, &mudconf.player_quota, 0},
{(char *)"player_starting_home",
cf_int, CA_GOD, &mudconf.start_home, 0},
{(char *)"player_starting_room",
cf_int, CA_GOD, &mudconf.start_room, 0},
{(char *)"plushelp_file",
cf_string, CA_DISABLED, (int *)mudconf.plushelp_file, 32},
{(char *)"plushelp_index",
cf_string, CA_DISABLED, (int *)mudconf.plushelp_indx, 32},
{(char *)"public_channel",
cf_string, CA_DISABLED, (int *)mudconf.public_channel, 32},
{(char *)"wiznews_file",
cf_string, CA_DISABLED, (int *)mudconf.wiznews_file, 32},
{(char *)"wiznews_index",
cf_string, CA_DISABLED, (int *)mudconf.wiznews_indx, 32},
{(char *)"port",
cf_int, CA_DISABLED, &mudconf.port, 0},
{(char *)"public_flags",
cf_bool, CA_GOD, &mudconf.pub_flags, 0},
{(char *)"queue_active_chunk",
cf_int, CA_GOD, &mudconf.active_q_chunk, 0},
{(char *)"queue_idle_chunk",
cf_int, CA_GOD, &mudconf.queue_chunk, 0},
{(char *)"quiet_look",
cf_bool, CA_GOD, &mudconf.quiet_look, 0},
{(char *)"quiet_whisper",
cf_bool, CA_GOD, &mudconf.quiet_whisper, 0},
{(char *)"quit_file",
cf_string, CA_DISABLED, (int *)mudconf.quit_file, 32},
{(char *)"quotas",
cf_bool, CA_GOD, &mudconf.quotas, 0},
{(char *)"read_remote_desc",
cf_bool, CA_GOD, &mudconf.read_rem_desc, 0},
{(char *)"read_remote_name",
cf_bool, CA_GOD, &mudconf.read_rem_name, 0},
{(char *)"register_create_file",
cf_string, CA_DISABLED, (int *)mudconf.regf_file, 32},
{(char *)"register_site",
cf_site, CA_GOD, (int *)&mudstate.access_list,
H_REGISTRATION},
{(char *)"retry_limit",
cf_int, CA_GOD, &mudconf.retry_limit, 0},
{(char *)"robot_cost",
cf_int, CA_GOD, &mudconf.robotcost, 0},
{(char *)"robot_flags",
cf_set_flags, CA_GOD, (int *)&mudconf.robot_flags, 0},
{(char *)"robot_speech",
cf_bool, CA_GOD, &mudconf.robot_speak, 0},
{(char *)"room_flags",
cf_set_flags, CA_GOD, (int *)&mudconf.room_flags, 0},
{(char *)"room_quota",
cf_int, CA_GOD, &mudconf.room_quota, 0},
{(char *)"sacrifice_adjust",
cf_int, CA_GOD, &mudconf.sacadjust, 0},
{(char *)"sacrifice_factor",
cf_int, CA_GOD, &mudconf.sacfactor, 0},
{(char *)"search_cost",
cf_int, CA_GOD, &mudconf.searchcost, 0},
{(char *)"see_owned_dark",
cf_bool, CA_GOD, &mudconf.see_own_dark, 0},
#if 0
{(char *)"signal_action",
cf_option, CA_DISABLED, &mudconf.sig_action,
(long)sigactions_nametab},
#endif
{(char *)"site_chars",
cf_int, CA_GOD, &mudconf.site_chars, 0},
{(char *)"space_compress",
cf_bool, CA_GOD, &mudconf.space_compress, 0},
{(char *)"stack_limit",
cf_int, CA_GOD, &mudconf.stack_limit, 0},
{(char *)"starting_money",
cf_int, CA_GOD, &mudconf.paystart, 0},
{(char *)"starting_quota",
cf_int, CA_GOD, &mudconf.start_quota, 0},
{(char *)"status_file",
cf_string, CA_DISABLED, (int *)mudconf.status_file, 128},
{(char *)"suspect_site",
cf_site, CA_GOD, (int *)&mudstate.suspect_list,
H_SUSPECT},
{(char *)"sweep_dark",
cf_bool, CA_GOD, &mudconf.sweep_dark, 0},
{(char *)"switch_default_all",
cf_bool, CA_GOD, &mudconf.switch_df_all, 0},
{(char *)"terse_shows_contents",
cf_bool, CA_GOD, &mudconf.terse_contents, 0},
{(char *)"terse_shows_exits",
cf_bool, CA_GOD, &mudconf.terse_exits, 0},
{(char *)"terse_shows_move_messages",
cf_bool, CA_GOD, &mudconf.terse_movemsg, 0},
{(char *)"thing_flags",
cf_set_flags, CA_GOD, (int *)&mudconf.thing_flags, 0},
{(char *)"thing_quota",
cf_int, CA_GOD, &mudconf.thing_quota, 0},
{(char *)"timeslice",
cf_int, CA_GOD, &mudconf.timeslice, 0},
{(char *)"trace_output_limit",
cf_int, CA_GOD, &mudconf.trace_limit, 0},
{(char *)"trace_topdown",
cf_bool, CA_GOD, &mudconf.trace_topdown, 0},
{(char *)"trust_site",
cf_site, CA_GOD, (int *)&mudstate.suspect_list, 0},
{(char *)"uncompress_program",
cf_string, CA_DISABLED, (int *)mudconf.uncompress, 128},
{(char *)"unowned_safe",
cf_bool, CA_GOD, &mudconf.safe_unowned, 0},
{(char *)"user_attr_access",
cf_modify_bits, CA_GOD, &mudconf.vattr_flags,
(long)attraccess_nametab},
{(char *)"wait_cost",
cf_int, CA_GOD, &mudconf.waitcost, 0},
{(char *)"wizard_help_file",
cf_string, CA_DISABLED, (int *)mudconf.whelp_file, 32},
{(char *)"wizard_help_index",
cf_string, CA_DISABLED, (int *)mudconf.whelp_indx, 32},
{(char *)"wizard_motd_file",
cf_string, CA_DISABLED, (int *)mudconf.wizmotd_file, 32},
{(char *)"wizard_motd_message",
cf_string, CA_GOD, (int *)mudconf.wizmotd_msg, 4096},
{(char *)"zone_recursion_limit",
cf_int, CA_GOD, &mudconf.zone_nest_lim, 0},
#ifdef SQL_SUPPORT
{(char *)"sqlDB_type_A",
cf_string, CA_GOD, (int *)mudconf.sqlDB_type_A, 128},
{(char *)"sqlDB_hostname_A",
cf_string, CA_GOD, (int *)mudconf.sqlDB_hostname_A,128},
{(char *)"sqlDB_username_A",
cf_string, CA_GOD, (int *)mudconf.sqlDB_username_A,128},
{(char *)"sqlDB_password_A",
cf_string, CA_GOD, (int *)mudconf.sqlDB_password_A,128},
{(char *)"sqlDB_dbname_A",
cf_string, CA_GOD, (int *)mudconf.sqlDB_dbname_A, 128},
{(char *)"sqlDB_type_B",
cf_string, CA_GOD, (int *)mudconf.sqlDB_type_B, 128},
{(char *)"sqlDB_hostname_B",
cf_string, CA_GOD, (int *)mudconf.sqlDB_hostname_B,128},
{(char *)"sqlDB_username_B",
cf_string, CA_GOD, (int *)mudconf.sqlDB_username_B,128},
{(char *)"sqlDB_password_B",
cf_string, CA_GOD, (int *)mudconf.sqlDB_password_B,128},
{(char *)"sqlDB_dbname_B",
cf_string, CA_GOD, (int *)mudconf.sqlDB_dbname_B, 128},
{(char *)"sqlDB_type_C",
cf_string, CA_GOD, (int *)mudconf.sqlDB_type_C, 128},
{(char *)"sqlDB_hostname_C",
cf_string, CA_GOD, (int *)mudconf.sqlDB_hostname_C,128},
{(char *)"sqlDB_username_C",
cf_string, CA_GOD, (int *)mudconf.sqlDB_username_C,128},
{(char *)"sqlDB_password_C",
cf_string, CA_GOD, (int *)mudconf.sqlDB_password_C,128},
{(char *)"sqlDB_dbname_C",
cf_string, CA_GOD, (int *)mudconf.sqlDB_dbname_C, 128},
{(char *)"sqlDB_type_D",
cf_string, CA_GOD, (int *)mudconf.sqlDB_type_D, 128},
{(char *)"sqlDB_hostname_D",
cf_string, CA_GOD, (int *)mudconf.sqlDB_hostname_D,128},
{(char *)"sqlDB_username_D",
cf_string, CA_GOD, (int *)mudconf.sqlDB_username_D,128},
{(char *)"sqlDB_password_D",
cf_string, CA_GOD, (int *)mudconf.sqlDB_password_D,128},
{(char *)"sqlDB_dbname_D",
cf_string, CA_GOD, (int *)mudconf.sqlDB_dbname_D, 128},
{(char *)"sqlDB_type_E",
cf_string, CA_GOD, (int *)mudconf.sqlDB_type_E, 128},
{(char *)"sqlDB_hostname_E",
cf_string, CA_GOD, (int *)mudconf.sqlDB_hostname_E,128},
{(char *)"sqlDB_username_E",
cf_string, CA_GOD, (int *)mudconf.sqlDB_username_E,128},
{(char *)"sqlDB_password_E",
cf_string, CA_GOD, (int *)mudconf.sqlDB_password_E,128},
{(char *)"sqlDB_dbname_E",
cf_string, CA_GOD, (int *)mudconf.sqlDB_dbname_E, 128},
{(char *)"sqlDB_mysql_socket",
cf_string, CA_GOD, (int *)mudconf.sqlDB_mysql_socket, 128},
{(char *)"sqlDB_max_queries",
cf_int, CA_GOD, &mudconf.sqlDB_max_queries, 0},
#endif
#ifdef EXTENDED_DEFAULT_PARENTS
{(char *)"exit_parent",
cf_int, CA_GOD, &mudconf.exit_parent, 0},
{(char *)"room_parent",
cf_int, CA_GOD, &mudconf.room_parent, 0},
#endif
{ NULL,
NULL, 0, NULL, 0}};
/* *INDENT-ON* */
/*
* ---------------------------------------------------------------------------
* * cf_set: Set config parameter.
*/
int cf_set(cp, ap, player)
char *cp, *ap;
dbref player;
{
CONF *tp;
int i;
char *buff=NULL;
/*
* Search the config parameter table for the command. If we find it,
* call the handler to parse the argument.
*/
for (tp = conftable; tp->pname; tp++) {
if (!strcmp(tp->pname, cp)) {
if (!mudstate.initializing && !check_access(player, tp->flags)) {
notify(player, "Permission denied.");
return (-1);
}
if (!mudstate.initializing) {
buff = alloc_lbuf("cf_set");
StringCopy(buff, ap);
}
i = tp->interpreter(tp->loc, ap, tp->extra, player, cp);
if (!mudstate.initializing) {
STARTLOG(LOG_CONFIGMODS, "CFG", "UPDAT") {
log_name(player);
log_text((char *) " entered config directive: ");
log_text(cp);
log_text((char *) " with args '");
log_text(buff);
log_text((char *) "'. Status: ");
switch (i) {
case 0:
log_text((char *) "Success.");
break;
case 1:
log_text((char *) "Partial success.");
break;
case -1:
log_text((char *) "Failure.");
break;
default:
log_text((char *) "Strange.");
}
ENDLOG;
} free_lbuf(buff);
}
return i;
}
}
/*
* Config directive not found. Complain about it.
*/
cf_log_notfound(player, (char *) "Set", "Config directive", cp);
return (-1);
}
/*
* ---------------------------------------------------------------------------
* * do_admin: Command handler to set config params at runtime
*/
void do_admin(player, cause, extra, kw, value)
dbref player, cause;
int extra;
char *kw, *value;
{
int i;
i = cf_set(kw, value, player);
if ((i >= 0) && !Quiet(player))
notify(player, "Set.");
return;
}
/*
* ---------------------------------------------------------------------------
* * cf_read: Read in config parameters from named file
*/
int cf_read(fn)
char *fn;
{
int retval;
StringCopy(mudconf.config_file, fn);
mudstate.initializing = 1;
retval = cf_include(NULL, fn, 0, 0, (char *) "init");
mudstate.initializing = 0;
/*
* Fill in missing DB file names
*/
if (!*mudconf.outdb) {
StringCopy(mudconf.outdb, mudconf.indb);
strcat(mudconf.outdb, ".out");
}
if (!*mudconf.crashdb) {
StringCopy(mudconf.crashdb, mudconf.indb);
strcat(mudconf.crashdb, ".CRASH");
}
if (!*mudconf.gdbm) {
StringCopy(mudconf.gdbm, mudconf.indb);
strcat(mudconf.gdbm, ".gdbm");
}
return retval;
}
/*
* ---------------------------------------------------------------------------
* * list_cf_access: List access to config directives.
*/
void list_cf_access(player)
dbref player;
{
CONF *tp;
char *buff;
buff = alloc_mbuf("list_cf_access");
for (tp = conftable; tp->pname; tp++) {
if (God(player) || check_access(player, tp->flags)) {
sprintf(buff, "%s:", tp->pname);
listset_nametab(player, access_nametab, tp->flags, buff, 1);
}
}
free_mbuf(buff);
}
/* ----------------------------------------------------------------------
** fun_config: returns the option set in mudconf
*/
void fun_config(char *buff, char **bufc, dbref player, dbref cause, char *fargs[], int nfargs, char *cargs[], int ncargs)
{
CONF *cp;
for( cp = conftable; cp->pname; ++cp )
{
if( !strcmp( cp->pname , fargs[0] ) )
{
/* ::FIX:: [cad] little hack. I don't think it's necessairy to need god privs
** to read options so check_access doesn't work
*/
if( cp->flags==CA_DISABLED )
{
safe_str( "#-1 PERMISSION DENIED", buff, bufc );
return;
}
if( cp->interpreter == cf_string)
{
safe_str( (char *)cp->loc, buff, bufc );
return;
}
/* [cad] bool can be returned as 0|1 or true|false softcoders should
decide how they want it */
if( cp->interpreter == cf_int ||
cp->interpreter == cf_bool )
{
safe_tprintf_str( buff, bufc, "%d", *(int*)cp->loc );
return;
}
/* [cad] no other idea what to do with the hashtables and stuff */
safe_str( "#-1 UNCONVERTABLE CONF TYPE", buff, bufc );
return;
}
}
safe_str( "#-1", buff, bufc );
}
#endif /*
* * STANDALONE
*/