/* main.c */
#include "config.h"
#include "object.h"
#include "interp.h"
#include "interface.h"
#include "cache.h"
#include "construct.h"
#include "clearq.h"
#include "globals.h"
#include "dbhandle.h"
int main(int argc, char *argv[]) {
int count,do_single,do_create,port;
char *loadpath,*savepath,*panicpath,*arg;
signed long loop;
int retval;
struct object *obj;
struct var tmp;
struct var_stack *rts;
struct fns *func;
mudlib_path=NULL;
syslog_path=NULL;
cache_path=NULL;
tmpdb_path=NULL;
count=1;
port=PORT;
do_create=0;
do_single=DEFAULT_INTERFACE;
loadpath=NULL;
savepath=NULL;
panicpath=NULL;
noisy=0;
while (count<argc) {
arg=argv[count];
if (!strcmp(arg,"-noisy"))
noisy=1;
else if (!strncmp(arg,"-load=",6))
loadpath=&(arg[6]);
else if (!strncmp(arg,"-save=",6))
savepath=&(arg[6]);
else if (!strncmp(arg,"-panic=",7))
panicpath=&(arg[7]);
else if (!strncmp(arg,"-mudlib=",8))
mudlib_path=&(arg[8]);
else if (!strncmp(arg,"-syslog=",8))
syslog_path=&(arg[8]);
else if (!strncmp(arg,"-cache=",7))
cache_path=&(arg[7]);
else if (!strncmp(arg,"-tmpdb=",7))
tmpdb_path=&(arg[7]);
else if (!strcmp(arg,"-create"))
do_create=1;
else if (!strcmp(arg,"-single"))
do_single=SINGLE;
else if (!strcmp(arg,"-multi"))
do_single=MULTI;
else if (!strncmp(arg,"-port=",6))
port=atoi(&(arg[6]));
else {
fprintf(stderr,"usage: %s [-load=filename] [-save=filename] [-panic="
"filename]\n [-mudlib=directory] [-syslog=filename] "
"[-cache=filename]\n [-tmpdb=filename] [-create] "
"[-multi] [-single]\n [-port=number] [-noisy]\n",
argv[0]);
exit(0);
}
count++;
}
if (!mudlib_path) mudlib_path=MUDLIB_PATH;
if (!syslog_path) syslog_path=SYSLOG_PATH;
if (!cache_path) cache_path=CACHE_PATH;
if (!tmpdb_path) tmpdb_path=TMPDB_PATH;
log_sysmsg(" system: starting up");
init_globals(loadpath,savepath,panicpath);
if (retval=init_interface(port,do_single)) {
if (retval==NOSINGLE)
log_sysmsg(" system: single-user mode not supported");
else if (retval==NOMULTI)
log_sysmsg(" system: multi-user mode not supported");
else if (retval==PORTINUSE)
log_sysmsg(" system: port in use");
else if (retval==NOSOCKET)
log_sysmsg(" system: couldn't create socket");
else
log_sysmsg(" system: unspecified interface initialization error");
exit(0);
}
if (do_create) {
if (create_db()) {
log_sysmsg(" system: database creation failed");
shutdown_interface();
exit(0);
}
} else {
if (init_db()) {
log_sysmsg(" system: database initialization failed");
shutdown_interface();
exit(0);
}
}
log_sysmsg(" system: startup complete");
loop=0;
now_time=time2int(time(NULL));
tmp.type=NUM_ARGS;
tmp.value.num=0;
while (loop<db_top) {
obj=ref_to_obj(loop);
if (obj) {
if (obj->flags & CONNECTED) {
obj->flags&=~CONNECTED;
rts=NULL;
func=find_fns("disconnect",obj);
#ifdef CYCLE_HARD_MAX
hard_cycles=0;
#endif /* CYCLE_HARD_MAX */
#ifdef CYCLE_SOFT_MAX
soft_cycles=0;
#endif /* CYCLE_SOFT_MAX */
if (func) {
push(&tmp,&rts);
interp(NULL,obj,NULL,&rts,func);
free_stack(&rts);
}
handle_destruct();
}
}
handle_destruct();
loop++;
}
handle_input();
log_sysmsg(" system: return from handle_input()");
shutdown_interface();
exit(0);
}