* 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..).
#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();
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);
case SMS_SHUTDOWN:
do_shutdown(cl);
return;
+
+ case SMS_DO_UPDATE:
+ trigger_dcm(cl);
+ return;
}
}
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.");
}
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;
+ }
+}
+