|
|
1.1 ! root 1: #include "mgr.h" ! 2: #include <ctype.h> ! 3: ! 4: /* ! 5: * routines used by actions ! 6: */ ! 7: int doconn(), doexec(), docmd(); ! 8: int auth(), v9auth(), inauth(); ! 9: int mesgld(), ttyld(); ! 10: int parms(), asuser(), term(); ! 11: int gateout(), gateway(); ! 12: ! 13: /* ! 14: * table of actions ! 15: * one per possible action ! 16: */ ! 17: ! 18: typedef struct { ! 19: char *name; /* as used in the services file */ ! 20: int (*func)(); /* function for this action */ ! 21: int flag; ! 22: } ProtoAction; ! 23: ! 24: #define TAKEARG 1 ! 25: #define NEEDARG 2 ! 26: #define IPCACCEPT 4 ! 27: ! 28: ProtoAction actions[] = { ! 29: { "login", doconn, 0 }, ! 30: { "exec", doexec, 0 }, ! 31: { "cmd", docmd, TAKEARG }, /* arg=command to exec */ ! 32: { "auth", auth, 0 }, ! 33: { "v9auth", v9auth, 0 }, ! 34: { "inauth", inauth, 0 }, ! 35: { "mesgld", mesgld, 0 }, ! 36: { "ttyld", ttyld, 0 }, ! 37: { "args", parms, 0 }, ! 38: { "term", term, TAKEARG }, ! 39: { "user", asuser, NEEDARG }, /* arg=user id */ ! 40: { "gateout", gateout, NEEDARG|IPCACCEPT }, /* arg=addr prefix */ ! 41: { "gateway", gateway, NEEDARG|IPCACCEPT }, /* arg=addr prefix */ ! 42: { NULL } ! 43: }; ! 44: ! 45: /* ! 46: * Parse a string for an action. Actions are of the form `xxx(yyy)'. ! 47: * `xxx' selects the action and `yyy' is the argument to the action. ! 48: */ ! 49: Action * ! 50: newaction(cp) ! 51: char *cp; ! 52: { ! 53: ProtoAction *pap; ! 54: Action *ap = (Action *)malloc(sizeof(Action)); ! 55: char *arg; ! 56: char *rp; ! 57: ! 58: if(ap==NULL) { ! 59: logevent("out of memory parsing action\n"); ! 60: return NULL; ! 61: } ! 62: ap->arg = NULL; ! 63: ! 64: /* find the xxx */ ! 65: for(; isspace(*cp); cp++) ! 66: ; ! 67: for(arg=cp; *arg && !isspace(*arg) && *arg!='('; arg++) ! 68: ; ! 69: ! 70: /* find the yyy */ ! 71: if(*arg=='(') { ! 72: rp = strrchr(arg, ')'); ! 73: if (rp == NULL) { ! 74: logevent("missing `)' in action `%s'\n", cp); ! 75: freeaction(ap); ! 76: return NULL; ! 77: } ! 78: *arg++ = '\0'; ! 79: for(; isspace(*arg); arg++) ! 80: ; ! 81: *rp = '\0'; ! 82: } else ! 83: arg = NULL; ! 84: ! 85: /* look for the action */ ! 86: for(pap=actions; pap->name!=NULL; pap++) { ! 87: if(strcmp(pap->name, cp)==0) { ! 88: if(pap->flag&NEEDARG && arg==NULL) { ! 89: logevent("missing arg in action `%s'\n", cp); ! 90: freeaction(ap); ! 91: return NULL; ! 92: } ! 93: if(arg!=NULL && !pap->flag&TAKEARG) { ! 94: logevent("expected no arg in action `%s'\n", cp); ! 95: freeaction(ap); ! 96: return NULL; ! 97: } ! 98: ap->func = pap->func; ! 99: if (arg == NULL) ! 100: ap->arg = NULL; ! 101: else ! 102: ap->arg = strdup(arg); ! 103: ap->accept = pap->flag&IPCACCEPT; ! 104: return ap; ! 105: } ! 106: } ! 107: logevent("unknown action `%s'\n", cp); ! 108: return NULL; ! 109: } ! 110: ! 111: freeaction(ap) ! 112: Action *ap; ! 113: { ! 114: if (ap==(Action *)NULL) ! 115: return; ! 116: if (ap->arg!=NULL) ! 117: free(ap->arg); ! 118: free((char *)ap); ! 119: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.