xref: /inferno-os/liblogfs/groupset.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
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