1 #include "logfsos.h" 2 #include "logfs.h" 3 #include "local.h" 4 5 struct GroupSet { 6 int maxentries; 7 int nentries; 8 Group **entry; 9 }; 10 11 char * 12 logfsgroupsetnew(GroupSet **gsp) 13 { 14 GroupSet *gs = logfsrealloc(nil, sizeof(*gs)); 15 if(gs == nil) 16 return Enomem; 17 gs->entry = logfsrealloc(nil, sizeof(Group *)); 18 if(gs->entry == nil) { 19 logfsfreemem(gs); 20 return Enomem; 21 } 22 gs->maxentries = 1; /* most groups have one member */ 23 gs->nentries = 0; 24 *gsp = gs; 25 return nil; 26 } 27 28 void 29 logfsgroupsetfree(GroupSet **gsp) 30 { 31 GroupSet *gs = *gsp; 32 if(gs) { 33 logfsfreemem(gs->entry); 34 logfsfreemem(gs); 35 *gsp = nil; 36 } 37 } 38 39 int 40 logfsgroupsetadd(GroupSet *gs, Group *g) 41 { 42 int x; 43 for(x = 0; x < gs->nentries; x++) 44 if(gs->entry[x] == g) 45 return 1; 46 if(gs->nentries >= gs->maxentries) { 47 Group **ne = logfsrealloc(gs->entry, sizeof(Group*)*(gs->maxentries * 2)); 48 if(ne == nil) 49 return 0; 50 gs->entry = ne; 51 gs->maxentries *= 2; 52 } 53 gs->entry[gs->nentries++] = g; 54 return 1; 55 } 56 57 int 58 logfsgroupsetremove(GroupSet *gs, Group *g) 59 { 60 int x; 61 for(x = 0; x < gs->nentries; x++) 62 if(gs->entry[x] == g) 63 break; 64 if(x == gs->nentries) 65 return 0; 66 gs->nentries--; 67 memmove(&gs->entry[x], &gs->entry[x + 1], sizeof(Group *) * (gs->nentries - x)); 68 return 1; 69 } 70 71 int 72 logfsgroupsetwalk(GroupSet *gs, LOGFSGROUPSETWALKFN *func, void *magic) 73 { 74 int x; 75 for(x = 0; x < gs->nentries; x++) { 76 int rv = (*func)(magic, gs->entry[x]); 77 if(rv <= 0) 78 return rv; 79 } 80 return 1; 81 } 82 83 int 84 logfsgroupsetismember(GroupSet *gs, Group *g) 85 { 86 int x; 87 for(x = 0; x < gs->nentries; x++) 88 if(gs->entry[x] == g) 89 return 1; 90 return 0; 91 } 92