rpm/build/names.c

193 lines
3.7 KiB
C

/** \file build/names.c
* Simple user/group name/id cache (plus hostname and buildtime)
*/
#include "system.h"
#include "rpmbuild.h"
static uid_t uids[1024];
/*@owned@*/ /*@null@*/ static const char *unames[1024];
static int uid_used = 0;
static gid_t gids[1024];
/*@owned@*/ /*@null@*/ static const char *gnames[1024];
static int gid_used = 0;
/** */
void freeNames(void)
{
int x;
for (x = 0; x < uid_used; x++)
xfree(unames[x]);
for (x = 0; x < gid_used; x++)
xfree(gnames[x]);
}
/*
* getUname() takes a uid, gets the username, and creates an entry in the
* table to hold a string containing the user name.
*/
/** */
const char *getUname(uid_t uid)
{
struct passwd *pw;
int x;
for (x = 0; x < uid_used; x++) {
if (uids[x] == uid) {
return unames[x];
}
}
/* XXX - This is the other hard coded limit */
if (x == 1024) {
fprintf(stderr, _("RPMERR_INTERNAL: Hit limit in getUname()\n"));
exit(EXIT_FAILURE);
}
pw = getpwuid(uid);
uids[x] = uid;
uid_used++;
if (pw) {
unames[x] = xstrdup(pw->pw_name);
} else {
unames[x] = NULL;
}
return unames[x];
}
/*
* getUnameS() takes a username, gets the uid, and creates an entry in the
* table to hold a string containing the user name.
*/
/** */
const char *getUnameS(const char *uname)
{
struct passwd *pw;
int x;
for (x = 0; x < uid_used; x++) {
if (!strcmp(unames[x],uname)) {
return unames[x];
}
}
/* XXX - This is the other hard coded limit */
if (x == 1024) {
fprintf(stderr, _("RPMERR_INTERNAL: Hit limit in getUname()\n"));
exit(EXIT_FAILURE);
}
pw = getpwnam(uname);
uid_used++;
if (pw) {
uids[x] = pw->pw_uid;
unames[x] = xstrdup(pw->pw_name);
} else {
uids[x] = -1;
unames[x] = xstrdup(uname);
}
return unames[x];
}
/*
* getGname() takes a gid, gets the group name, and creates an entry in the
* table to hold a string containing the group name.
*/
/** */
const char *getGname(gid_t gid)
{
struct group *gr;
int x;
for (x = 0; x < gid_used; x++) {
if (gids[x] == gid) {
return gnames[x];
}
}
/* XXX - This is the other hard coded limit */
if (x == 1024) {
fprintf(stderr, _("RPMERR_INTERNAL: Hit limit in getGname()\n"));
exit(EXIT_FAILURE);
}
gr = getgrgid(gid);
gids[x] = gid;
gid_used++;
if (gr) {
gnames[x] = xstrdup(gr->gr_name);
} else {
gnames[x] = NULL;
}
return gnames[x];
}
/*
* getGnameS() takes a group name, gets the gid, and creates an entry in the
* table to hold a string containing the group name.
*/
/** */
const char *getGnameS(const char *gname)
{
struct group *gr;
int x;
for (x = 0; x < gid_used; x++) {
if (!strcmp(gnames[x], gname)) {
return gnames[x];
}
}
/* XXX - This is the other hard coded limit */
if (x == 1024) {
fprintf(stderr, _("RPMERR_INTERNAL: Hit limit in getGname()\n"));
exit(EXIT_FAILURE);
}
gr = getgrnam(gname);
gid_used++;
if (gr) {
gids[x] = gr->gr_gid;
gnames[x] = xstrdup(gr->gr_name);
} else {
gids[x] = -1;
gnames[x] = xstrdup(gname);
}
return gnames[x];
}
/** */
time_t *const getBuildTime(void)
{
static time_t buildTime = 0;
if (! buildTime) {
buildTime = time(NULL);
}
return &buildTime;
}
/** */
const char *const buildHost(void)
{
static char hostname[1024];
static int gotit = 0;
struct hostent *hbn;
if (! gotit) {
gethostname(hostname, sizeof(hostname));
if ((hbn = /*@-unrecog@*/ gethostbyname(hostname) /*@=unrecog@*/ )) {
strcpy(hostname, hbn->h_name);
} else {
rpmMessage(RPMMESS_WARNING, _("Could not canonicalize hostname: %s\n"),
hostname);
}
gotit = 1;
}
return(hostname);
}