1 /* Look up user and/or group names.
2 Copyright (C) 1988, 1992 Free Software Foundation
4 This file is part of GNU Tar.
6 GNU Tar is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Tar is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Tar; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 * Look up user and/or group names.
23 * This file should be modified for non-unix systems to do something
27 #include <sys/types.h>
32 /* Whole module goes away if NONAMES defined. Otherwise... */
37 static int saveuid = -993;
38 static char saveuname[TUNMLEN];
39 static int my_uid = -993;
41 static int savegid = -993;
42 static char savegname[TGNMLEN];
43 static int my_gid = -993;
45 #define myuid ( my_uid < 0? (my_uid = getuid()): my_uid )
46 #define mygid ( my_gid < 0? (my_gid = getgid()): my_gid )
49 * Look up a user or group name from a uid/gid, maintaining a cache.
50 * FIXME, for now it's a one-entry cache.
51 * FIXME2, the "-993" is to reduce the chance of a hit on the first lookup.
53 * This is ifdef'd because on Suns, it drags in about 38K of "yellow
54 * pages" code, roughly doubling the program size. Thanks guys.
57 finduname (uname, uid)
63 extern struct passwd *getpwuid ();
72 strncpy (saveuname, pw->pw_name, TUNMLEN);
74 strncpy (uname, saveuname, TUNMLEN);
82 extern struct passwd *getpwnam ();
84 if (uname[0] != saveuname[0] /* Quick test w/o proc call */
85 || 0 != strncmp (uname, saveuname, TUNMLEN))
87 strncpy (saveuname, uname, TUNMLEN);
88 pw = getpwnam (uname);
103 findgname (gname, gid)
108 #ifndef HAVE_GETGRGID
109 extern struct group *getgrgid ();
119 strncpy (savegname, gr->gr_name, TGNMLEN);
121 (void) strncpy (gname, savegname, TGNMLEN);
130 extern struct group *getgrnam ();
132 if (gname[0] != savegname[0] /* Quick test w/o proc call */
133 || 0 != strncmp (gname, savegname, TUNMLEN))
135 strncpy (savegname, gname, TUNMLEN);
136 gr = getgrnam (gname);
139 savegid = gr->gr_gid;