extern char *takedown;
extern int errno;
extern FILE *journal;
-#define JOURNAL "/u1/sms/journal"
extern char *malloc();
extern int free();
gdb_debug(0); /* this can be patched, if necessary, to enable */
/* GDB level debugging .. */
krb_realm = malloc(REALM_SZ);
- get_krbrlm(krb_realm, 1);
+ krb_get_lrealm(krb_realm, 1);
/*
- * Database initialization.
+ * Database initialization. Only init if database should be open.
*/
- if ((status = sms_open_database()) != 0) {
+ if (stat(SMS_MOTD_FILE, &stbuf) != 0) {
+ if ((status = sms_open_database()) != 0) {
com_err(whoami, status, " when trying to open database.");
exit(1);
+ }
+ sanity_check_database();
+ } else {
+ dormant = ASLEEP;
+ com_err(whoami, 0, "sleeping, not opening database");
}
sanity_check_queries();
- sanity_check_database();
/*
* Set up client array handler.
nclients = 0;
clients = (client **) malloc(0);
- /*
- * Signal handlers
- * There should probably be a few more of these. This is
- * duplicated on the next page, be sure to also add any
- * additional handlers there.
- */
-
- if ((((int)signal (SIGTERM, sigshut)) < 0) ||
- (((int)signal (SIGCHLD, reapchild)) < 0) ||
- (((int)signal (SIGUSR1, godormant)) < 0) ||
- (((int)signal (SIGUSR2, gowakeup)) < 0) ||
- (((int)signal (SIGHUP, sigshut)) < 0)) {
- com_err(whoami, errno, " Unable to establish signal handlers.");
- exit(1);
- }
+ sms_setup_signals();
journal = fopen(JOURNAL, "a");
if (journal == NULL) {
com_err(whoami, 0, "started (pid %d)", getpid());
com_err(whoami, 0, rcsid_sms_main_c);
- send_zgram("SMS", "server started");
+ if (dormant != ASLEEP)
+ send_zgram("SMS", "server started");
+ else
+ send_zgram("SMS", "server started, but database closed");
/*
* Run until shut down.
if (dormant == SLEEPY) {
sms_close_database();
com_err(whoami, 0, "database closed");
+ sms_setup_signals();
send_zgram("SMS", "database closed");
dormant = ASLEEP;
} else if (dormant == GROGGY) {
sms_open_database();
com_err(whoami, 0, "database open");
- if ((((int)signal (SIGTERM, sigshut)) < 0) ||
- (((int)signal (SIGCHLD, reapchild)) < 0) ||
- (((int)signal (SIGUSR1, godormant)) < 0) ||
- (((int)signal (SIGUSR2, gowakeup)) < 0) ||
- (((int)signal (SIGHUP, sigshut)) < 0)) {
- com_err(whoami, errno,
- " Unable to reestablish signal handlers.");
- exit(1);
- }
+ sms_setup_signals();
send_zgram("SMS", "database open again");
dormant = AWAKE;
}
(fd_set *)NULL, (struct timeval *)NULL);
if (status == -1) {
- com_err(whoami, errno, " error from op_select");
+ if (errno != EINTR)
+ com_err(whoami, errno, " error from op_select");
continue;
} else if (status != -2) {
com_err(whoami, 0, " wrong return from op_select_any");
cp->con = newconn;
cp->id = counter++;
cp->args = NULL;
- cp->clname = NULL;
+ cp->clname[0] = NULL;
cp->reply.sms_argv = NULL;
cp->first = NULL;
cp->last = NULL;
union wait status;
int pid;
- if (takedown || dormant == ASLEEP)
- return;
while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
- if (status.w_termsig == 0 && status.w_retcode == 0)
- com_err(whoami, 0, "child exited successfully");
- else
+ 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);
}
}
dormant = GROGGY;
}
+
+
+sms_setup_signals()
+{
+ /* There should probably be a few more of these. */
+
+ if ((((int)signal (SIGTERM, sigshut)) < 0) ||
+ (((int)signal (SIGCHLD, reapchild)) < 0) ||
+ (((int)signal (SIGUSR1, godormant)) < 0) ||
+ (((int)signal (SIGUSR2, gowakeup)) < 0) ||
+ (((int)signal (SIGHUP, sigshut)) < 0)) {
+ com_err(whoami, errno, " Unable to establish signal handlers.");
+ exit(1);
+ }
+}