xref: /inferno-os/liblogfs/group.c (revision 1aff7a0a7dab24c5871eb95737c86616c9fd848b)
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