aboutsummaryrefslogtreecommitdiff
path: root/libpwdgrp
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-12-28 05:44:47 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-12-28 05:44:47 +0000
commit9a44c4f91ce7e517d5325fd3743e6ad9d54ef3f0 (patch)
tree34292ef12cab59b118e91a6c58844ae25f1bee94 /libpwdgrp
parentba092336f00644c1233735bae4b81382309955d8 (diff)
downloadbusybox-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.c55
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
3unsigned uidgid_get(struct bb_uidgid_t *u, const char *ug /*, unsigned dogrp */) 3int 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}