X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/185f76cef404f3469b2ce23be69fdd9edc2b8f7b..4e82e7cac76280026adbe913d5cedb7e54cfb41d:/server/mr_main.c diff --git a/server/mr_main.c b/server/mr_main.c index 4a9c2ced..704a57a7 100644 --- a/server/mr_main.c +++ b/server/mr_main.c @@ -7,7 +7,7 @@ * For copying and distribution information, please see the file * . * - * SMS server process. + * MOIRA server process. * * Most of this is stolen from ../gdb/tsr.c * @@ -16,7 +16,7 @@ * */ -static char *rcsid_sms_main_c = "$Header$"; +static char *rcsid_mr_main_c = "$Header$"; #include #include @@ -25,7 +25,7 @@ static char *rcsid_sms_main_c = "$Header$"; #include #include #include -#include "sms_server.h" +#include "mr_server.h" #include extern CONNECTION newconn, listencon; @@ -46,10 +46,8 @@ extern char *takedown; extern int errno; extern FILE *journal; -extern char *malloc(); -extern int free(); extern char *inet_ntoa(); -extern void sms_com_err(); +extern void mr_com_err(); extern void do_client(); extern int sigshut(); @@ -59,8 +57,13 @@ void reapchild(), godormant(), gowakeup(); extern time_t now; +#ifdef _DEBUG_MALLOC_INC +static char *dbg_malloc(); +static int dbg_free(); +#endif + /* - * Main SMS server loop. + * Main MOIRA server loop. * * Initialize the world, then start accepting connections and * making progress on current connections. @@ -72,8 +75,10 @@ main(argc, argv) int argc; char **argv; { - int status; + int status, i; time_t tardy; + char *port; + extern char *database; struct stat stbuf; whoami = argv[0]; @@ -82,19 +87,36 @@ main(argc, argv) */ initialize_sms_error_table(); initialize_krb_error_table(); - set_com_err_hook(sms_com_err); + initialize_gdss_error_table(); + set_com_err_hook(mr_com_err); setlinebuf(stderr); - if (argc != 1) { - com_err(whoami, 0, "Usage: smsd"); + database = "moira"; + port = index(MOIRA_SERVER, ':') + 1; + + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-db") && i+1 < argc) { + database = argv[i+1]; + i++; + } else if (!strcmp(argv[i], "-p") && i+1 < argc) { + port = argv[i+1]; + i++; + } else { + com_err(whoami, 0, "Usage: moirad [-db database][-p port]"); exit(1); - } + } + } /* Profiling implies that getting rid of one level of call * indirection here wins us maybe 1% on the VAX. */ +#ifdef _DEBUG_MALLOC_INC + gdb_amv = dbg_malloc; + gdb_fmv = dbg_free; +#else gdb_amv = malloc; - gdb_fmv = free; + gdb_fmv = (int (*)()) free; +#endif /* * GDB initialization. @@ -112,8 +134,8 @@ main(argc, argv) * Database initialization. Only init if database should be open. */ - if (stat(SMS_MOTD_FILE, &stbuf) != 0) { - if ((status = sms_open_database()) != 0) { + if (stat(MOIRA_MOTD_FILE, &stbuf) != 0) { + if ((status = mr_open_database()) != 0) { com_err(whoami, status, " when trying to open database."); exit(1); } @@ -131,7 +153,7 @@ main(argc, argv) nclients = 0; clients = (client **) malloc(0); - sms_setup_signals(); + mr_setup_signals(); journal = fopen(JOURNAL, "a"); if (journal == NULL) { @@ -142,7 +164,7 @@ main(argc, argv) /* * Establish template connection. */ - if ((status = do_listen()) != 0) { + if ((status = do_listen(port)) != 0) { com_err(whoami, status, " while trying to create listening connection"); exit(1); @@ -151,11 +173,11 @@ main(argc, argv) op_list = create_list_of_operations(1, listenop); com_err(whoami, 0, "started (pid %d)", getpid()); - com_err(whoami, 0, rcsid_sms_main_c); + com_err(whoami, 0, rcsid_mr_main_c); if (dormant != ASLEEP) - send_zgram("SMS", "server started"); + send_zgram("MOIRA", "server started"); else - send_zgram("SMS", "server started, but database closed"); + send_zgram("MOIRA", "server started, but database closed"); /* * Run until shut down. @@ -169,16 +191,16 @@ main(argc, argv) com_err(whoami, 0, "tick"); #endif notdef if (dormant == SLEEPY) { - sms_close_database(); + mr_close_database(); com_err(whoami, 0, "database closed"); - sms_setup_signals(); - send_zgram("SMS", "database closed"); + mr_setup_signals(); + send_zgram("MOIRA", "database closed"); dormant = ASLEEP; } else if (dormant == GROGGY) { - sms_open_database(); + mr_open_database(); com_err(whoami, 0, "database open"); - sms_setup_signals(); - send_zgram("SMS", "database open again"); + mr_setup_signals(); + send_zgram("MOIRA", "database open again"); dormant = AWAKE; } @@ -190,6 +212,8 @@ main(argc, argv) if (status == -1) { if (errno != EINTR) com_err(whoami, errno, " error from op_select"); + if (!inc_running || now - inc_started > INC_TIMEOUT) + next_incremental(); continue; } else if (status != -2) { com_err(whoami, 0, " wrong return from op_select_any"); @@ -197,6 +221,8 @@ main(argc, argv) } if (takedown) break; time(&now); + if (!inc_running || now - inc_started > INC_TIMEOUT) + next_incremental(); #ifdef notdef fprintf(stderr, " tick\n"); #endif notdef @@ -209,9 +235,11 @@ main(argc, argv) if (errno == EWOULDBLOCK) { do_reset_listen(); } else { + static int count = 0; com_err(whoami, errno, - " error on listen"); - exit(1); + " error (%d) on listen", count); + if (count++ > 10) + exit(1); } } else if ((status = new_connection()) != 0) { com_err(whoami, errno, @@ -225,7 +253,7 @@ main(argc, argv) * down now. */ if ((dormant == AWAKE) && (nclients == 1) && - (stat(SMS_MOTD_FILE, &stbuf) == 0)) { + (stat(MOIRA_MOTD_FILE, &stbuf) == 0)) { com_err(whoami, 0, "motd file exists, slumbertime"); dormant = SLEEPY; } @@ -233,7 +261,7 @@ main(argc, argv) * to be down, then wake up. */ if ((dormant == ASLEEP) && - (stat(SMS_MOTD_FILE, &stbuf) == -1) && + (stat(MOIRA_MOTD_FILE, &stbuf) == -1) && (errno == ENOENT)) { com_err(whoami, 0, "motd file no longer exists, waking up"); dormant = GROGGY; @@ -259,8 +287,8 @@ main(argc, argv) } } com_err(whoami, 0, "%s", takedown); - sms_close_database(); - send_zgram("SMS", takedown); + mr_close_database(); + send_zgram("MOIRA", takedown); return 0; } @@ -269,11 +297,10 @@ main(argc, argv) */ int -do_listen() +do_listen(port) +char *port; { - char *service = index(SMS_GDB_SERV, ':') + 1; - - listencon = create_listening_connection(service); + listencon = create_listening_connection(port); if (listencon == NULL) return errno; @@ -315,7 +342,7 @@ new_connection() } if (newconn == NULL) { - return SMS_NOT_CONNECTED; + return MR_NOT_CONNECTED; } /* @@ -328,7 +355,7 @@ new_connection() cp->id = counter++; cp->args = NULL; cp->clname[0] = NULL; - cp->reply.sms_argv = NULL; + cp->reply.mr_argv = NULL; cp->first = NULL; cp->last = NULL; cp->last_time_used = now; @@ -477,6 +504,8 @@ void reapchild() int pid; while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) { + if (pid == inc_pid) + inc_running = 0; if (!takedown && (status.w_termsig != 0 || status.w_retcode != 0)) com_err(whoami, 0, "%d: child exits with signal %d status %d", pid, status.w_termsig, status.w_retcode); @@ -518,7 +547,7 @@ void gowakeup() } -sms_setup_signals() +mr_setup_signals() { /* There should probably be a few more of these. */ @@ -531,3 +560,19 @@ sms_setup_signals() exit(1); } } + +#ifdef _DEBUG_MALLOC_INC +static char *dbg_malloc(size) + SIZETYPE size; +{ + return( debug_malloc("somewhere in the gdb code",1,size) ); +} + +static int dbg_free(cptr) + DATATYPE *cptr; +{ + debug_free((char *)NULL, 0, cptr); + return 0; /* GDB is being stupid */ +} +#endif +