X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fidcache.c;h=99c7362b05186fdb96f83a2e76774dceefc11bf9;hb=3f8a3a045ea058657030f588a10f786449d00e0d;hp=96f253bd106d4e2cab0d2a300b8e798ac3461b6c;hpb=83f52bd26a38730d3a4533e60c80fef42298422d;p=bacula%2Fbacula diff --git a/bacula/src/lib/idcache.c b/bacula/src/lib/idcache.c index 96f253bd10..99c7362b05 100644 --- a/bacula/src/lib/idcache.c +++ b/bacula/src/lib/idcache.c @@ -35,7 +35,7 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /* Translate UID to a login name or a stringified number, with cache. */ -char *getuser(uid_t uid) +char *getuser(uid_t uid, char *name, int len) { register struct userid *tail; struct passwd *pwent; @@ -44,26 +44,33 @@ char *getuser(uid_t uid) P(mutex); for (tail = user_alist; tail; tail = tail->next) { if (tail->id.u == uid) { - V(mutex); - return tail->name; + goto uid_done; } } pwent = getpwuid(uid); tail = (struct userid *)malloc(sizeof (struct userid)); tail->id.u = uid; - if (pwent == 0 || strcmp(pwent->pw_name, "????????") == 0) { +#ifndef HAVE_WIN32 + if (pwent == NULL || strcmp(pwent->pw_name, "????????") == 0) { sprintf(usernum_string, "%u", (uint32_t)uid); tail->name = bstrdup(usernum_string); } else { tail->name = bstrdup(pwent->pw_name); } +#else + sprintf(usernum_string, "%u", (uint32_t)uid); + tail->name = bstrdup(usernum_string); +#endif /* Add to the head of the list, so most recently used is first. */ tail->next = user_alist; user_alist = tail; + +uid_done: + bstrncpy(name, tail->name, len); V(mutex); - return tail->name; + return name; } void free_getuser_cache() @@ -77,6 +84,7 @@ void free_getuser_cache() tail = tail->next; free(otail); } + user_alist = NULL; V(mutex); } @@ -84,7 +92,7 @@ void free_getuser_cache() /* Translate GID to a group name or a stringified number, with cache. */ -char *getgroup(gid_t gid) +char *getgroup(gid_t gid, char *name, int len) { register struct userid *tail; struct group *grent; @@ -93,26 +101,32 @@ char *getgroup(gid_t gid) P(mutex); for (tail = group_alist; tail; tail = tail->next) { if (tail->id.g == gid) { - V(mutex); - return tail->name; + goto gid_done; } } grent = getgrgid(gid); tail = (struct userid *)malloc(sizeof (struct userid)); tail->id.g = gid; - if (grent == 0 || strcmp(grent->gr_name, "????????") == 0) { +#ifndef HAVE_WIN32 + if (grent == NULL || strcmp(grent->gr_name, "????????") == 0) { sprintf (groupnum_string, "%u", (uint32_t)gid); tail->name = bstrdup(groupnum_string); } else { tail->name = bstrdup(grent->gr_name); } - +#else + sprintf (groupnum_string, "%u", (uint32_t)gid); + tail->name = bstrdup(groupnum_string); +#endif /* Add to the head of the list, so most recently used is first. */ tail->next = group_alist; group_alist = tail; + +gid_done: + bstrncpy(name, tail->name, len); V(mutex); - return tail->name; + return name; } void free_getgroup_cache() @@ -126,5 +140,6 @@ void free_getgroup_cache() tail = tail->next; free(otail); } + group_alist = NULL; V(mutex); }