|
|
1.1 ! root 1: #include "mgr.h" ! 2: ! 3: Mapping *maphead; ! 4: Mapping *maptail; ! 5: ! 6: /* ! 7: * Create a new mapping from a string. The mapping is of the form: ! 8: * `service-re source-re olduser-re newuser-exp' ! 9: */ ! 10: Mapping * ! 11: newmap(cp) ! 12: char *cp; ! 13: { ! 14: Mapping *mp = (Mapping *)malloc(sizeof(Mapping)); ! 15: # define FIELDS 4 ! 16: char *fields[FIELDS]; ! 17: int n; ! 18: ! 19: if(mp==NULL) { ! 20: logevent("out of memory allocating mapping\n"); ! 21: return NULL; ! 22: } ! 23: mp->user = mp->from = mp->serv = NULL; ! 24: mp->luser = NULL; ! 25: setfields(" \t"); ! 26: n = getmfields(cp, fields, FIELDS); ! 27: switch(n) { ! 28: case 0: ! 29: freemap(mp); ! 30: return NULL; ! 31: case 1: ! 32: fields[1] = ""; ! 33: case 2: ! 34: fields[2] = ".*"; ! 35: case 3: ! 36: fields[3] = "&"; ! 37: break; ! 38: case 4: ! 39: break; ! 40: default: ! 41: logevent("incorrect number of fields in mapping %s\n", fields[0]); ! 42: freemap(mp); ! 43: return NULL; ! 44: } ! 45: if((mp->serv=nregcomp(fields[0]))==NULL ! 46: || (mp->from=nregcomp(fields[1]))==NULL ! 47: || (mp->user=nregcomp(fields[2]))==NULL) { ! 48: logevent("illegal reg exp in mapping `%s %s %s %s'\n", fields[0], ! 49: fields[1], fields[2], fields[3]); ! 50: freemap(mp); ! 51: return NULL; ! 52: } ! 53: mp->luser = strdup(fields[3]); ! 54: logevent("newmap(%s %s %s %s)\n", fields[0], fields[1], fields[2], fields[3]); ! 55: return mp; ! 56: } ! 57: ! 58: freemap(mp) ! 59: Mapping *mp; ! 60: { ! 61: if(mp==NULL) ! 62: return; ! 63: if(mp->from) ! 64: free((char *)mp->from); ! 65: if(mp->serv) ! 66: free((char *)mp->serv); ! 67: if(mp->user) ! 68: free((char *)mp->user); ! 69: if(mp->luser) ! 70: free(mp->luser); ! 71: } ! 72: ! 73: /* ! 74: * add a map entry ! 75: */ ! 76: addmap(mp) ! 77: Mapping *mp; ! 78: { ! 79: mp->next = NULL; ! 80: if(maphead==NULL) ! 81: maphead = mp; ! 82: else ! 83: maptail->next = mp; ! 84: maptail = mp; ! 85: } ! 86: ! 87: /* ! 88: * free all map entries ! 89: */ ! 90: resetmaps() ! 91: { ! 92: Mapping *mp, *nxt; ! 93: ! 94: logevent("resetmaps()\n"); ! 95: for(mp=maphead; mp; mp=nxt) { ! 96: nxt = mp->next; ! 97: freemap(mp); ! 98: } ! 99: maphead = maptail = NULL; ! 100: } ! 101: ! 102: /* ! 103: * return a new user id for call ! 104: */ ! 105: char * ! 106: mapuser(service, source, user) ! 107: char *service; ! 108: char *source; ! 109: char *user; ! 110: { ! 111: Mapping *mp; ! 112: regsubexp sub[10]; ! 113: static char luser[ARB]; ! 114: ! 115: for(mp=maphead; mp; mp=mp->next) { ! 116: if(!regexec(mp->serv, service, 0, 0)) ! 117: continue; ! 118: if(!regexec(mp->from, source, 0, 0)) ! 119: continue; ! 120: if(!regexec(mp->user, user, sub, 10)) ! 121: continue; ! 122: regsub(mp->luser, luser, sub, 10); ! 123: return luser; ! 124: } ! 125: return NULL; ! 126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.