/* Copyright (c) 1993 Stephen F. White */ #include "cool.h" #include "proto.h" #include "netio.h" #include "execute.h" int promiscuous = 0; int corefile = 0; int compiler = 0; int registration = 0; int verify_servers = 0; int sleep_to_refresh = 1; Objid sys_obj; /* shortcut, d00d */ void panic (const char *s) { writelog (); fprintf (stderr, "PANIC: %s\n", s); shutdown_server (); } /* * init() * * Initializes the database and dumpfile, loads and connects to * remote servers (if possible). Also calls SYSOBJ.boot_server() in * the newly-loaded database. */ int init (const char *dbfilename, int send_boot, int db_must_exist) { char buf[MAX_PATH_LEN]; /* sys_obj is a global to save shoving SYS_OBJ in a local var each time */ sys_obj.server = 0; sys_obj.id = SYS_OBJ; /* read config file */ sprintf (buf, "%s.cfg", dbfilename); writelog (); fprintf (stderr, "Reading config file from %s\n", buf); if (read_config (buf)) { writelog (); fprintf (stderr, "Couldn't read config file\n"); return -2; } /* if */ /* initialize db and cache */ writelog (); fprintf (stderr, "Initializing db\n"); dddb_setfile (dbfilename); if (dddb_init (db_must_exist)) { return -4; } writelog (); fprintf (stderr, "Initializing cache\n"); if (cache_init ()) { return -5; } /* initialize system symbol table */ sym_init_sys (); /* initialize random number generator */ SRAND ((int) time ((time_t *) 0)); /* initialize opcode table */ opcode_init (); /* call SYS_OBJ.boot_server() */ if (send_boot) { send_message (-1, 0, 0, sys_obj, sys_obj, sys_obj, sym_sys (BOOT_SERVER), list_dup (empty_list), 0, sys_obj); } return 0; } void shutdown_server(void) { writelog (); fprintf(stderr, "Killing threads\n"); cmkill_all(); writelog(); fprintf (stderr, "Syncing cache\n"); cache_sync (); writelog (); fprintf (stderr, "Closing database\n"); dddb_close (); } Error sys_get_global (const char *var, Var * r) { Object *sys; if (!(sys = retrieve (sys_obj))) { writelog (); fprintf (stderr, "SYS_OBJ: #%d not found\n", SYS_OBJ); return E_OBJNF; } else if (var_get_global (sys, var, r) == E_VARNF) { writelog (); fprintf (stderr, "SYS_OBJ: #%d.%s missing\n", SYS_OBJ, var); return E_VARNF; } else { return E_NONE; } } Error sys_assign_global (const char *var, Var value) { Object *sys; String *name = string_cpy (var); Error r; if (!(sys = retrieve (sys_obj))) { writelog (); fprintf (stderr, "SYS_OBJ: #%d not found\n", SYS_OBJ); r = E_OBJNF; } else if (var_assign_global (sys, name, value) == E_TYPE) { writelog (); fprintf (stderr, "SYS_OBJ: #%d.%s assignment: type mismatch\n", SYS_OBJ, var); r = E_TYPE; } else { r = E_NONE; } string_free (name); return r; } void disconnect_player(Playerid who) { Objid player; player.id = who; player.server = 0; (void) send_message(-1, 0, 0, player, player, player, sym_sys(SYM_DISCONNECT), list_dup(empty_list), 0, player); } void connect_server (Serverid server) { List *args; args = list_new (1); args->el[0].type = OBJ; args->el[0].v.obj.id = 0; args->el[0].v.obj.server = server; (void) send_message (-1, 0, 0, sys_obj, sys_obj, sys_obj, sym_sys (CONNECT_SERVER), args, 0, sys_obj); } void disconnect_server (Serverid server) { List *args; args = list_new (1); args->el[0].type = OBJ; args->el[0].v.obj.id = 0; args->el[0].v.obj.server = server; (void) send_message (-1, 0, 0, sys_obj, sys_obj, sys_obj, sym_sys (DISCONNECT_SERVER), args, 0, sys_obj); }