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