rpm 5.2.1

- Main Page
- Related Pages
- Modules
- Data Structures
- Files

- File List
- Globals

names.c
Go to the documentation of this file.
1 /*@-mods@*/
8 #include "system.h"
9
10 #include <rpmio.h>
11 #include <rpmiotypes.h>
12 #include <rpmlog.h>
13 #include "rpmbuild.h"
14 #include "debug.h"
15
16 typedef /*@owned@*/ /*@null@*/ const char * ugstr_t;
17
18 /*@unchecked@*/
19 static uid_t uids[1024];
20 /*@unchecked@*/
21 static ugstr_t unames[1024];
22 /*@unchecked@*/
23 static int uid_used = 0;
24
25 /*@unchecked@*/
26 static gid_t gids[1024];
27 /*@unchecked@*/
28 static ugstr_t gnames[1024];
29 /*@unchecked@*/
30 static int gid_used = 0;
31
32 void freeNames(void)
33 {
34 int x;
35 for (x = 0; x < uid_used; x++)
36 unames[x] = _free(unames[x]);
37 for (x = 0; x < gid_used; x++)
38 gnames[x] = _free(gnames[x]);
39 }
40
41 const char *getUname(uid_t uid)
42 /*@globals uid_used, uids, unames @*/
43 /*@modifies uid_used, uids, unames @*/
44 {
45 struct passwd *pw;
46 int x;
47
48 for (x = 0; x < uid_used; x++) {
49 if (unames[x] == NULL) continue;
50 if (uids[x] == uid)
51 return unames[x];
52 }
53
54 /* XXX - This is the other hard coded limit */
55 if (x == 1024)
56 rpmlog(RPMLOG_CRIT, _("getUname: too many uid's\n"));
57
58 if ((pw = getpwuid(uid)) == NULL)
59 return NULL;
60 uids[uid_used] = uid;
61 unames[uid_used] = xstrdup(pw->pw_name);
62 return unames[uid_used++];
63 }
64
65 const char *getUnameS(const char *uname)
66 /*@globals uid_used, uids, unames @*/
67 /*@modifies uid_used, uids, unames @*/
68 {
69 struct passwd *pw;
70 int x;
71
72 for (x = 0; x < uid_used; x++) {
73 if (unames[x] == NULL) continue;
74 if (!strcmp(unames[x],uname))
75 return unames[x];
76 }
77
78 /* XXX - This is the other hard coded limit */
79 if (x == 1024)
80 rpmlog(RPMLOG_CRIT, _("getUnameS: too many uid's\n"));
81
82 if ((pw = getpwnam(uname)) == NULL) {
83 uids[uid_used] = -1;
84 unames[uid_used] = xstrdup(uname);
85 } else {
86 uids[uid_used] = pw->pw_uid;
87 unames[uid_used] = xstrdup(pw->pw_name);
88 }
89 return unames[uid_used++];
90 }
91
92 uid_t getUidS(const char *uname)
93 /*@globals uid_used, uids, unames @*/
94 /*@modifies uid_used, uids, unames @*/
95 {
96 struct passwd *pw;
97 int x;
98
99 for (x = 0; x < uid_used; x++) {
100 if (unames[x] == NULL) continue;
101 if (!strcmp(unames[x],uname))
102 return uids[x];
103 }
104
105 /* XXX - This is the other hard coded limit */
106 if (x == 1024)
107 rpmlog(RPMLOG_CRIT, _("getUidS: too many uid's\n"));
108
109 if ((pw = getpwnam(uname)) == NULL) {
110 uids[uid_used] = -1;
111 unames[uid_used] = xstrdup(uname);
112 } else {
113 uids[uid_used] = pw->pw_uid;
114 unames[uid_used] = xstrdup(pw->pw_name);
115 }
116 return uids[uid_used++];
117 }
118
119 const char *getGname(gid_t gid)
120 /*@globals gid_used, gids, gnames @*/
121 /*@modifies gid_used, gids, gnames @*/
122 {
123 struct group *gr;
124 int x;
125
126 for (x = 0; x < gid_used; x++) {
127 if (gnames[x] == NULL) continue;
128 if (gids[x] == gid)
129 return gnames[x];
130 }
131
132 /* XXX - This is the other hard coded limit */
133 if (x == 1024)
134 rpmlog(RPMLOG_CRIT, _("getGname: too many gid's\n"));
135
136 if ((gr = getgrgid(gid)) == NULL)
137 return NULL;
138 gids[gid_used] = gid;
139 gnames[gid_used] = xstrdup(gr->gr_name);
140 return gnames[gid_used++];
141 }
142
143 const char *getGnameS(const char *gname)
144 /*@globals gid_used, gids, gnames @*/
145 /*@modifies gid_used, gids, gnames @*/
146 {
147 struct group *gr;
148 int x;
149
150 for (x = 0; x < gid_used; x++) {
151 if (gnames[x] == NULL) continue;
152 if (!strcmp(gnames[x], gname))
153 return gnames[x];
154 }
155
156 /* XXX - This is the other hard coded limit */
157 if (x == 1024)
158 rpmlog(RPMLOG_CRIT, _("getGnameS: too many gid's\n"));
159
160 if ((gr = getgrnam(gname)) == NULL) {
161 gids[gid_used] = -1;
162 gnames[gid_used] = xstrdup(gname);
163 } else {
164 gids[gid_used] = gr->gr_gid;
165 gnames[gid_used] = xstrdup(gr->gr_name);
166 }
167 return gnames[gid_used++];
168 }
169
170 gid_t getGidS(const char *gname)
171 /*@globals gid_used, gids, gnames @*/
172 /*@modifies gid_used, gids, gnames @*/
173 {
174 struct group *gr;
175 int x;
176
177 for (x = 0; x < gid_used; x++) {
178 if (gnames[x] == NULL) continue;
179 if (!strcmp(gnames[x], gname))
180 return gids[x];
181 }
182
183 /* XXX - This is the other hard coded limit */
184 if (x == 1024)
185 rpmlog(RPMLOG_CRIT, _("getGidS: too many gid's\n"));
186
187 if ((gr = getgrnam(gname)) == NULL) {
188 gids[gid_used] = -1;
189 gnames[gid_used] = xstrdup(gname);
190 } else {
191 gids[gid_used] = gr->gr_gid;
192 gnames[gid_used] = xstrdup(gr->gr_name);
193 }
194 return gids[gid_used++];
195 }
196
197 rpmuint32_t * getBuildTime(void)
198 {
199 static rpmuint32_t buildTime[1];
200
201 if (buildTime[0] == 0)
202 buildTime[0] = (rpmuint32_t) time(NULL);
203 return buildTime;
204 }
205
206 const char * buildHost(void)
207 {
208 static char hostname[1024];
209 static int oneshot = 0;
210 struct hostent *hbn;
211
212 if (! oneshot) {
213 (void) gethostname(hostname, sizeof(hostname));
214 /*@-unrecog -multithreaded @*/
215 /*@-globs@*/ /* FIX: h_errno access */
216 hbn = gethostbyname(hostname);
217 /*@=globs@*/
218 /*@=unrecog =multithreaded @*/
219 if (hbn)
220 strcpy(hostname, hbn->h_name);
221 else
222 rpmlog(RPMLOG_WARNING,
223 _("Could not canonicalize hostname: %s\n"), hostname);
224 oneshot = 1;
225 }
226 return(hostname);
227 }
228 /*@=mods@*/