summaryrefslogtreecommitdiff
path: root/libbb/bb_pwd.c (plain)
blob: d5e651cc8a64cc99cfe6fee96fb8a090325c9620
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
18struct 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
29struct 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
40struct 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
48struct 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
56struct 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
64struct 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
72char* FAST_FUNC xuid2uname(uid_t uid)
73{
74 struct passwd *pw = xgetpwuid(uid);
75 return pw->pw_name;
76}
77
78char* FAST_FUNC xgid2group(gid_t gid)
79{
80 struct group *gr = xgetgrgid(gid);
81 return gr->gr_name;
82}
83
84char* FAST_FUNC uid2uname(uid_t uid)
85{
86 struct passwd *pw = getpwuid(uid);
87 return (pw) ? pw->pw_name : NULL;
88}
89
90char* FAST_FUNC gid2group(gid_t gid)
91{
92 struct group *gr = getgrgid(gid);
93 return (gr) ? gr->gr_name : NULL;
94}
95
96char* FAST_FUNC uid2uname_utoa(uid_t uid)
97{
98 char *name = uid2uname(uid);
99 return (name) ? name : utoa(uid);
100}
101
102char* FAST_FUNC gid2group_utoa(gid_t gid)
103{
104 char *name = gid2group(gid);
105 return (name) ? name : utoa(gid);
106}
107
108long FAST_FUNC xuname2uid(const char *name)
109{
110 struct passwd *myuser;
111
112 myuser = xgetpwnam(name);
113 return myuser->pw_uid;
114}
115
116long FAST_FUNC xgroup2gid(const char *name)
117{
118 struct group *mygroup;
119
120 mygroup = xgetgrnam(name);
121 return mygroup->gr_gid;
122}
123
124unsigned 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
135/* Experimental "mallocing" API.
136 * The goal is nice: "we want to support a case when "guests" group is very large"
137 * but the code is butt-ugly.
138 */
139#if 0
140static char *find_latest(char last, char *cp)
141{
142 if (!cp)
143 return last;
144 cp += strlen(cp) + 1;
145 if (last < cp)
146 last = cp;
147 return last;
148}
149
150struct group* FAST_FUNC xmalloc_getgrnam(const char *name)
151{
152 struct {
153 struct group gr;
154 // May still be not enough!
155 char buf[64*1024 - sizeof(struct group) - 16];
156 } *s;
157 struct group *grp;
158 int r;
159 char *last;
160 char **gr_mem;
161
162 s = xmalloc(sizeof(*s));
163 r = getgrnam_r(name, &s->gr, s->buf, sizeof(s->buf), &grp);
164 if (!grp) {
165 free(s);
166 return grp;
167 }
168 last = find_latest(s->buf, grp->gr_name);
169 last = find_latest(last, grp->gr_passwd);
170 gr_mem = grp->gr_mem;
171 while (*gr_mem)
172 last = find_latest(last, *gr_mem++);
173 gr_mem++; /* points past NULL */
174 if (last < (char*)gr_mem)
175 last = (char*)gr_mem;
176//FIXME: what if we get not only truncated, but also moved here?
177// grp->gr_name pointer and friends are invalid now!!!
178 s = xrealloc(s, last - (char*)s);
179 return grp;
180}
181#endif
182