]> Zhao Yanbai Git Server - minix.git/commitdiff
Move uid/gid<=>name functions into libcompat_minix
authorThomas Cort <tcort@minix3.org>
Thu, 7 Jul 2011 21:44:11 +0000 (21:44 +0000)
committerBen Gras <ben@minix3.org>
Thu, 14 Jul 2011 01:07:22 +0000 (03:07 +0200)
lib/nbsd_libc/gen/pwcache.c
lib/nbsd_libcompat_minix/Makefile
lib/nbsd_libcompat_minix/passwd.c [new file with mode: 0644]

index 2caf96a515a78dafddd6c04d9ac85387b9cbdb9b..1d35623682597bba535a29ad99dcbb324168c70f 100644 (file)
  * 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 <pwd.h> by mistake!
- */
-#undef group_from_gid
-#undef user_from_uid
-#endif
-
 #include <sys/cdefs.h>
 #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 <string.h>
 #include <unistd.h>
 
-#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) {                      \
index 2d14039b094604ff44f076e840d5ee9a41f9a52f..f91adba7a5e1ba72a6caecb6655f068543613991 100644 (file)
@@ -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 <bsd.own.mk>
diff --git a/lib/nbsd_libcompat_minix/passwd.c b/lib/nbsd_libcompat_minix/passwd.c
new file mode 100644 (file)
index 0000000..119faf1
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * grotesque hack to get these functions working.
+ */
+
+#include <sys/types.h>
+#include <compat/pwd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <pwd.h>
+#include <grp.h>
+
+/*
+ * 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;
+}