X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/de24f12dacf2ccdecafd7284bd5a4084b37e562b..278dd826baa17b3db3189b74b0bfc2968dbd3435:/server/mr_scall.c diff --git a/server/mr_scall.c b/server/mr_scall.c index cb3ebe44..155e6b2d 100644 --- a/server/mr_scall.c +++ b/server/mr_scall.c @@ -4,53 +4,28 @@ * $Header$ * * Copyright (C) 1987 by the Massachusetts Institute of Technology + * For copying and distribution information, please see the file + * . * - * $Log$ - * Revision 1.10 1987-08-19 18:39:04 wesommer - * Added list_users query. - * - * Revision 1.9 87/08/04 02:41:22 wesommer - * Clean up messages. - * - * Revision 1.8 87/07/16 15:43:19 wesommer - * Fixed bug where the argv was not copied to private storage - * (it got changed out from under us before it got sent..). - * - * Revision 1.7 87/07/14 00:39:01 wesommer - * Rearranged loggin. - * - * Revision 1.6 87/06/30 20:04:43 wesommer - * Free returned tuples when possible. - * - * Revision 1.5 87/06/26 10:55:53 wesommer - * Added sms_access, now paiys attention to return code from - * sms_process_query, sms_check_access. - * - * Revision 1.4 87/06/21 16:42:00 wesommer - * Performance work, rearrangement of include files. - * - * Revision 1.3 87/06/04 01:35:01 wesommer - * Added a working query request handler. - * - * Revision 1.2 87/06/03 16:07:50 wesommer - * Fixes for lint. - * - * Revision 1.1 87/06/02 20:07:10 wesommer - * Initial revision - * */ #ifndef lint static char *rcsid_sms_scall_c = "$Header$"; #endif lint +#include +#include +#include +#include #include #include +#include "query.h" #include "sms_server.h" extern char buf1[]; extern int nclients; extern char *whoami; extern char *malloc(); +extern int errno; extern void clist_delete(), do_auth(), do_shutdown(); void do_call(); @@ -62,12 +37,24 @@ void do_client(cp) client *cp; { + struct stat stbuf; + free_rtn_tuples(cp); if (OP_STATUS(cp->pending_op) == OP_CANCELLED) { - com_err(whoami, 0, "Closed connection (now %d client%s)", + com_err(whoami, 0, "Closed connection (now %d client%s, %d new queries, %d old)", nclients-1, - nclients!=2?"s":""); + nclients!=2?"s":"", + newqueries, + oldqueries); clist_delete(cp); + /* if we no longer have any clients, and we're supposed to + * go down, then go down now. + */ + if ((dormant == AWAKE) && (nclients == 0) && + (stat(SMS_MOTD_FILE, &stbuf) == 0)) { + com_err(whoami, 0, "motd file exists, slumbertime"); + dormant = SLEEPY; + } return; } switch (cp->action) { @@ -98,6 +85,8 @@ char *procnames[] = { "shutdown", "query", "access", + "dcm", + "motd", }; @@ -108,6 +97,7 @@ do_call(cl) int pn; cl->reply.sms_argc = 0; cl->reply.sms_status = 0; + cl->reply.sms_version_no = cl->args->sms_version_no; if (((pn = cl->args->sms_procno) < 0) || (pn > SMS_MAX_PROC)) { com_err(whoami, 0, "procno out of range"); @@ -115,11 +105,19 @@ do_call(cl) return; } if (log_flags & LOG_ARGS) - log_args(procnames[pn], cl->args->sms_argc, - cl->args->sms_argv); + log_args(procnames[pn], cl->args->sms_version_no, + cl->args->sms_argc, cl->args->sms_argv); else if (log_flags & LOG_REQUESTS) com_err(whoami, 0, "%s", procnames[pn]); + if ((dormant == ASLEEP || dormant == GROGGY) && + pn != SMS_NOOP && pn != SMS_MOTD) { + cl->reply.sms_status = SMS_DOWN; + if (log_flags & LOG_RES) + com_err(whoami, SMS_DOWN, "(query refused)"); + return; + } + switch(pn) { case SMS_NOOP: cl->reply.sms_status = 0; @@ -140,6 +138,14 @@ do_call(cl) case SMS_SHUTDOWN: do_shutdown(cl); return; + + case SMS_DO_UPDATE: + trigger_dcm(0, 0, cl); + return; + + case SMS_MOTD: + get_motd(cl); + return; } } @@ -153,16 +159,6 @@ free_rtn_tuples(cp) if (t1 == cp->last) cp->last = NULL; sms_destroy_reply(t1->retval); -#ifdef notdef - if (t1->retval) { - register sms_params *p = t1->retval; - if (p->sms_flattened) - free(p->sms_flattened); - if (p->sms_argl) - free(p->sms_argl); - free(p); - } -#endif notdef delete_operation(t1->op); free(t1); } @@ -187,14 +183,18 @@ retr_callback(argc, argv, p_cp) OPERATION op_tmp = create_operation(); + if (sms_trim_args(argc, argv) == SMS_NO_MEM) { + com_err(whoami, SMS_NO_MEM, "while trimming args"); + } if (log_flags & LOG_RESP) - log_args("return: ", argc, argv); + log_args("return: ", cp->args->sms_version_no, argc, argv); tp->op = op_tmp; tp->retval = arg_tmp; tp->next = NULL; arg_tmp->sms_status = SMS_MORE_DATA; + arg_tmp->sms_version_no = cp->args->sms_version_no; arg_tmp->sms_argc = argc; arg_tmp->sms_argv = nargv; for (i = 0; i < argc; i++) { @@ -261,6 +261,11 @@ do_retr(cl) queryname = cl->args->sms_argv[0]; + if (cl->args->sms_version_no == SMS_VERSION_2) + newqueries++; + else + oldqueries++; + if (strcmp(queryname, "_list_users") == 0) cl->reply.sms_status = list_users(retr_callback, (char *)cl); else { @@ -289,3 +294,62 @@ do_access(cl) com_err(whoami, 0, "Access check complete."); } + + +/* trigger_dcm is also used as a followup routine to the + * set_server_host_override query, hence the two dummy arguments. + */ + +struct query pseudo_query = { + "trigger_dcm", + "tdcm", +}; + +trigger_dcm(dummy0, dummy1, cl) + int dummy0, dummy1; + client *cl; +{ + register int pid; + char prog[128]; + + cl->reply.sms_argc = 0; + + if (cl->reply.sms_status = check_query_access(&pseudo_query, 0, cl) ) + return(cl->reply.sms_status); + + sprintf(prog, "%s/startdcm", BIN_DIR); + pid = vfork(); + switch (pid) { + case 0: + for (dummy0 = getdtablesize() - 1; dummy0 > 2; dummy0--) + close(dummy0); + execl(prog, "startdcm", 0); + exit(1); + + case -1: + cl->reply.sms_status = errno; + return(0); + + default: + return(0); + } +} + + +get_motd(cl) +client *cl; +{ + int motd, len; + char buffer[1024]; + char *arg[1]; + + arg[0] = buffer; + cl->reply.sms_status = 0; + motd = open(SMS_MOTD_FILE, 0, O_RDONLY); + if (motd < 0) return; + len = read(motd, buffer, sizeof(buffer) - 1); + close(motd); + buffer[len] = 0; + retr_callback(1, arg, cl); + cl->reply.sms_status = 0; +}