From bb9fb905a1fba832cd3e01b158ecc6c1fcfa0c16 Mon Sep 17 00:00:00 2001 From: Thomas Cort Date: Thu, 7 Jul 2011 21:44:11 +0000 Subject: [PATCH] Move uid/gid<=>name functions into libcompat_minix --- lib/nbsd_libc/gen/pwcache.c | 289 ------------------------------ lib/nbsd_libcompat_minix/Makefile | 5 + lib/nbsd_libcompat_minix/passwd.c | 94 ++++++++++ 3 files changed, 99 insertions(+), 289 deletions(-) create mode 100644 lib/nbsd_libcompat_minix/passwd.c diff --git a/lib/nbsd_libc/gen/pwcache.c b/lib/nbsd_libc/gen/pwcache.c index 2caf96a51..1d3562368 100644 --- a/lib/nbsd_libc/gen/pwcache.c +++ b/lib/nbsd_libc/gen/pwcache.c @@ -59,16 +59,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_NBTOOL_CONFIG_H -#include "nbtool_config.h" -/* - * XXX Undefine the renames of these functions so that we don't - * XXX rename the versions found in the host's by mistake! - */ -#undef group_from_gid -#undef user_from_uid -#endif - #include #if defined(LIBC_SCCS) && !defined(lint) #if 0 @@ -91,18 +81,6 @@ __RCSID("$NetBSD: pwcache.c,v 1.31 2010/03/23 20:28:59 drochner Exp $"); #include #include -#if HAVE_NBTOOL_CONFIG_H -/* XXX Now, re-apply the renaming that we undid above. */ -#define group_from_gid __nbcompat_group_from_gid -#define user_from_uid __nbcompat_user_from_uid -#endif - -#ifdef __weak_alias -__weak_alias(user_from_uid,_user_from_uid) -__weak_alias(group_from_gid,_group_from_gid) -__weak_alias(pwcache_groupdb,_pwcache_groupdb) -#endif - #if !HAVE_PWCACHE_USERDB || HAVE_NBTOOL_CONFIG_H #include "pwcache.h" @@ -248,273 +226,6 @@ grptb_start(void) return (0); } -/* - * user_from_uid() - * caches the name (if any) for the uid. If noname clear, we always - * return the stored name (if valid or invalid match). - * We use a simple hash table. - * Return - * Pointer to stored name (or a empty string) - */ -const char * -user_from_uid(uid_t uid, int noname) -{ - struct passwd *pw; - UIDC *ptr, **pptr; - - if ((uidtb == NULL) && (uidtb_start() < 0)) - return (NULL); - - /* - * see if we have this uid cached - */ - pptr = uidtb + (uid % UID_SZ); - ptr = *pptr; - - if ((ptr != NULL) && (ptr->valid > 0) && (ptr->uid == uid)) { - /* - * have an entry for this uid - */ - if (!noname || (ptr->valid == VALID)) - return (ptr->name); - return (NULL); - } - - /* - * No entry for this uid, we will add it - */ - if (!pwopn) { - if (_pwcache_setpassent != NULL) - (*_pwcache_setpassent)(1); - ++pwopn; - } - - if (ptr == NULL) - *pptr = ptr = (UIDC *)malloc(sizeof(UIDC)); - - if ((pw = (*_pwcache_getpwuid)(uid)) == NULL) { - /* - * no match for this uid in the local password file - * a string that is the uid in numeric format - */ - if (ptr == NULL) - return (NULL); - ptr->uid = uid; - (void)snprintf(ptr->name, UNMLEN, "%lu", (long) uid); - ptr->valid = INVALID; - if (noname) - return (NULL); - } else { - /* - * there is an entry for this uid in the password file - */ - if (ptr == NULL) - return (pw->pw_name); - ptr->uid = uid; - (void)strlcpy(ptr->name, pw->pw_name, UNMLEN); - ptr->valid = VALID; - } - return (ptr->name); -} - -/* - * group_from_gid() - * caches the name (if any) for the gid. If noname clear, we always - * return the stored name (if valid or invalid match). - * We use a simple hash table. - * Return - * Pointer to stored name (or a empty string) - */ -const char * -group_from_gid(gid_t gid, int noname) -{ - struct group *gr; - GIDC *ptr, **pptr; - - if ((gidtb == NULL) && (gidtb_start() < 0)) - return (NULL); - - /* - * see if we have this gid cached - */ - pptr = gidtb + (gid % GID_SZ); - ptr = *pptr; - - if ((ptr != NULL) && (ptr->valid > 0) && (ptr->gid == gid)) { - /* - * have an entry for this gid - */ - if (!noname || (ptr->valid == VALID)) - return (ptr->name); - return (NULL); - } - - /* - * No entry for this gid, we will add it - */ - if (!gropn) { - if (_pwcache_setgroupent != NULL) - (*_pwcache_setgroupent)(1); - ++gropn; - } - - if (ptr == NULL) - *pptr = ptr = (GIDC *)malloc(sizeof(GIDC)); - - if ((gr = (*_pwcache_getgrgid)(gid)) == NULL) { - /* - * no match for this gid in the local group file, put in - * a string that is the gid in numberic format - */ - if (ptr == NULL) - return (NULL); - ptr->gid = gid; - (void)snprintf(ptr->name, GNMLEN, "%lu", (long) gid); - ptr->valid = INVALID; - if (noname) - return (NULL); - } else { - /* - * there is an entry for this group in the group file - */ - if (ptr == NULL) - return (gr->gr_name); - ptr->gid = gid; - (void)strlcpy(ptr->name, gr->gr_name, GNMLEN); - ptr->valid = VALID; - } - return (ptr->name); -} - -/* - * uid_from_user() - * caches the uid for a given user name. We use a simple hash table. - * Return - * the uid (if any) for a user name, or a -1 if no match can be found - */ -int -uid_from_user(const char *name, uid_t *uid) -{ - struct passwd *pw; - UIDC *ptr, **pptr; - size_t namelen; - - /* - * return -1 for mangled names - */ - if (name == NULL || ((namelen = strlen(name)) == 0)) - return (-1); - if ((usrtb == NULL) && (usrtb_start() < 0)) - return (-1); - - /* - * look up in hash table, if found and valid return the uid, - * if found and invalid, return a -1 - */ - pptr = usrtb + st_hash(name, namelen, UNM_SZ); - ptr = *pptr; - - if ((ptr != NULL) && (ptr->valid > 0) && !strcmp(name, ptr->name)) { - if (ptr->valid == INVALID) - return (-1); - *uid = ptr->uid; - return (0); - } - - if (!pwopn) { - if (_pwcache_setpassent != NULL) - (*_pwcache_setpassent)(1); - ++pwopn; - } - - if (ptr == NULL) - *pptr = ptr = (UIDC *)malloc(sizeof(UIDC)); - - /* - * no match, look it up, if no match store it as an invalid entry, - * or store the matching uid - */ - if (ptr == NULL) { - if ((pw = (*_pwcache_getpwnam)(name)) == NULL) - return (-1); - *uid = pw->pw_uid; - return (0); - } - (void)strlcpy(ptr->name, name, UNMLEN); - if ((pw = (*_pwcache_getpwnam)(name)) == NULL) { - ptr->valid = INVALID; - return (-1); - } - ptr->valid = VALID; - *uid = ptr->uid = pw->pw_uid; - return (0); -} - -/* - * gid_from_group() - * caches the gid for a given group name. We use a simple hash table. - * Return - * the gid (if any) for a group name, or a -1 if no match can be found - */ -int -gid_from_group(const char *name, gid_t *gid) -{ - struct group *gr; - GIDC *ptr, **pptr; - size_t namelen; - - /* - * return -1 for mangled names - */ - if (name == NULL || ((namelen = strlen(name)) == 0)) - return (-1); - if ((grptb == NULL) && (grptb_start() < 0)) - return (-1); - - /* - * look up in hash table, if found and valid return the uid, - * if found and invalid, return a -1 - */ - pptr = grptb + st_hash(name, namelen, GID_SZ); - ptr = *pptr; - - if ((ptr != NULL) && (ptr->valid > 0) && !strcmp(name, ptr->name)) { - if (ptr->valid == INVALID) - return (-1); - *gid = ptr->gid; - return (0); - } - - if (!gropn) { - if (_pwcache_setgroupent != NULL) - (*_pwcache_setgroupent)(1); - ++gropn; - } - - if (ptr == NULL) - *pptr = ptr = (GIDC *)malloc(sizeof(GIDC)); - - /* - * no match, look it up, if no match store it as an invalid entry, - * or store the matching gid - */ - if (ptr == NULL) { - if ((gr = (*_pwcache_getgrnam)(name)) == NULL) - return (-1); - *gid = gr->gr_gid; - return (0); - } - - (void)strlcpy(ptr->name, name, GNMLEN); - if ((gr = (*_pwcache_getgrnam)(name)) == NULL) { - ptr->valid = INVALID; - return (-1); - } - ptr->valid = VALID; - *gid = ptr->gid = gr->gr_gid; - return (0); -} - #define FLUSHTB(arr, len, fail) \ do { \ if (arr != NULL) { \ diff --git a/lib/nbsd_libcompat_minix/Makefile b/lib/nbsd_libcompat_minix/Makefile index 2d14039b0..f91adba7a 100644 --- a/lib/nbsd_libcompat_minix/Makefile +++ b/lib/nbsd_libcompat_minix/Makefile @@ -42,6 +42,11 @@ SRCS+= fttyslot.c # Now considered "compat" feature in NetBSD. SRCS+= cuserid.c +# XXX: hack +# user_from_uid(), uid_from_user() +# group_from_gid(), gid_from_group() +SRCS+= passwd.c + .include "include/Makefile.inc" .include diff --git a/lib/nbsd_libcompat_minix/passwd.c b/lib/nbsd_libcompat_minix/passwd.c new file mode 100644 index 000000000..119faf160 --- /dev/null +++ b/lib/nbsd_libcompat_minix/passwd.c @@ -0,0 +1,94 @@ +/* + * grotesque hack to get these functions working. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * group_from_gid() + * caches the name (if any) for the gid. If noname clear, we always + * return the stored name (if valid or invalid match). + * We use a simple hash table. + * Return + * Pointer to stored name (or a empty string) + */ +const char * +group_from_gid(gid_t gid, int noname) +{ + static char buf[16]; + struct group *g = getgrgid(gid); + if (g == NULL) { + if (noname) { + return NULL; + } else { + sprintf(buf, "%d", gid); + return buf; + } + } + return g->gr_name; +} + +/* + * user_from_uid() + * caches the name (if any) for the uid. If noname clear, we always + * return the stored name (if valid or invalid match). + * We use a simple hash table. + * Return + * Pointer to stored name (or a empty string) + */ +const char * +user_from_uid(uid_t uid, int noname) +{ + static char buf[16]; + struct passwd *p = getpwuid(uid); + if (p == NULL) { + if (noname) { + return NULL; + } else { + sprintf(buf, "%d", uid); + return buf; + } + } + return p->pw_name; +} + +/* + * uid_from_user() + * caches the uid for a given user name. We use a simple hash table. + * Return + * the uid (if any) for a user name, or a -1 if no match can be found + */ +int +uid_from_user(const char *name, uid_t *uid) +{ + struct passwd *p = getpwnam(name); + if (p == NULL) { + return -1; + } + *uid = p->pw_uid; + return *uid; +} + +/* + * gid_from_group() + * caches the gid for a given group name. We use a simple hash table. + * Return + * the gid (if any) for a group name, or a -1 if no match can be found + */ +int +gid_from_group(const char *name, gid_t *gid) +{ + struct group *g = getgrnam(name); + if (g == NULL) { + return -1; + } + *gid = g->gr_gid; + return *gid; +} -- 2.44.0