* 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
#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"
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) { \
--- /dev/null
+/*
+ * 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;
+}