]> andersk Git - moira.git/blobdiff - server/mr_scall.c
added sms_untar
[moira.git] / server / mr_scall.c
index cb3ebe44b83014603d743eae01a5863bc6c690ac..c2da9c59e72794a20059c32b5d7abd6e5d6e898a 100644 (file)
@@ -4,53 +4,25 @@
  *     $Header$
  *
  *     Copyright (C) 1987 by the Massachusetts Institute of Technology
+ *     For copying and distribution information, please see the file
+ *     <mit-copyright.h>.
  *
- *     $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 <mit-copyright.h>
 #include <krb.h>
 #include <errno.h>
+#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();
@@ -64,9 +36,11 @@ do_client(cp)
 {
        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);
                return;
        }
@@ -108,6 +82,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,8 +90,8 @@ 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]);
 
@@ -140,6 +115,10 @@ do_call(cl)
        case SMS_SHUTDOWN:
                do_shutdown(cl);
                return;
+
+       case SMS_DO_UPDATE:
+               trigger_dcm(0, 0, cl);
+               return;
        }
 }
 
@@ -153,16 +132,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 +156,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 +234,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 +267,40 @@ 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;
+       
+       cl->reply.sms_argc = 0;
+
+       if (cl->reply.sms_status = check_query_access(&pseudo_query, 0, cl) )
+               return(cl->reply.sms_status);
+
+       pid = vfork();
+       switch (pid) {
+       case 0:
+               execl("/u1/sms/bin/startdcm", "startdcm", 0);
+               exit(1);
+               
+       case -1:
+               cl->reply.sms_status = errno;
+               return(0);
+
+       default:
+               return(0);
+       }
+}
+
This page took 0.037775 seconds and 4 git commands to generate.