Index: GNUmakefile =================================================================== RCS file: /home/ncvs/projects/csup/GNUmakefile,v retrieving revision 1.2 diff -u -r1.2 GNUmakefile --- GNUmakefile 18 Feb 2006 12:02:03 -0000 1.2 +++ GNUmakefile 23 Feb 2006 23:14:09 -0000 @@ -9,7 +9,7 @@ UNAME= $(shell uname -s) -SRCS= attrstack.c config.c detailer.c diff.c fattr.c fixups.c keyword.c \ +SRCS= attrstack.c cache.c config.c detailer.c diff.c fattr.c fixups.c keyword.c \ lister.c main.c misc.c mux.c pathcomp.c parse.c proto.c status.c \ stream.c threads.c token.c updater.c OBJS= $(SRCS:.c=.o) Index: Makefile =================================================================== RCS file: /home/ncvs/projects/csup/Makefile,v retrieving revision 1.41 diff -u -r1.41 Makefile --- Makefile 18 Feb 2006 10:41:08 -0000 1.41 +++ Makefile 23 Feb 2006 23:14:09 -0000 @@ -8,6 +8,7 @@ PROG= csup SRCS= attrstack.c attrstack.h \ + cache.c cache.h \ config.c config.h \ detailer.c detailer.h \ diff.c diff.h \ Index: fattr.c =================================================================== RCS file: /home/ncvs/projects/csup/fattr.c,v retrieving revision 1.36 diff -u -r1.36 fattr.c --- fattr.c 18 Feb 2006 01:38:52 -0000 1.36 +++ fattr.c 23 Feb 2006 23:14:09 -0000 @@ -39,6 +39,7 @@ #include #include +#include "cache.h" #include "fattr.h" #include "misc.h" @@ -117,6 +118,7 @@ struct fattr *fa; int i; + cache_init(); for (i = 0; i < FT_NUMBER; i++) { fa = fattr_new(i, -1); if (i == FT_DIRECTORY) @@ -133,6 +135,7 @@ { int i; + cache_fini(); for (i = 0; i < FT_NUMBER; i++) fattr_free(defaults[i]); } @@ -336,28 +339,25 @@ int extval; char *ext; } pieces[FA_NUMBER], *piece; - struct passwd *pw; - struct group *gr; - char *cp, *s; + char *cp, *gr_name, *s, *pw_name; size_t len, vallen; mode_t mode, modemask; int mask, n, i; - pw = NULL; - gr = NULL; + gr_name = NULL; + pw_name = NULL; if (support == NULL) mask = fa->mask; else mask = fa->mask & support[fa->type]; - /* XXX - Use getpwuid_r() and getgrgid_r(). */ if (fa->mask & FA_OWNER) { - pw = getpwuid(fa->uid); - if (pw == NULL) + pw_name = name_uid(fa->uid); + if (pw_name == NULL) mask &= ~FA_OWNER; } if (fa->mask & FA_GROUP) { - gr = getgrgid(fa->gid); - if (gr == NULL) + gr_name = name_gid(fa->gid); + if (gr_name == NULL) mask &= ~FA_GROUP; } if (fa->mask & FA_LINKCOUNT && fa->linkcount == 1) @@ -407,17 +407,17 @@ piece++; } if (mask & FA_OWNER) { - vallen = strlen(pw->pw_name); + vallen = strlen(pw_name); piece->extval = 1; - piece->ext = pw->pw_name; + piece->ext = pw_name; len += snprintf(piece->len, sizeof(piece->len), "%lld", (long long)vallen) + vallen + 1; piece++; } if (mask & FA_GROUP) { - vallen = strlen(gr->gr_name); + vallen = strlen(gr_name); piece->extval = 1; - piece->ext = gr->gr_name; + piece->ext = gr_name; len += snprintf(piece->len, sizeof(piece->len), "%lld", (long long)vallen) + vallen + 1; piece++; @@ -550,13 +550,16 @@ static char * fattr_scanattr(struct fattr *fa, int type, const char *attr) { - struct passwd *pw; char *attrend, *attrstart, *end; size_t len; unsigned long attrlen; mode_t modemask; + uid_t pw_uid; + gid_t gr_gid; + int error; char tmp; + error = 0; if (attr == NULL) return (NULL); errno = 0; @@ -604,20 +607,16 @@ goto bad; break; case FA_OWNER: - /* - * XXX - We need to use getpwnam_r() since getpwnam() - * is not thread-safe, and we also need to use a cache. - */ - pw = getpwnam(attrstart); - if (pw != NULL) - fa->uid = pw->pw_uid; + error = uid_name(attrstart, &pw_uid); + if (!error) + fa->uid = pw_uid; else fa->mask &= ~FA_OWNER; break; case FA_GROUP: - pw = getpwnam(attrstart); - if (pw != NULL) - fa->gid = pw->pw_gid; + error = gid_name(attrstart, &gr_gid); + if (!error) + fa->gid = gr_gid; else fa->mask &= ~FA_GROUP; break;