1 #include "logfsos.h" 2 #include "logfs.h" 3 #include "local.h" 4 5 enum { 6 GROUPMOD = 127 7 }; 8 9 static int 10 groupcompare(void *a, void *b) 11 { 12 Group *g = a; 13 char *uid = b; 14 return g->uid == uid; 15 } 16 17 static int 18 unamecompare(void *a, void *b) 19 { 20 Uname *u = a; 21 char *uname = b; 22 return u->uname == uname; 23 } 24 25 static int 26 groupallocsize(void *key) 27 { 28 USED(key); 29 return sizeof(Group); 30 } 31 32 static int 33 unameallocsize(void *key) 34 { 35 USED(key); 36 return sizeof(Uname); 37 } 38 39 char * 40 logfsgroupmapnew(GroupMap **groupmapp, UnameMap **unamemapp) 41 { 42 char *errmsg; 43 errmsg = logfsmapnew(GROUPMOD, logfshashulong, groupcompare, groupallocsize, nil, groupmapp); 44 if(errmsg) 45 return errmsg; 46 errmsg = logfsmapnew(GROUPMOD, logfshashulong, unamecompare, unameallocsize, nil, unamemapp); 47 if(errmsg) 48 logfsmapfree(groupmapp); 49 return errmsg; 50 } 51 52 char * 53 logfsgroupmapnewentry(GroupMap *gm, UnameMap *um, char *uid, char *uname, Group **groupp, Uname **unamep) 54 { 55 char *errmsg; 56 errmsg = logfsmapnewentry(gm, uid, groupp); 57 if(errmsg) 58 return errmsg; 59 if(*groupp == nil) 60 return "uid already exists"; 61 (*groupp)->uid = uid; 62 errmsg = logfsgroupsetnew(&(*groupp)->members); 63 if(errmsg) { 64 logfsmapdeleteentry(gm, uid); 65 return errmsg; 66 } 67 errmsg = logfsmapnewentry(um, uname, unamep); 68 if(errmsg == nil && *unamep == nil) 69 errmsg = "uname already exists"; 70 if(errmsg) { 71 logfsgroupsetfree(&(*groupp)->members); 72 logfsmapdeleteentry(gm, uid); 73 return errmsg; 74 } 75 (*groupp)->uname = uname; 76 (*unamep)->uname = uname; 77 (*unamep)->g = *groupp; 78 return nil; 79 } 80 81 char * 82 logfsgroupmapfinduname(GroupMap *m, char *uid) 83 { 84 Group *g; 85 g = logfsgroupmapfindentry(m, uid); 86 if(g) 87 return g->uname; 88 return nil; 89 } 90 91 char * 92 logfsunamemapfinduid(UnameMap *m, char *uname) 93 { 94 Uname *u; 95 u = logfsunamemapfindentry(m, uname); 96 if(u) 97 return u->g->uid; 98 return nil; 99 } 100