1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "local.h"
437da2899SCharles.Forsyth
537da2899SCharles.Forsyth struct GroupSet {
637da2899SCharles.Forsyth int maxentries;
737da2899SCharles.Forsyth int nentries;
837da2899SCharles.Forsyth Group **entry;
937da2899SCharles.Forsyth };
1037da2899SCharles.Forsyth
1137da2899SCharles.Forsyth char *
logfsgroupsetnew(GroupSet ** gsp)1237da2899SCharles.Forsyth logfsgroupsetnew(GroupSet **gsp)
1337da2899SCharles.Forsyth {
1437da2899SCharles.Forsyth GroupSet *gs = logfsrealloc(nil, sizeof(*gs));
1537da2899SCharles.Forsyth if(gs == nil)
1637da2899SCharles.Forsyth return Enomem;
1737da2899SCharles.Forsyth gs->entry = logfsrealloc(nil, sizeof(Group *));
1837da2899SCharles.Forsyth if(gs->entry == nil) {
1937da2899SCharles.Forsyth logfsfreemem(gs);
2037da2899SCharles.Forsyth return Enomem;
2137da2899SCharles.Forsyth }
2237da2899SCharles.Forsyth gs->maxentries = 1; /* most groups have one member */
2337da2899SCharles.Forsyth gs->nentries = 0;
2437da2899SCharles.Forsyth *gsp = gs;
2537da2899SCharles.Forsyth return nil;
2637da2899SCharles.Forsyth }
2737da2899SCharles.Forsyth
2837da2899SCharles.Forsyth void
logfsgroupsetfree(GroupSet ** gsp)2937da2899SCharles.Forsyth logfsgroupsetfree(GroupSet **gsp)
3037da2899SCharles.Forsyth {
3137da2899SCharles.Forsyth GroupSet *gs = *gsp;
3237da2899SCharles.Forsyth if(gs) {
3337da2899SCharles.Forsyth logfsfreemem(gs->entry);
3437da2899SCharles.Forsyth logfsfreemem(gs);
3537da2899SCharles.Forsyth *gsp = nil;
3637da2899SCharles.Forsyth }
3737da2899SCharles.Forsyth }
3837da2899SCharles.Forsyth
3937da2899SCharles.Forsyth int
logfsgroupsetadd(GroupSet * gs,Group * g)4037da2899SCharles.Forsyth logfsgroupsetadd(GroupSet *gs, Group *g)
4137da2899SCharles.Forsyth {
4237da2899SCharles.Forsyth int x;
4337da2899SCharles.Forsyth for(x = 0; x < gs->nentries; x++)
4437da2899SCharles.Forsyth if(gs->entry[x] == g)
4537da2899SCharles.Forsyth return 1;
4637da2899SCharles.Forsyth if(gs->nentries >= gs->maxentries) {
47*28942eadSforsyth Group **ne = logfsrealloc(gs->entry, sizeof(Group*)*(gs->maxentries * 2));
48*28942eadSforsyth if(ne == nil)
4937da2899SCharles.Forsyth return 0;
5037da2899SCharles.Forsyth gs->entry = ne;
5137da2899SCharles.Forsyth gs->maxentries *= 2;
5237da2899SCharles.Forsyth }
5337da2899SCharles.Forsyth gs->entry[gs->nentries++] = g;
5437da2899SCharles.Forsyth return 1;
5537da2899SCharles.Forsyth }
5637da2899SCharles.Forsyth
5737da2899SCharles.Forsyth int
logfsgroupsetremove(GroupSet * gs,Group * g)5837da2899SCharles.Forsyth logfsgroupsetremove(GroupSet *gs, Group *g)
5937da2899SCharles.Forsyth {
6037da2899SCharles.Forsyth int x;
6137da2899SCharles.Forsyth for(x = 0; x < gs->nentries; x++)
6237da2899SCharles.Forsyth if(gs->entry[x] == g)
6337da2899SCharles.Forsyth break;
6437da2899SCharles.Forsyth if(x == gs->nentries)
6537da2899SCharles.Forsyth return 0;
6637da2899SCharles.Forsyth gs->nentries--;
6737da2899SCharles.Forsyth memmove(&gs->entry[x], &gs->entry[x + 1], sizeof(Group *) * (gs->nentries - x));
6837da2899SCharles.Forsyth return 1;
6937da2899SCharles.Forsyth }
7037da2899SCharles.Forsyth
7137da2899SCharles.Forsyth int
logfsgroupsetwalk(GroupSet * gs,LOGFSGROUPSETWALKFN * func,void * magic)7237da2899SCharles.Forsyth logfsgroupsetwalk(GroupSet *gs, LOGFSGROUPSETWALKFN *func, void *magic)
7337da2899SCharles.Forsyth {
7437da2899SCharles.Forsyth int x;
7537da2899SCharles.Forsyth for(x = 0; x < gs->nentries; x++) {
7637da2899SCharles.Forsyth int rv = (*func)(magic, gs->entry[x]);
7737da2899SCharles.Forsyth if(rv <= 0)
7837da2899SCharles.Forsyth return rv;
7937da2899SCharles.Forsyth }
8037da2899SCharles.Forsyth return 1;
8137da2899SCharles.Forsyth }
8237da2899SCharles.Forsyth
8337da2899SCharles.Forsyth int
logfsgroupsetismember(GroupSet * gs,Group * g)8437da2899SCharles.Forsyth logfsgroupsetismember(GroupSet *gs, Group *g)
8537da2899SCharles.Forsyth {
8637da2899SCharles.Forsyth int x;
8737da2899SCharles.Forsyth for(x = 0; x < gs->nentries; x++)
8837da2899SCharles.Forsyth if(gs->entry[x] == g)
8937da2899SCharles.Forsyth return 1;
9037da2899SCharles.Forsyth return 0;
9137da2899SCharles.Forsyth }
92