|
|
1.1 ! root 1: /* ! 2: * make userid and groupid maps ! 3: * combine the client ids sent by setup ! 4: * with the server ids left around by the user code ! 5: */ ! 6: ! 7: #include <ctype.h> ! 8: #include "rf.h" ! 9: #include "perm.h" ! 10: ! 11: #define NULL 0 ! 12: ! 13: Idmap *rfuidmap, *rfgidmap; ! 14: ! 15: char *defaultuser = 0; ! 16: char *defaultgroup = 0; ! 17: ! 18: int defaultuid = RFNOID; ! 19: int defaultgid = RFNOID; ! 20: ! 21: static int mapbuild(); ! 22: static char *getpair(); ! 23: ! 24: extern char *malloc(), *realloc(); ! 25: ! 26: _rfmapuid(rbuf) ! 27: char *rbuf; ! 28: { ! 29: static int nuids; ! 30: ! 31: if (defaultuser) ! 32: defaultuid = _rflookid(rfuidmap, defaultuser); ! 33: if (mapbuild(rbuf, rfuidmap, &_rfuids, &nuids, defaultuser) == 0) ! 34: return (0); ! 35: _rfmkhash(_rfuids, nuids, &_rfuhp, &_rfcu, &_rfsu); ! 36: return (1); ! 37: } ! 38: ! 39: _rfmapgid(rbuf) ! 40: char *rbuf; ! 41: { ! 42: static int ngids; ! 43: ! 44: if (defaultgroup) ! 45: defaultgid = _rflookid(rfgidmap, defaultgroup); ! 46: if (mapbuild(rbuf, rfgidmap, &_rfgids, &ngids, defaultgroup) == 0) ! 47: return (0); ! 48: _rfmkhash(_rfgids, ngids, &_rfghp, &_rfcg, &_rfsg); ! 49: return (1); ! 50: } ! 51: ! 52: /* ! 53: * combine server names and ids (locmap) ! 54: * with client names and ids (rdata) ! 55: * to make an id-id map (returned, length in *lsize) ! 56: * return nonzero if this was the last buffer, ! 57: * zero if more data are expected. If the remote name ! 58: * doesn't map to a local name, and defaultlocal is non-zero, ! 59: * map it to the defaultlocal name. ! 60: */ ! 61: static int ! 62: mapbuild(rdata, locmap, lmap, lsize, defaultlocal) ! 63: char *rdata; ! 64: Idmap *locmap; ! 65: Tuid **lmap; ! 66: int *lsize; ! 67: char *defaultlocal; ! 68: { ! 69: char *cname; ! 70: char *p; ! 71: int cid, sid; ! 72: Tuid *map; ! 73: register Tuid *cur, *last; ! 74: int size; ! 75: int curoff; ! 76: Idmap nilmap; ! 77: int done; ! 78: ! 79: if (locmap == NULL) { ! 80: locmap = &nilmap; ! 81: nilmap.name[0] = 0; ! 82: } ! 83: if ((size = *lsize) != 0) { /* already started */ ! 84: map = *lmap; ! 85: cur = &map[size]; ! 86: while (--cur >= map && cur->sid == RFNOID) ! 87: ; ! 88: cur++; /* point to first unused slot */ ! 89: } else { ! 90: size = 100; /* too big for groups, but too bad */ ! 91: if ((map = (Tuid *)malloc(size * sizeof(Tuid))) == NULL) ! 92: rfpanic("out of memory making id map\n"); ! 93: cur = map; ! 94: } ! 95: last = &map[size-1]; ! 96: p = rdata; ! 97: done = 1; /* assume we'll get whole buffer */ ! 98: while ((p = getpair(p, &cname, &cid)) != NULL) { ! 99: if (cname[0] == 0 || cid == RFNOID) ! 100: continue; ! 101: if (cname[0] == ':' && cname[1] == 0) { /* continuation mark */ ! 102: done = 0; ! 103: break; ! 104: } ! 105: if ((sid = _rflookid(locmap, cname)) == RFNOID) ! 106: #ifdef notdef ! 107: if (defaultlocal == 0 || ! 108: (sid = _rflookid(locmap, defaultlocal)) == RFNOID) ! 109: #endif ! 110: continue; ! 111: if (cur >= last) { ! 112: curoff = cur - map; ! 113: size += 100; ! 114: if ((map = (Tuid *)realloc((char *)map, size*sizeof(Tuid))) == NULL) ! 115: rfpanic("out of memory making id map\n"); ! 116: last = &map[size-1]; ! 117: cur = &map[curoff]; ! 118: } ! 119: cur->sid = sid; ! 120: cur->cid = cid; ! 121: cur++; ! 122: } ! 123: cur->sid = cur->cid = RFNOID; /* end marker */ ! 124: if (done == 0) { /* i don't especially like this */ ! 125: for (cur++; cur <= last; cur++) ! 126: cur->sid = RFNOID; ! 127: /* now (cur-map) == size == allocated size */ ! 128: } ! 129: *lsize = cur - map; ! 130: *lmap = map; ! 131: return (done); ! 132: } ! 133: ! 134: static char * ! 135: getpair(line, pname, pnum) ! 136: char *line; ! 137: char **pname; ! 138: int *pnum; ! 139: { ! 140: register char *p; ! 141: ! 142: p = line; ! 143: while (isspace(*p)) ! 144: p++; ! 145: *pname = p; ! 146: while (!isspace(*p)) { ! 147: if (*p == '\n' || *p == 0) ! 148: return (NULL); ! 149: p++; ! 150: } ! 151: while (isspace(*p)) ! 152: *p++ = 0; ! 153: *pnum = atoi(p); ! 154: if (*p == '-' || *p == '+') /* well ... */ ! 155: p++; ! 156: while (isdigit(*p)) ! 157: p++; ! 158: if (*p != '\n') ! 159: return (NULL); ! 160: return (p+1); ! 161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.