diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-12-28 05:44:47 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-12-28 05:44:47 +0000 |
commit | 9a44c4f91ce7e517d5325fd3743e6ad9d54ef3f0 (patch) | |
tree | 34292ef12cab59b118e91a6c58844ae25f1bee94 /libpwdgrp | |
parent | ba092336f00644c1233735bae4b81382309955d8 (diff) | |
download | busybox-w32-9a44c4f91ce7e517d5325fd3743e6ad9d54ef3f0.tar.gz busybox-w32-9a44c4f91ce7e517d5325fd3743e6ad9d54ef3f0.tar.bz2 busybox-w32-9a44c4f91ce7e517d5325fd3743e6ad9d54ef3f0.zip |
bb_xget[pw/gr]nam were horribly misnamed - fixed.
uidgid_get -> get_uidgid, add additional param
(numeric_ok). Make chown use it.
chown: fix "chown user: ...."
install: fix incorrect use of bb_xget[pw/gr]nam
Diffstat (limited to 'libpwdgrp')
-rw-r--r-- | libpwdgrp/uidgid_get.c | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/libpwdgrp/uidgid_get.c b/libpwdgrp/uidgid_get.c index a2d02a84f..32cbd21b9 100644 --- a/libpwdgrp/uidgid_get.c +++ b/libpwdgrp/uidgid_get.c | |||
@@ -1,26 +1,47 @@ | |||
1 | #include "busybox.h" | 1 | #include "busybox.h" |
2 | 2 | ||
3 | unsigned uidgid_get(struct bb_uidgid_t *u, const char *ug /*, unsigned dogrp */) | 3 | int get_uidgid(struct bb_uidgid_t *u, const char *ug, int numeric_ok) |
4 | { | 4 | { |
5 | struct passwd *pwd; | 5 | struct passwd *pwd; |
6 | struct group *gr; | 6 | struct group *gr; |
7 | const char *g; | 7 | char *user, *group; |
8 | unsigned n; | ||
8 | 9 | ||
9 | /* g = 0; if (dogrp) g = strchr(ug, ':'); */ | 10 | user = (char*)ug; |
10 | g = strchr(ug, ':'); | 11 | group = strchr(ug, ':'); |
11 | if (g) { | 12 | if (group) { |
12 | int sz = (++g) - ug; | 13 | int sz = (++group) - ug; |
13 | char buf[sz]; | 14 | user = alloca(sz); |
14 | safe_strncpy(buf, ug, sz); | 15 | /* copies sz-1 bytes, stores terminating '\0' */ |
15 | pwd = getpwnam(buf); | 16 | safe_strncpy(user, ug, sz); |
16 | } else | 17 | } |
17 | pwd = getpwnam(ug); | 18 | if (numeric_ok) { |
19 | n = bb_strtou(user, NULL, 10); | ||
20 | if (!errno) { | ||
21 | u->uid = n; | ||
22 | pwd = getpwuid(n); | ||
23 | /* If we have e.g. "500" string without user */ | ||
24 | /* with uid 500 in /etc/passwd, we set gid == uid */ | ||
25 | u->gid = pwd ? pwd->pw_gid : n; | ||
26 | goto skip; | ||
27 | } | ||
28 | } | ||
29 | pwd = getpwnam(user); | ||
18 | if (!pwd) | 30 | if (!pwd) |
19 | return 0; | 31 | return 0; |
20 | u->uid = pwd->pw_uid; | 32 | u->uid = pwd->pw_uid; |
21 | u->gid = pwd->pw_gid; | 33 | u->gid = pwd->pw_gid; |
22 | if (g) { | 34 | |
23 | gr = getgrnam(g); | 35 | skip: |
36 | if (group) { | ||
37 | if (numeric_ok) { | ||
38 | n = bb_strtou(group, NULL, 10); | ||
39 | if (!errno) { | ||
40 | u->gid = n; | ||
41 | return 1; | ||
42 | } | ||
43 | } | ||
44 | gr = getgrnam(group); | ||
24 | if (!gr) return 0; | 45 | if (!gr) return 0; |
25 | u->gid = gr->gr_gid; | 46 | u->gid = gr->gr_gid; |
26 | } | 47 | } |
@@ -33,16 +54,16 @@ int main() | |||
33 | { | 54 | { |
34 | unsigned u; | 55 | unsigned u; |
35 | struct bb_uidgid_t ug; | 56 | struct bb_uidgid_t ug; |
36 | u = uidgid_get(&ug, "apache"); | 57 | u = get_uidgid(&ug, "apache", 0); |
37 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | 58 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); |
38 | ug.uid = ug.gid = 1111; | 59 | ug.uid = ug.gid = 1111; |
39 | u = uidgid_get(&ug, "apache"); | 60 | u = get_uidgid(&ug, "apache", 0); |
40 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | 61 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); |
41 | ug.uid = ug.gid = 1111; | 62 | ug.uid = ug.gid = 1111; |
42 | u = uidgid_get(&ug, "apache:users"); | 63 | u = get_uidgid(&ug, "apache:users", 0); |
43 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | 64 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); |
44 | ug.uid = ug.gid = 1111; | 65 | ug.uid = ug.gid = 1111; |
45 | u = uidgid_get(&ug, "apache:users"); | 66 | u = get_uidgid(&ug, "apache:users", 0); |
46 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | 67 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); |
47 | return 0; | 68 | return 0; |
48 | } | 69 | } |