blob: f51bfe9eec5ee8ff4b012bfed9ef2783321e04da
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * password utility routines. |
4 | * |
5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> |
6 | * Copyright (C) 2008 by Tito Ragusa <farmatito@tiscali.it> |
7 | * |
8 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. |
9 | */ |
10 | |
11 | #include "libbb.h" |
12 | |
13 | /* TODO: maybe change API to return malloced data? |
14 | * This will allow to stop using libc functions returning |
15 | * pointers to static data (getpwuid) |
16 | */ |
17 | |
18 | struct passwd* FAST_FUNC safegetpwnam(const char *name) |
19 | { |
20 | struct passwd *pw = getpwnam(name); |
21 | #ifdef __BIONIC__ |
22 | if (pw && !pw->pw_passwd) { |
23 | pw->pw_passwd = ""; |
24 | } |
25 | #endif |
26 | return pw; |
27 | } |
28 | |
29 | struct passwd* FAST_FUNC safegetpwuid(uid_t uid) |
30 | { |
31 | struct passwd *pw = getpwuid(uid); |
32 | #ifdef __BIONIC__ |
33 | if (pw && !pw->pw_passwd) { |
34 | pw->pw_passwd = ""; |
35 | } |
36 | #endif |
37 | return pw; |
38 | } |
39 | |
40 | struct passwd* FAST_FUNC xgetpwnam(const char *name) |
41 | { |
42 | struct passwd *pw = safegetpwnam(name); |
43 | if (!pw) |
44 | bb_error_msg_and_die("unknown user %s", name); |
45 | return pw; |
46 | } |
47 | |
48 | struct group* FAST_FUNC xgetgrnam(const char *name) |
49 | { |
50 | struct group *gr = getgrnam(name); |
51 | if (!gr) |
52 | bb_error_msg_and_die("unknown group %s", name); |
53 | return gr; |
54 | } |
55 | |
56 | struct passwd* FAST_FUNC xgetpwuid(uid_t uid) |
57 | { |
58 | struct passwd *pw = safegetpwuid(uid); |
59 | if (!pw) |
60 | bb_error_msg_and_die("unknown uid %u", (unsigned)uid); |
61 | return pw; |
62 | } |
63 | |
64 | struct group* FAST_FUNC xgetgrgid(gid_t gid) |
65 | { |
66 | struct group *gr = getgrgid(gid); |
67 | if (!gr) |
68 | bb_error_msg_and_die("unknown gid %u", (unsigned)gid); |
69 | return gr; |
70 | } |
71 | |
72 | char* FAST_FUNC xuid2uname(uid_t uid) |
73 | { |
74 | struct passwd *pw = xgetpwuid(uid); |
75 | return pw->pw_name; |
76 | } |
77 | |
78 | char* FAST_FUNC xgid2group(gid_t gid) |
79 | { |
80 | struct group *gr = xgetgrgid(gid); |
81 | return gr->gr_name; |
82 | } |
83 | |
84 | char* FAST_FUNC uid2uname(uid_t uid) |
85 | { |
86 | struct passwd *pw = getpwuid(uid); |
87 | return (pw) ? pw->pw_name : NULL; |
88 | } |
89 | |
90 | char* FAST_FUNC gid2group(gid_t gid) |
91 | { |
92 | struct group *gr = getgrgid(gid); |
93 | return (gr) ? gr->gr_name : NULL; |
94 | } |
95 | |
96 | char* FAST_FUNC uid2uname_utoa(uid_t uid) |
97 | { |
98 | char *name = uid2uname(uid); |
99 | return (name) ? name : utoa(uid); |
100 | } |
101 | |
102 | char* FAST_FUNC gid2group_utoa(gid_t gid) |
103 | { |
104 | char *name = gid2group(gid); |
105 | return (name) ? name : utoa(gid); |
106 | } |
107 | |
108 | long FAST_FUNC xuname2uid(const char *name) |
109 | { |
110 | struct passwd *myuser; |
111 | |
112 | myuser = xgetpwnam(name); |
113 | return myuser->pw_uid; |
114 | } |
115 | |
116 | long FAST_FUNC xgroup2gid(const char *name) |
117 | { |
118 | struct group *mygroup; |
119 | |
120 | mygroup = xgetgrnam(name); |
121 | return mygroup->gr_gid; |
122 | } |
123 | |
124 | unsigned long FAST_FUNC get_ug_id(const char *s, |
125 | long FAST_FUNC (*xname2id)(const char *)) |
126 | { |
127 | unsigned long r; |
128 | |
129 | r = bb_strtoul(s, NULL, 10); |
130 | if (errno) |
131 | return xname2id(s); |
132 | return r; |
133 | } |
134 |