xref: /plan9/sys/src/ape/cmd/pax/names.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 /* $Source: /u/mark/src/pax/RCS/names.c,v $
2  *
3  * $Revision: 1.2 $
4  *
5  * names.c - Look up user and/or group names.
6  *
7  * DESCRIPTION
8  *
9  *	These functions support UID and GID name lookup.  The results are
10  *	cached to improve performance.
11  *
12  * AUTHOR
13  *
14  *	Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
15  *
16  * Sponsored by The USENIX Association for public distribution.
17  *
18  * Copyright (c) 1989 Mark H. Colburn.
19  * All rights reserved.
20  *
21  * Redistribution and use in source and binary forms are permitted
22  * provided that the above copyright notice is duplicated in all such
23  * forms and that any documentation, advertising materials, and other
24  * materials related to such distribution and use acknowledge that the
25  * software was developed * by Mark H. Colburn and sponsored by The
26  * USENIX Association.
27  *
28  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
29  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
30  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
31  *
32  * $Log:	names.c,v $
33  * Revision 1.2  89/02/12  10:05:05  mark
34  * 1.2 release fixes
35  *
36  * Revision 1.1  88/12/23  18:02:19  mark
37  * Initial revision
38  *
39  */
40 
41 #ifndef lint
42 static char *ident = "$Id: names.c,v 1.2 89/02/12 10:05:05 mark Exp $";
43 static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
44 #endif /* ! lint */
45 
46 
47 /* Headers */
48 
49 #include "pax.h"
50 
51 
52 /* Defines */
53 
54 #define myuid	( my_uid < 0? (my_uid = getuid()): my_uid )
55 #define	mygid	( my_gid < 0? (my_gid = getgid()): my_gid )
56 
57 
58 /* Internal Identifiers */
59 
60 static int      saveuid = -993;
61 static char     saveuname[TUNMLEN];
62 static int      my_uid = -993;
63 
64 static int      savegid = -993;
65 static char     savegname[TGNMLEN];
66 static int      my_gid = -993;
67 
68 
69 /* finduname - find a user or group name from a uid or gid
70  *
71  * DESCRIPTION
72  *
73  * 	Look up a user name from a uid/gid, maintaining a cache.
74  *
75  * PARAMETERS
76  *
77  *	char	uname[]		- name (to be returned to user)
78  *	int	uuid		- id of name to find
79  *
80  *
81  * RETURNS
82  *
83  *	Returns a name which is associated with the user id given.  If there
84  *	is not name which corresponds to the user-id given, then a pointer
85  *	to a string of zero length is returned.
86  *
87  * FIXME
88  *
89  * 	1. for now it's a one-entry cache.
90  *	2. The "-993" is to reduce the chance of a hit on the first lookup.
91  */
92 
93 #ifdef __STDC__
94 
finduname(int uuid)95 char *finduname(int uuid)
96 
97 #else
98 
99 char *finduname(uuid)
100 int             uuid;
101 
102 #endif
103 {
104     struct passwd  *pw;
105 
106     if (uuid != saveuid) {
107 	saveuid = uuid;
108 	saveuname[0] = '\0';
109 	pw = getpwuid(uuid);
110 	if (pw) {
111 	    strncpy(saveuname, pw->pw_name, TUNMLEN);
112 	}
113     }
114     return(saveuname);
115 }
116 
117 
118 /* finduid - get the uid for a given user name
119  *
120  * DESCRIPTION
121  *
122  *	This does just the opposit of finduname.  Given a user name it
123  *	finds the corresponding UID for that name.
124  *
125  * PARAMETERS
126  *
127  *	char	uname[]		- username to find a UID for
128  *
129  * RETURNS
130  *
131  *	The UID which corresponds to the uname given, if any.  If no UID
132  *	could be found, then the UID which corrsponds the user running the
133  *	program is returned.
134  *
135  */
136 
137 #ifdef __STDC__
138 
finduid(char * uname)139 int finduid(char *uname)
140 
141 #else
142 
143 int finduid(uname)
144 char            *uname;
145 
146 #endif
147 {
148     struct passwd  *pw;
149     extern struct passwd *getpwnam();
150 
151     if (uname[0] != saveuname[0]/* Quick test w/o proc call */
152 	||0 != strncmp(uname, saveuname, TUNMLEN)) {
153 	strncpy(saveuname, uname, TUNMLEN);
154 	pw = getpwnam(uname);
155 	if (pw) {
156 	    saveuid = pw->pw_uid;
157 	} else {
158 	    saveuid = myuid;
159 	}
160     }
161     return (saveuid);
162 }
163 
164 
165 /* findgname - look up a group name from a gid
166  *
167  * DESCRIPTION
168  *
169  * 	Look up a group name from a gid, maintaining a cache.
170  *
171  *
172  * PARAMETERS
173  *
174  *	int	ggid		- goupid of group to find
175  *
176  * RETURNS
177  *
178  *	A string which is associated with the group ID given.  If no name
179  *	can be found, a string of zero length is returned.
180  */
181 
182 #ifdef __STDC__
183 
findgname(int ggid)184 char *findgname(int ggid)
185 
186 #else
187 
188 char *findgname(ggid)
189 int             ggid;
190 
191 #endif
192 {
193     struct group   *gr;
194 
195     if (ggid != savegid) {
196 	savegid = ggid;
197 	savegname[0] = '\0';
198 #ifndef _POSIX_SOURCE
199 	setgrent();
200 #endif
201 	gr = getgrgid(ggid);
202 	if (gr) {
203 	    strncpy(savegname, gr->gr_name, TGNMLEN);
204 	}
205     }
206     return(savegname);
207 }
208 
209 
210 
211 /* findgid - get the gid for a given group name
212  *
213  * DESCRIPTION
214  *
215  *	This does just the opposit of finduname.  Given a group name it
216  *	finds the corresponding GID for that name.
217  *
218  * PARAMETERS
219  *
220  *	char	uname[]		- groupname to find a GID for
221  *
222  * RETURNS
223  *
224  *	The GID which corresponds to the uname given, if any.  If no GID
225  *	could be found, then the GID which corrsponds the group running the
226  *	program is returned.
227  *
228  */
229 
230 #ifdef __STDC__
231 
findgid(char * gname)232 int findgid(char *gname)
233 
234 #else
235 
236 int findgid(gname)
237 char           *gname;
238 
239 #endif
240 {
241     struct group   *gr;
242 
243     /* Quick test w/o proc call */
244     if (gname[0] != savegname[0] || strncmp(gname, savegname, TUNMLEN) != 0) {
245 	strncpy(savegname, gname, TUNMLEN);
246 	gr = getgrnam(gname);
247 	if (gr) {
248 	    savegid = gr->gr_gid;
249 	} else {
250 	    savegid = mygid;
251 	}
252     }
253     return (savegid);
254 }
255