diff options
Diffstat (limited to 'uidgid.c')
-rw-r--r-- | uidgid.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/uidgid.c b/uidgid.c new file mode 100644 index 0000000..befa754 --- /dev/null +++ b/uidgid.c | |||
@@ -0,0 +1,74 @@ | |||
1 | #include <sys/types.h> | ||
2 | #include <pwd.h> | ||
3 | #include <grp.h> | ||
4 | #include "uidgid.h" | ||
5 | #include "str.h" | ||
6 | #include "scan.h" | ||
7 | |||
8 | /* user */ | ||
9 | unsigned int uidgid_get(struct uidgid *u, char *ug) { | ||
10 | struct passwd *pwd =0; | ||
11 | |||
12 | if (! (pwd =getpwnam(ug))) return(0); | ||
13 | u->gid[0] =pwd->pw_gid; u->gids =1; | ||
14 | u->uid =pwd->pw_uid; | ||
15 | return(1); | ||
16 | } | ||
17 | |||
18 | /* uid:gid[:gid[:gid]...] */ | ||
19 | unsigned int uidgids_set(struct uidgid *u, char *ug) { | ||
20 | unsigned long id; | ||
21 | int i; | ||
22 | |||
23 | if (*(ug +=scan_ulong(ug, &id)) != ':') return(0); | ||
24 | u->uid =(uid_t)id; | ||
25 | ++ug; | ||
26 | for (i =0; i < 60; ++i, ++ug) { | ||
27 | ug +=scan_ulong(ug, &id); | ||
28 | u->gid[i] =(gid_t)id; | ||
29 | if (*ug != ':') { ++i; break; } | ||
30 | } | ||
31 | u->gid[i] =0; | ||
32 | u->gids =i; | ||
33 | if (*ug) return(0); | ||
34 | return(1); | ||
35 | } | ||
36 | |||
37 | /* [:]user[:group[:group]...] */ | ||
38 | unsigned int uidgids_get(struct uidgid *u, char *ug) { | ||
39 | char *g =0; | ||
40 | struct passwd *pwd =0; | ||
41 | struct group *gr =0; | ||
42 | int i, d =0; | ||
43 | |||
44 | if (*ug == ':') return(uidgids_set(u, ug +1)); | ||
45 | if (ug[(d =str_chr(ug, ':'))] == ':') { | ||
46 | ug[d] =0; | ||
47 | g =ug +d +1; | ||
48 | } | ||
49 | if (! (pwd =getpwnam(ug))) { if (g) ug[d] =':'; return(0); } | ||
50 | u->uid =pwd->pw_uid; | ||
51 | if (! g) { | ||
52 | u->gid[0] =pwd->pw_gid; | ||
53 | u->gids =1; | ||
54 | return(1); | ||
55 | } | ||
56 | ug[d] =':'; | ||
57 | for (i =0; i < 60; ++i) { | ||
58 | if (g[(d =str_chr(g, ':'))] == ':') { | ||
59 | g[d] =0; | ||
60 | if (! (gr =getgrnam(g))) { g[d] =':'; return(0); } | ||
61 | g[d] =':'; | ||
62 | u->gid[i] =gr->gr_gid; | ||
63 | g +=d +1; | ||
64 | } | ||
65 | else { | ||
66 | if (! (gr =getgrnam(g))) return(0); | ||
67 | u->gid[i++] =gr->gr_gid; | ||
68 | break; | ||
69 | } | ||
70 | } | ||
71 | u->gid[i] =0; | ||
72 | u->gids =i; | ||
73 | return(1); | ||
74 | } | ||