// mudconf.h // // $Id: mudconf.h,v 1.34 2005/12/29 17:47:40 sdennis Exp $ // #ifndef __CONF_H #define __CONF_H #include "alloc.h" #include "htab.h" #include "stringutil.h" #ifndef WIN32 #include <netinet/in.h> #endif // !WIN32 #define WIDTHOF_DOING_STRING 45 #define SIZEOF_DOING_STRING (2*WIDTHOF_DOING_STRING) /* CONFDATA: runtime configurable parameters */ typedef struct tag_int_array { int n; int *pi; } IntArray; typedef struct { const char *CommandName; CHashTable *ht; char *pBaseFilename; bool bEval; } HELP_DESC; typedef struct confdata CONFDATA; struct confdata { bool allow_guest_from_registered_site; // Whether guests from registered sites are allowed. bool autozone; // New objects are automatically zoned. bool cache_names; /* Should object names be cached separately */ bool clone_copy_cost; /* Does @clone copy value? */ bool compress_db; // should we use compress. bool dark_sleepers; /* Are sleeping players 'dark'? */ bool destroy_going_now; // Does GOING act like DESTROY_OK? bool eval_comtitle; /* Should Comtitles Evaluate? */ bool ex_flags; /* true = show flags on examine */ bool exam_public; /* Does EXAM show public attrs by default? */ bool fascist_tport; /* Src of teleport must be owned/JUMP_OK */ bool fork_dump; // perform dump in a forked process. bool have_comsys; // Should the comsystem be active? bool have_mailer; // Should @mail be active? bool have_zones; // Should zones be active? bool idle_wiz_dark; /* Do idling wizards get set dark? */ bool indent_desc; // Newlines before and after descs? bool match_mine; /* Should you check yourself for $-commands? */ bool match_mine_pl; /* Should players check selves for $-cmds? */ bool name_spaces; // allow player names to have spaces. bool paranoid_alloc; /* Rigorous buffer integrity checks */ bool pemit_any; /* Can you @pemit to ANY remote object? */ bool pemit_players; /* Can you @pemit to faraway players? */ bool player_listen; /* Are AxHEAR triggered on players? */ bool pub_flags; /* true = flags() works on anything */ bool quiet_look; /* true = don't see attribs when looking */ bool quiet_whisper; /* Can others tell when you whisper? */ bool quotas; /* true = have building quotas */ bool read_rem_desc; /* Can the DESCs of nonlocal objs be read? */ bool read_rem_name; /* Can the NAMEs of nonlocal objs be read? */ bool reset_players; // Reset the maximum player stat. bool robot_speak; /* true = allow robots to speak */ bool run_startup; // If no, startup attributes aren't processed on load. bool safe_unowned; /* Are objects not owned by you safe? */ bool safe_wipe; // If yes, SAFE flag must be removed to @wipe. bool safer_passwords; /* enforce reasonably good password choices? */ bool see_own_dark; /* Do you see your own dark stuff? */ bool space_compress; /* Convert multiple spaces into one space */ bool sweep_dark; /* Can you sweep dark places? */ bool switch_df_all; /* Should @switch match all by default? */ bool terse_contents; /* Does TERSE look show exits */ bool terse_exits; /* Does TERSE look show obvious exits */ bool terse_look; /* Does manual look obey TERSE */ bool terse_movemsg; /* Show move msgs (SUCC/LEAVE/etc) if TERSE? */ bool trace_topdown; /* Is TRACE output top-down or bottom-up? */ bool use_hostname; /* true = use machine NAME rather than quad */ bool use_http; /* Should we allow http access? */ dbref default_home; // HOME when home is inaccessable. dbref global_error_obj; // Object that is used to generate error messages. dbref guest_char; // player num of prototype GUEST character. dbref guest_nuker; // Wiz who nukes the GUEST characters. dbref hook_obj; // Object with @hook data. dbref master_room; // Room containing default cmds/exits/etc. dbref start_home; // initial HOME for players. dbref start_room; // initial location and home for players. dbref toad_recipient; /* Default @toad recipient. */ int active_q_chunk; /* # cmds to run from queue when active */ int cache_pages; // Size of hash page cache (in pages). int check_interval; /* interval between db check/cleans in secs */ int check_offset; /* when to perform first check and clean */ int cmd_quota_incr; /* Bump #cmds allowed by this each timeslice */ int cmd_quota_max; /* Max commands at one time */ int conn_timeout; /* Allow this long to connect before booting */ int control_flags; /* Global runtime control flags */ int createmax; /* max cost of @create command */ int createmin; /* default (and minimum) cost of @create cmd */ int digcost; /* cost of @dig command */ int dump_interval; /* interval between ckp dumps in seconds */ int dump_offset; /* when to take first checkpoint dump */ int events_daily_hour; /* At what hour should @daily be executed? */ int exit_quota; /* quota needed to make an exit */ int func_invk_lim; /* Max funcs invoked by a command */ int func_nest_lim; /* Max nesting of functions */ int hook_cmd; // @hooks to be initialized. int idle_interval; /* when to check for idle users */ int idle_timeout; /* Boot off players idle this long in secs */ int init_size; // initial db size. int killguarantee; /* cost of kill cmd that guarantees success */ int killmax; /* max cost of kill command */ int killmin; /* default (and minimum) cost of kill cmd */ int linkcost; /* cost of @link command */ int lock_nest_lim; /* Max nesting of lock evals */ int log_info; /* Info that goes into log entries */ int log_options; /* What gets logged */ int machinecost; /* One in mc+1 cmds costs 1 penny (POW2-1) */ int mail_expiration; /* Number of days to wait to delete mail */ int mail_per_hour; // Maximum sent @mail per hour per object. int max_players; /* Max # of connected players */ int min_guests; // The # we should start nuking at. int nStackLimit; // Current stack limit. #ifdef REALITY_LVLS int no_levels; /* Number of reality levels */ struct rlevel_def { char name[9]; /* Rlevel name */ RLEVEL value; /* Rlevel bitmask */ char attr[33]; /* desc attribute */ } reality_level[32]; /* Reality levels */ RLEVEL def_room_rx; /* Default room RX level */ RLEVEL def_room_tx; /* Default room TX level */ RLEVEL def_player_rx; /* Default player RX level */ RLEVEL def_player_tx; /* Default player RX level */ RLEVEL def_exit_rx; /* Default exit RX level */ RLEVEL def_exit_tx; /* Default exit TX level */ RLEVEL def_thing_rx; /* Default thing RX level */ RLEVEL def_thing_tx; /* Default thing TX level */ #endif /* REALITY_LVLS */ int ntfy_nest_lim; /* Max nesting of notifys */ int number_guests; // number of guest characters allowed. int opencost; /* cost of @open command */ int output_limit; /* Max # chars queued for output */ int pagecost; /* cost of @page command */ int parent_nest_lim; /* Max levels of parents */ int paycheck; /* players earn this much each day connected */ int payfind; /* chance to find a penny with wandering */ int paylimit; /* getting money gets hard over this much */ int paystart; /* new players start with this much money */ int player_quota; /* quota needed to make a robot player */ int pcreate_per_hour; // Maximum allowed players created per hour */ int queue_chunk; /* # cmds to run from queue when idle */ int queuemax; /* max commands a player may have in queue */ int retry_limit; /* close conn after this many bad logins */ int robotcost; /* cost of @robot command */ int room_quota; /* quota needed to make a room */ int sacadjust; /* sacrifice earns (obj_cost/sfactor) + sadj */ int sacfactor; /* ... */ int searchcost; /* cost of commands that search the whole DB */ int sig_action; // What to do with fatal signals. int stack_limit; /* How big can stacks get? */ int start_quota; /* Quota for new players */ int thing_quota; /* quota needed to make a thing */ int trace_limit; /* Max lines of trace output if top-down */ int vattr_flags; /* Attr flags for all user-defined attrs */ int vattr_per_hour; // Maximum allowed vattrs per hour per object. int waitcost; /* cost of @wait (refunded when finishes) */ int wild_invk_lim; // Max Regular Expression function calls. int zone_nest_lim; /* Max nesting of zones */ int restrict_home; // Special condition to restrict 'home' command unsigned int max_cache_size; /* Max size of attribute cache */ unsigned int site_chars; // where to truncate site name. IntArray ports; // user ports. char guest_prefix[32]; /* Prefix for the guest char's name */ char guests_channel[32]; /* Name of guests channel */ char guests_channel_alias[32]; /* Name of guests channel alias */ char many_coins[32]; /* name of many coins (ie. "pennies") */ char mud_name[32]; /* Name of the mud */ char one_coin[32]; /* name of one coin (ie. "penny") */ char public_channel[32]; /* Name of public channel */ char public_channel_alias[32]; /* Name of public channel alias */ char dump_msg[128]; /* Message displayed when @dump-ing */ char fixed_home_msg[128]; /* Message displayed when going home and FIXED */ char fixed_tel_msg[128]; /* Message displayed when teleporting and FIXED */ char postdump_msg[128]; /* Message displayed after @dump-ing */ char downmotd_msg[GBUF_SIZE]; /* Settable 'logins disabled' message */ char fullmotd_msg[GBUF_SIZE]; /* Settable 'Too many players' message */ char motd_msg[GBUF_SIZE]; /* Wizard-settable login message */ char pueblo_msg[GBUF_SIZE]; /* Message displayed to Pueblo clients */ char wizmotd_msg[GBUF_SIZE]; /* Login message for wizards only */ char *compress; /* program to run to compress */ char *comsys_db; /* name of the comsys db */ char *config_file; /* name of config file, used by @restart */ char *conn_file; /* display on connect if no registration */ char *crashdb; /* write database here on crash */ char *crea_file; /* display this on login for new users */ char *creg_file; /* display on connect if registration */ char *down_file; /* display this file if no logins */ char *full_file; /* display when max users exceeded */ char *game_dir; /* use this game CHashFile DIR file if we need one */ char *game_pag; /* use this game CHashFile PAG file if we need one */ char *guest_file; /* display if guest connects */ char *indb; /* database file name */ char *mail_db; /* name of the @mail database */ char *motd_file; /* display this file on login */ char *outdb; /* checkpoint the database to here */ char *quit_file; /* display on quit */ char *regf_file; /* display on (failed) create if reg is on */ char *site_file; /* display if conn from bad site */ char *status_file; /* Where to write arg to @shutdown */ char *uncompress; /* program to run to uncompress */ char *wizmotd_file; /* display this file on login to wizards */ char *pid_file; // file for communicating process id back to ./Startmux unsigned char markdata[8]; /* Masks for marking/unmarking */ CLinearTimeDelta rpt_cmdsecs; /* Reporting Threshhold for time taken by command */ CLinearTimeDelta max_cmdsecs; /* Upper Limit for real time taken by command */ CLinearTimeDelta cache_tick_period; // Minor cycle for cache maintenance. CLinearTimeDelta timeslice; // How often do we bump people's cmd quotas? FLAGSET exit_flags; /* Flags exits start with */ FLAGSET player_flags; /* Flags players start with */ FLAGSET robot_flags; /* Flags robots start with */ FLAGSET room_flags; /* Flags rooms start with */ FLAGSET thing_flags; /* Flags things start with */ ArtRuleset* art_rules; /* Rulesets for defining exceptions. */ }; extern CONFDATA mudconf; typedef struct site_data SITE; struct site_data { struct site_data *next; /* Next site in chain */ struct in_addr address; /* Host or network address */ struct in_addr mask; /* Mask to apply before comparing */ int flag; /* Value to return on match */ }; typedef struct objlist_block OBLOCK; struct objlist_block { struct objlist_block *next; dbref data[(LBUF_SIZE - sizeof(OBLOCK *)) / sizeof(dbref)]; }; #define OBLOCK_SIZE ((LBUF_SIZE - sizeof(OBLOCK *)) / sizeof(dbref)) typedef struct objlist_stack OLSTK; struct objlist_stack { struct objlist_stack *next; /* Next object list in stack */ OBLOCK *head; /* Head of object list */ OBLOCK *tail; /* Tail of object list */ OBLOCK *cblock; /* Current block for scan */ unsigned int count; /* Number of objs in last obj list block */ unsigned int citm; /* Current item for scan */ }; typedef struct markbuf MARKBUF; struct markbuf { char chunk[5000]; }; typedef struct alist ALIST; struct alist { char *data; size_t len; struct alist *next; }; typedef struct badname_struc BADNAME; struct badname_struc { char *name; struct badname_struc *next; }; typedef struct forward_list FWDLIST; struct forward_list { int count; int data[1000]; }; #define MAX_ITEXT 100 typedef struct statedata STATEDATA; struct statedata { bool bCanRestart; // are we ready to even attempt a restart. bool bReadingConfiguration; // are we reading the config file at startup? bool bStackLimitReached; // Was stack slammed? bool bStandAlone; // Are we running in dbconvert mode. bool panicking; // are we in the middle of dying horribly? bool shutdown_flag; /* Should interface be shut down? */ bool inpipe; // Are we collecting output for a pipe? #ifndef WIN32 bool restarting; // Are we restarting? volatile bool dumping; // Are we dumping? volatile pid_t dumper; // PID of dumping process (as returned by fork()). volatile pid_t dumped; // PID of dumping process (as given by SIGCHLD). bool write_protect; // Write-protect against modifications to the // database during dumps. #endif // !WIN32 dbref curr_enactor; /* Who initiated the current command */ dbref curr_executor; /* Who is running the current command */ dbref freelist; /* Head of object freelist */ dbref mod_al_id; /* Where did mod_alist come from? */ dbref poutobj; /* Object doing the piping */ int attr_next; /* Next attr to alloc when freelist is empty */ int db_size; /* Allocated size of db structure */ int db_top; /* Number of items in the db */ int epoch; /* Generation number for dumps */ int events_flag; /* Flags for check_events */ int func_invk_ctr; /* Functions invoked so far by this command */ int func_nest_lev; /* Current nesting of functions */ int generation; /* DB global generation number */ int in_loop; // Loop nesting level. int lock_nest_lev; /* Current nesting of lock evals */ int logging; /* Are we in the middle of logging? */ int mail_db_size; /* Like db_size */ int mail_db_top; /* Like db_top */ int mHelpDesc; // Number of entries allocated. int min_size; /* Minimum db size (from file header) */ int mstat_curr; /* Which sample is latest */ int nHelpDesc; // Number of entries used. int nObjEvalNest; // The nesting level of objeval() invocations. int nStackNest; // Current stack depth. int nHearNest; // Current aahear depth. int pipe_nest_lev; // Number of piped commands. int pcreates_this_hour; // Player creations possible this hour. int ntfy_nest_lev; /* Current nesting of notifys */ int record_players; /* The maximum # of player logged on */ int wild_invk_ctr; // Regular Expression function calls. int zone_nest_num; /* Global current zone nest position */ int mstat_idrss[2]; /* Summed private data size */ int mstat_isrss[2]; /* Summed private stack size */ int mstat_ixrss[2]; /* Summed shared size */ int mstat_secs[2]; /* Time of samples */ int glob_reg_len[MAX_GLOBAL_REGS]; /* Length of strs */ int inum[MAX_ITEXT]; // Number of iter(). Equivalent to #@. int *guest_free; /* Table to keep track of free guests */ size_t mod_alist_len; /* Length of mod_alist */ size_t mod_size; /* Length of modified buffer */ char short_ver[64]; /* Short version number (for INFO) */ char doing_hdr[SIZEOF_DOING_STRING]; /* Doing column header in the WHO display */ char version[128]; /* MUX version string */ char *curr_cmd; /* The current command */ char *debug_cmd; // The command we are executing (if any). char *mod_alist; /* Attribute list for modifying */ char *pout; /* The output of the pipe used in %| */ char *poutbufc; /* Buffer position for poutnew */ char *poutnew; /* The output being build by the current command */ char *global_regs[MAX_GLOBAL_REGS]; /* Global registers */ char *itext[MAX_ITEXT]; // Text of iter(). Equivalent to ##. ALIST iter_alist; /* Attribute list for iterations */ BADNAME *badname_head; /* List of disallowed names */ HELP_DESC *aHelpDesc; // Table of help files hashes. MARKBUF *markbits; /* temp storage for marking/unmarking */ OLSTK *olist; /* Stack of object lists for nested searches */ SITE *suspect_list; /* Sites that are suspect */ SITE *access_list; /* Access states for sites */ CLinearTimeAbsolute check_counter; /* Countdown to next db check */ CLinearTimeAbsolute cpu_count_from; /* When did we last reset CPU counters? */ CLinearTimeAbsolute dump_counter; /* Countdown to next db dump */ CLinearTimeAbsolute events_counter; /* Countdown to next events check */ CLinearTimeAbsolute idle_counter; /* Countdown to next idle check */ CLinearTimeAbsolute start_time; /* When was MUX started */ CLinearTimeAbsolute tThrottleExpired; // How much time is left in this hour of throttling. CHashTable acache_htab; // Attribute Cache CHashTable attr_name_htab; /* Attribute names hashtable */ CHashTable channel_htab; /* Channels hashtable */ CHashTable command_htab; /* Commands hashtable */ CHashTable desc_htab; /* Socket descriptor hashtable */ CHashTable flags_htab; /* Flags hashtable */ CHashTable func_htab; /* Functions hashtable */ CHashTable fwdlist_htab; /* Room forwardlists */ CHashTable logout_cmd_htab; /* Logged-out commands hashtable (WHO, etc) */ CHashTable mail_htab; /* Mail players hashtable */ CHashTable parent_htab; /* Parent $-command exclusion */ CHashTable player_htab; /* Player name->number hashtable */ CHashTable powers_htab; /* Powers hashtable */ #ifdef PARSE_TREES CHashTable tree_htab; /* Parse trees for evaluation */ #endif // PARSE_TREES CHashTable ufunc_htab; /* Local functions hashtable */ CHashTable vattr_name_htab; /* User attribute names hashtable */ CBitField bfNoListens; // Cache knowledge that there are no ^-Commands. CBitField bfNoCommands; // Cache knowledge that there are no $-Commands. CBitField bfCommands; // Cache knowledge that there are $-Commands. CBitField bfListens; // Cache knowledge that there are ^-Commands. CBitField bfReport; // Used for LROOMS. CBitField bfTraverse; // Used for LROOMS. }; extern STATEDATA mudstate; /* Configuration parameter handler definition */ #define CF_HAND(proc) int proc(int *vp, char *str, void *pExtra, UINT32 nExtra, dbref player, char *cmd) /* Global flags */ // Game control flags in mudconf.control_flags. // #define CF_LOGIN 0x0001 /* Allow nonwiz logins to the mux */ #define CF_BUILD 0x0002 /* Allow building commands */ #define CF_INTERP 0x0004 /* Allow object triggering */ #define CF_CHECKPOINT 0x0008 /* Perform auto-checkpointing */ #define CF_DBCHECK 0x0010 /* Periodically check/clean the DB */ #define CF_IDLECHECK 0x0020 /* Periodically check for idle users */ #define CF_GUEST 0x0040 /* Allow guest logins to the mux */ /* empty 0x0080 */ #define CF_DEQUEUE 0x0100 /* Remove entries from the queue */ #ifdef MUSH3 #define CF_GODMONITOR 0x0200 // Display commands to the god. #endif // MUSH3 #define CF_EVENTCHECK 0x0400 // Allow events checking. // Host information codes // #define H_REGISTRATION 0x0001 /* Registration ALWAYS on */ #define H_FORBIDDEN 0x0002 /* Reject all connects */ #define H_SUSPECT 0x0004 /* Notify wizards of connects/disconnects */ #define H_GUEST 0x0008 // Don't permit guests from here #define H_NOSITEMON 0x0010 // Block SiteMon Information // Event flags, for noting when an event has taken place. // #define ET_DAILY 0x00000001 /* Daily taken place? */ /* Logging options */ #define LOG_ALLCOMMANDS 0x00000001 /* Log all commands */ #define LOG_ACCOUNTING 0x00000002 /* Write accounting info on logout */ #define LOG_BADCOMMANDS 0x00000004 /* Log bad commands */ #define LOG_BUGS 0x00000008 /* Log program bugs found */ #define LOG_DBSAVES 0x00000010 /* Log database dumps */ #define LOG_CONFIGMODS 0x00000020 /* Log changes to configuration */ #define LOG_PCREATES 0x00000040 /* Log character creations */ #define LOG_KILLS 0x00000080 /* Log KILLs */ #define LOG_LOGIN 0x00000100 /* Log logins and logouts */ #define LOG_NET 0x00000200 /* Log net connects and disconnects */ #define LOG_SECURITY 0x00000400 /* Log security-related events */ #define LOG_SHOUTS 0x00000800 /* Log shouts */ #define LOG_STARTUP 0x00001000 /* Log nonfatal errors in startup */ #define LOG_WIZARD 0x00002000 /* Log dangerous things */ #define LOG_ALLOCATE 0x00004000 /* Log alloc/free from buffer pools */ #define LOG_PROBLEMS 0x00008000 /* Log runtime problems */ #define LOG_SUSPECTCMDS 0x00020000 // Log SUSPECT player keyboard commands. #ifdef MUSH3 #define LOG_KBCOMMANDS 0x00010000 // Log keyboard commands. #endif // MUSH3 #define LOG_TIMEUSE 0x00040000 // Log CPU time usage. #define LOG_ALWAYS 0x80000000 /* Always log it */ #define LOGOPT_FLAGS 0x01 /* Report flags on object */ #define LOGOPT_LOC 0x02 /* Report loc of obj when requested */ #define LOGOPT_OWNER 0x04 /* Report owner of obj if not obj */ #define LOGOPT_TIMESTAMP 0x08 /* Timestamp log entries */ #endif // !__CONF_H