blob: a8fec409da0fb4d0818d855dab0d41fec83b52a3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include "uidgid.h"
static unsigned str_chr(const char *s, int c)
{
const char *t = s;
while (t[0] && t[0] != (char)c)
t++;
return t - s;
}
unsigned uidgid_get(struct uidgid *u, char *ug, unsigned dogrp) {
char *g = 0;
struct passwd *pwd = 0;
struct group *gr = 0;
int i, d = 0;
if (dogrp)
d = str_chr(ug, ':');
if (ug[d] == ':') {
ug[d] = 0;
g = ug + d + 1;
}
pwd = getpwnam(ug);
if (!pwd) {
if (g) ug[d] = ':';
return 0;
}
if (g) {
ug[d] = ':';
for (i = 0; i < 60; ++i) {
d = str_chr(g, ':');
if (g[d] == ':') {
g[d] = 0;
gr = getgrnam(g);
if (!gr) {
g[d] = ':';
return 0;
}
g[d] = ':';
u->gid[i] = gr->gr_gid;
g += d+1;
}
else {
gr = getgrnam(g);
if (!gr) return 0;
u->gid[i++] = gr->gr_gid;
break;
}
}
u->gid[i] = 0;
u->gids = i;
}
if (!g) {
u->gid[0] = pwd->pw_gid;
u->gids = 1;
}
u->uid = pwd->pw_uid;
return 1;
}
|