summaryrefslogtreecommitdiff
path: root/libbb/bb_pwd.c (plain)
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
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