]> andersk Git - moira.git/blobdiff - server/mr_scall.c
Allocate a new socket each time rather than keeping one around,
[moira.git] / server / mr_scall.c
index 7a28bc0a88e65a28c80112cf40108d9dc837124b..132f1c15001bc40d4755ea2a32e815edbe716714 100644 (file)
@@ -6,9 +6,16 @@
  *     Copyright (C) 1987 by the Massachusetts Institute of Technology
  *
  *     $Log$
- *     Revision 1.9  1987-08-04 02:41:22  wesommer
- *     Clean up messages.
+ *     Revision 1.11  1987-08-19 22:03:52  wesommer
+ *     Added the trigger_dcm function, which fires off a DCM to do the
+ *     update.
  *
+ * Revision 1.10  87/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..).
@@ -43,11 +50,13 @@ static char *rcsid_sms_scall_c = "$Header$";
 
 #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();
@@ -79,6 +88,8 @@ do_client(cp)
        case CL_RECEIVE:
                /* Data is here. Process it & start it heading back */
                do_call(cp); /* This may block for a while. */
+               sms_destroy_reply(cp->args);
+               cp->args = NULL;
                initialize_operation(cp->pending_op, sms_start_send,
                                     (char *)&cp->reply, (int (*)())NULL);
                queue_operation(cp->con, CON_OUTPUT, cp->pending_op);
@@ -135,6 +146,10 @@ do_call(cl)
        case SMS_SHUTDOWN:
                do_shutdown(cl);
                return;
+
+       case SMS_DO_UPDATE:
+               trigger_dcm(cl);
+               return;
        }
 }
 
@@ -213,20 +228,60 @@ retr_callback(argc, argv, p_cp)
        queue_operation(cp->con, CON_OUTPUT, op_tmp);
 }
 
+list_users(callbk, callarg)
+       int (*callbk)();
+       char *callarg;
+{
+       char *argv[6];
+       char buf[30];
+       char buf1[30];
+       int i;
+       extern client **clients;
+       extern char *inet_ntoa();
+       char *cp;
+       char *index();
+       char *ctime();
+
+       for (i = 0; i < nclients; i++) {
+               register client *cl = clients[i];
+               if (cl->clname) 
+                       argv[0] = cl->clname;
+               else argv[0] = "unauthenticated";
+               
+               argv[1] = inet_ntoa(cl->haddr.sin_addr);
+               argv[2] = buf;
+               sprintf(buf, "port %d", ntohs(cl->haddr.sin_port));
+               argv[3] = ctime(&cl->last_time_used);
+               cp = index(argv[3], '\n');
+               if (cp) *cp = '\0';
+               argv[4] = buf1;
+               sprintf(buf1, "[#%d]", cl->id);
+               (*callbk)(5, argv, callarg);
+       }
+       return 0;
+}
 
 do_retr(cl)
-       client *cl;
+       register client *cl;
 {
+       register char *queryname;
+
        cl->reply.sms_argc = 0;
        cl->reply.sms_status = 0;
 
-       cl->reply.sms_status = 
-         sms_process_query(cl,
-                           cl->args->sms_argv[0],
-                           cl->args->sms_argc-1,
-                           cl->args->sms_argv+1,
-                           retr_callback,
-                           (char *)cl);
+       queryname = cl->args->sms_argv[0];
+       
+       if (strcmp(queryname, "_list_users") == 0)
+               cl->reply.sms_status = list_users(retr_callback, (char *)cl);
+       else {
+               cl->reply.sms_status = 
+                       sms_process_query(cl,
+                                         cl->args->sms_argv[0],
+                                         cl->args->sms_argc-1,
+                                         cl->args->sms_argv+1,
+                                         retr_callback,
+                                         (char *)cl);
+       }
        if (log_flags & LOG_RES)
                com_err(whoami, 0, "Query complete.");
 }
@@ -244,3 +299,34 @@ do_access(cl)
        
        com_err(whoami, 0, "Access check complete.");
 }
+
+struct query pseudo_query = {
+       "trigger_dcm",
+       "tdcm",
+};
+
+trigger_dcm(cl)
+       client *cl;
+{
+       register int pid;
+       
+       cl->reply.sms_argc = 0;
+
+       if (cl->reply.sms_status = check_query_access(&pseudo_query, 0, cl) )
+               return;
+
+       pid = vfork();
+       switch (pid) {
+       case 0:
+               execl("/u1/sms/bin/dcm", "dcm", 0);
+               exit(1);
+               
+       case -1:
+               cl->reply.sms_status = errno;
+               return;
+
+       default:
+               return;
+       }
+}
+
This page took 0.179006 seconds and 4 git commands to generate.