|
|
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=newre(fields[0]))==NULL
46: || (mp->from=newre(fields[1]))==NULL
47: || (mp->user=newre(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", mp->serv->re, mp->from->re,
55: mp->user->re, mp->luser);
56: return mp;
57: }
58:
59: freemap(mp)
60: Mapping *mp;
61: {
62: if(mp==NULL)
63: return;
64: if(mp->from)
65: freere(mp->from);
66: if(mp->serv)
67: freere(mp->serv);
68: if(mp->user)
69: freere(mp->user);
70: if(mp->luser)
71: free(mp->luser);
72: }
73:
74: /*
75: * add a map entry
76: */
77: addmap(mp)
78: Mapping *mp;
79: {
80: mp->next = NULL;
81: if(maphead==NULL)
82: maphead = mp;
83: else
84: maptail->next = mp;
85: maptail = mp;
86: }
87:
88: /*
89: * free all map entries
90: */
91: resetmaps()
92: {
93: Mapping *mp, *nxt;
94:
95: logevent("resetmaps()\n");
96: for(mp=maphead; mp; mp=nxt) {
97: nxt = mp->next;
98: freemap(mp);
99: }
100: maphead = maptail = NULL;
101: }
102:
103: /*
104: * return a new user id for call
105: */
106: char *
107: mapuser(service, source, user)
108: char *service;
109: char *source;
110: char *user;
111: {
112: Mapping *mp;
113: regsubexp sub[10];
114: static char luser[ARB];
115:
116: for(mp=maphead; mp; mp=mp->next) {
117: if(!execre(mp->serv, service, (regsubexp *)0, 0))
118: continue;
119: if(!execre(mp->from, source, (regsubexp *)0, 0))
120: continue;
121: if(!execre(mp->user, user, sub, 10))
122: continue;
123: regsub(mp->luser, luser, sub, 10);
124: return luser;
125: }
126: return NULL;
127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.