]> Dogcows Code - chaz/tar/blob - src/names.c
acd7857f671a25b548f6e106d6cf261c6f9eeae5
[chaz/tar] / src / names.c
1 /* Look up user and/or group names.
2 Copyright (C) 1988, 1992 Free Software Foundation
3
4 This file is part of GNU Tar.
5
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)
9 any later version.
10
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.
15
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. */
19
20 /*
21 * Look up user and/or group names.
22 *
23 * This file should be modified for non-unix systems to do something
24 * reasonable.
25 */
26
27 #include <sys/types.h>
28 #include "tar.h"
29 #include "port.h"
30
31 #ifndef NONAMES
32 /* Whole module goes away if NONAMES defined. Otherwise... */
33 #include <stdio.h>
34 #include <pwd.h>
35 #include <grp.h>
36
37 static int saveuid = -993;
38 static char saveuname[TUNMLEN];
39 static int my_uid = -993;
40
41 static int savegid = -993;
42 static char savegname[TGNMLEN];
43 static int my_gid = -993;
44
45 #define myuid ( my_uid < 0? (my_uid = getuid()): my_uid )
46 #define mygid ( my_gid < 0? (my_gid = getgid()): my_gid )
47
48 /*
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.
52 *
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.
55 */
56 void
57 finduname(uname, uid)
58 char uname[TUNMLEN];
59 int uid;
60 {
61 struct passwd *pw;
62 #ifndef HAVE_GETPWUID
63 extern struct passwd *getpwuid ();
64 #endif
65
66 if (uid != saveuid) {
67 saveuid = uid;
68 saveuname[0] = '\0';
69 pw = getpwuid(uid);
70 if (pw)
71 strncpy(saveuname, pw->pw_name, TUNMLEN);
72 }
73 strncpy(uname, saveuname, TUNMLEN);
74 }
75
76 int
77 finduid(uname)
78 char uname[TUNMLEN];
79 {
80 struct passwd *pw;
81 extern struct passwd *getpwnam();
82
83 if (uname[0] != saveuname[0] /* Quick test w/o proc call */
84 || 0!=strncmp(uname, saveuname, TUNMLEN)) {
85 strncpy(saveuname, uname, TUNMLEN);
86 pw = getpwnam(uname);
87 if (pw) {
88 saveuid = pw->pw_uid;
89 } else {
90 saveuid = myuid;
91 }
92 }
93 return saveuid;
94 }
95
96
97 void
98 findgname(gname, gid)
99 char gname[TGNMLEN];
100 int gid;
101 {
102 struct group *gr;
103 #ifndef HAVE_GETGRGID
104 extern struct group *getgrgid ();
105 #endif
106
107 if (gid != savegid) {
108 savegid = gid;
109 savegname[0] = '\0';
110 (void)setgrent();
111 gr = getgrgid(gid);
112 if (gr)
113 strncpy(savegname, gr->gr_name, TGNMLEN);
114 }
115 (void) strncpy(gname, savegname, TGNMLEN);
116 }
117
118
119 int
120 findgid(gname)
121 char gname[TUNMLEN];
122 {
123 struct group *gr;
124 extern struct group *getgrnam();
125
126 if (gname[0] != savegname[0] /* Quick test w/o proc call */
127 || 0!=strncmp(gname, savegname, TUNMLEN)) {
128 strncpy(savegname, gname, TUNMLEN);
129 gr = getgrnam(gname);
130 if (gr) {
131 savegid = gr->gr_gid;
132 } else {
133 savegid = mygid;
134 }
135 }
136 return savegid;
137 }
138 #endif
This page took 0.036347 seconds and 3 git commands to generate.