- remove functions marked as LEGACY in SUSv3 and use their modern counterparts.
[oweals/busybox.git] / libbb / bb_pwd.c
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  *
7  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
8  */
9
10 #include <stdio.h>
11 #include <string.h>
12 #include <assert.h>
13 #include "libbb.h"
14
15  /*
16   * if bufsize is > 0 char *buffer cannot be set to NULL.
17   *                   If idname is not NULL it is written on the static
18   *                   allocated buffer (and a pointer to it is returned).
19   *                   if idname is NULL, id as string is written to the static
20   *                   allocated buffer and NULL is returned.
21   * if bufsize is = 0 char *buffer can be set to NULL.
22   *                   If idname exists a pointer to it is returned,
23   *                   else NULL is returned.
24   * if bufsize is < 0 char *buffer can be set to NULL.
25   *                   If idname exists a pointer to it is returned,
26   *                   else an error message is printed and the program exits.
27   */
28
29 /* internal function for bb_getpwuid and bb_getgrgid */
30 static char * bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix)
31 {
32         if (bufsize > 0 ) {
33                 assert(buffer!=NULL);
34                 if(idname) {
35                         return safe_strncpy(buffer, idname, bufsize);
36                 }
37                 snprintf(buffer, bufsize, "%ld", id);
38         } else if (bufsize < 0 && !idname) {
39                 bb_error_msg_and_die("unknown %cid %ld", prefix, id);
40         }
41         return idname;
42 }
43
44   /* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> to make it more
45   * flexible :
46   *
47   * if bufsize is > 0 char *group cannot be set to NULL.
48   *                   On success groupname is written on static allocated buffer
49   *                   group (and a pointer to it is returned).
50   *                   On failure gid as string is written to static allocated
51   *                   buffer group and NULL is returned.
52   * if bufsize is = 0 char *group can be set to NULL.
53   *                   On success groupname is returned.
54   *                   On failure NULL is returned.
55   * if bufsize is < 0 char *group can be set to NULL.
56   *                   On success groupname is returned.
57   *                   On failure an error message is printed and
58   *                   the program exits.
59   */
60
61 /* gets a groupname given a gid */
62 char * bb_getgrgid(char *group, long gid, int bufsize)
63 {
64         struct group *mygroup = getgrgid(gid);
65
66         return bb_getug(group, (mygroup) ?
67                         mygroup->gr_name : (char *)mygroup, gid, bufsize, 'g');
68 }
69
70 /* returns a gid given a group name */
71 long bb_xgetgrnam(const char *name)
72 {
73         struct group *mygroup;
74
75         mygroup  = getgrnam(name);
76         if (mygroup==NULL)
77                 bb_error_msg_and_die("unknown group name: %s", name);
78
79         return mygroup->gr_gid;
80 }
81
82 /* returns a uid given a username */
83 long bb_xgetpwnam(const char *name)
84 {
85         struct passwd *myuser;
86
87         myuser  = getpwnam(name);
88         if (myuser==NULL)
89                 bb_error_msg_and_die("unknown user name: %s", name);
90
91         return myuser->pw_uid;
92 }
93
94  /* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> to make it more
95   * flexible :
96   *
97   * if bufsize is > 0 char *name cannot be set to NULL.
98   *                   On success username is written on the static allocated
99   *                   buffer name (and a pointer to it is returned).
100   *                   On failure uid as string is written to the static
101   *                   allocated buffer name and NULL is returned.
102   * if bufsize is = 0 char *name can be set to NULL.
103   *                   On success username is returned.
104   *                   On failure NULL is returned.
105   * if bufsize is < 0 char *name can be set to NULL
106   *                   On success username is returned.
107   *                   On failure an error message is printed and
108   *                   the program exits.
109   */
110
111 /* gets a username given a uid */
112 char * bb_getpwuid(char *name, long uid, int bufsize)
113 {
114         struct passwd *myuser = getpwuid(uid);
115
116         return bb_getug(name, myuser ? myuser->pw_name : (char *)myuser,
117                                 uid, bufsize, 'u');
118 }
119
120 unsigned long get_ug_id(const char *s,
121                 long (*__bb_getxxnam)(const char *))
122 {
123         unsigned long r;
124
125         r = bb_strtoul(s, NULL, 10);
126         if (errno)
127                 r = __bb_getxxnam(s);
128
129         return r;
130 }