12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include "logfsos.h"
- #include "logfs.h"
- #include "local.h"
- struct GroupSet {
- int maxentries;
- int nentries;
- Group **entry;
- };
- char *
- logfsgroupsetnew(GroupSet **gsp)
- {
- GroupSet *gs = logfsrealloc(nil, sizeof(*gs));
- if(gs == nil)
- return Enomem;
- gs->entry = logfsrealloc(nil, sizeof(Group *));
- if(gs->entry == nil) {
- logfsfreemem(gs);
- return Enomem;
- }
- gs->maxentries = 1; /* most groups have one member */
- gs->nentries = 0;
- *gsp = gs;
- return nil;
- }
- void
- logfsgroupsetfree(GroupSet **gsp)
- {
- GroupSet *gs = *gsp;
- if(gs) {
- logfsfreemem(gs->entry);
- logfsfreemem(gs);
- *gsp = nil;
- }
- }
- int
- logfsgroupsetadd(GroupSet *gs, Group *g)
- {
- int x;
- for(x = 0; x < gs->nentries; x++)
- if(gs->entry[x] == g)
- return 1;
- if(gs->nentries >= gs->maxentries) {
- Group **ne = logfsrealloc(gs->entry, sizeof(Group*)*(gs->maxentries * 2));
- if(ne == nil)
- return 0;
- gs->entry = ne;
- gs->maxentries *= 2;
- }
- gs->entry[gs->nentries++] = g;
- return 1;
- }
- int
- logfsgroupsetremove(GroupSet *gs, Group *g)
- {
- int x;
- for(x = 0; x < gs->nentries; x++)
- if(gs->entry[x] == g)
- break;
- if(x == gs->nentries)
- return 0;
- gs->nentries--;
- memmove(&gs->entry[x], &gs->entry[x + 1], sizeof(Group *) * (gs->nentries - x));
- return 1;
- }
- int
- logfsgroupsetwalk(GroupSet *gs, LOGFSGROUPSETWALKFN *func, void *magic)
- {
- int x;
- for(x = 0; x < gs->nentries; x++) {
- int rv = (*func)(magic, gs->entry[x]);
- if(rv <= 0)
- return rv;
- }
- return 1;
- }
- int
- logfsgroupsetismember(GroupSet *gs, Group *g)
- {
- int x;
- for(x = 0; x < gs->nentries; x++)
- if(gs->entry[x] == g)
- return 1;
- return 0;
- }
|