-/*
- * Welcome to the (finite state) machine (highest level).
- */
-do_client(cp)
- client *cp;
-{
- if (OP_STATUS(cp->pending_op) == OP_CANCELLED) {
- sprintf(buf1, "Closed connection (now %d client%s)",
- nclients-1,
- nclients!=2?"s":"");
- com_err(whoami, 0, buf1);
- clist_delete(cp);
- return;
- }
- switch (cp->action) {
- case CL_ACCEPT:
- case CL_SEND:
- /* Start recieving next request */
- gdb_inop(cp->pending_op, sms_start_recv, &cp->args, NULL);
- gdb_qop(cp->con, CON_INPUT, cp->pending_op);
- cp->action = CL_RECEIVE;
- break;
- case CL_RECEIVE:
- /* Data is here. Process it & start it heading back */
- do_call(cp); /* This may block for a while. */
- gdb_inop(cp->pending_op, sms_start_send, &cp->reply, NULL);
- gdb_qop(cp->con, CON_OUTPUT, cp->pending_op);
- cp->action = CL_SEND;
- break;
- }
-}
-
-char *procnames[] = {
- "noop",
- "auth",
- "shutdown",
- "retrieve",
- "append",
- "delete",
- "edit",
- };
-
-do_call(cl)
- client *cl;
-{
- int pn, i;
- cl->reply.sms_argc = 0;
- if (((pn = cl->args->sms_procno) < 0) ||
- (pn > SMS_MAX_PROC)) {
- com_err(whoami, 0, "procno out of range");
- cl->reply.sms_status = SMS_UNKNOWN_PROC;
- return;
- }
-#ifdef SMS_DBG
- fprintf(stderr, "[#%d] %s(", cl->id, procnames[pn]);
- for (i=0; i < cl->args->sms_argc; i++) {
- if (i) fputc(',', stderr);
- frequote(stderr,cl->args->sms_argv[i]);
- }
- fprintf(stderr, ")\n");
-#endif SMS_DBG
-
- switch(pn) {
- case SMS_NOOP:
- cl->reply.sms_status = 0;
- com_err(whoami, 0, "noop");
- return;
- case SMS_AUTH:
- do_auth(cl);
- return;
-#ifdef notdef
- case SMS_RETRIEVE:
- do_retr(cl);
- return;
-#endif notdef
-
- case SMS_SHUTDOWN:
- do_shutdown(cl);
- return;
- }
-}
-
-do_shutdown(cl)
- client *cl;
-{
- static char buf[BUFSIZ];
-
- if (cl->args->sms_argc != 1) {
- cl->reply.sms_status = EINVAL;
- return;
- }
-
- if (!cl->clname) {
- sprintf(buf, "Unauthenticated shutdown request rejected",
- cl->clname);
- com_err(whoami, 0, buf);
- cl->reply.sms_status = EACCES;
- return;
- }
- if (!strcmp(cl->clname, "wesommer@ATHENA.MIT.EDU") ||
- !strcmp(cl->clname, "mike@ATHENA.MIT.EDU")) {
- sprintf(buf, "Shut down by %s", cl->clname);
- com_err(whoami, 0, buf);
- strcpy(buf, "Reason for shutdown: ");
- strcat(buf, cl->args->sms_argv[0]);
- takedown = buf;
- } else {
- sprintf(buf, "Shutdown request by %s rejected",
- cl->clname);
- com_err(whoami, 0, buf);
- cl->reply.sms_status = EACCES;
- }
-}
-
-
-do_auth(cl)
- client *cl;
-{
- KTEXT_ST auth;
- AUTH_DAT ad;
- int status;
- char buf[REALM_SZ+INST_SZ+ANAME_SZ];
- extern int krb_err_base;
-
- auth.length = cl->args->sms_argl[0];
- bcopy(cl->args->sms_argv[0], auth.dat, auth.length);
- auth.mbz = 0;
-
- if ((status = rd_ap_req (&auth, "sms", "sms", cl->haddr.sin_addr,
- &ad, "")) != KSUCCESS) {
- status += krb_err_base;
- cl->reply.sms_status = status;
- com_err(whoami, status, "(authentication failed)");
- return;
- }
- strcpy(buf, ad.pname);
- if(ad.pinst[0]) {
- strcat(buf, ".");
- strcat(buf, ad.pinst);
- }
- strcat(buf, "@");
- strcat(buf, ad.prealm);
- if (cl->clname) free((char *)cl->clname);
-
- cl->clname = (char *)malloc(strlen(buf)+1);
- strcpy(cl->clname, buf);
- sprintf(buf1, "Authenticated to %s", cl->clname);
- com_err(whoami, 0, buf1);
-}
-
-do_retr(cl)
- client *cl;
-{
-
-}