]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
getgrnam_r and getpwnam_r might not exist, so fallback to the older
authorJoerg Sonnenberger <joerg.sonnenberger@gmail.com>
Wed, 31 Mar 2010 13:56:55 +0000 (09:56 -0400)
committerJoerg Sonnenberger <joerg.sonnenberger@gmail.com>
Wed, 31 Mar 2010 13:56:55 +0000 (09:56 -0400)
non-reentrant getgrnam and getpwnam in that case. Based on patch
from Hauke Fath.

SVN-Revision: 2058

CMakeLists.txt
configure.ac
libarchive/archive_write_disk_set_standard_lookup.c

index 44c6a3f07bccfc8be008346e2a6f38efd17c07cc..74737787c6d826e27e8f82ab6241080f9fac5a96 100644 (file)
@@ -387,6 +387,8 @@ CHECK_FUNCTION_EXISTS_GLIBC(ftruncate HAVE_FTRUNCATE)
 CHECK_FUNCTION_EXISTS_GLIBC(futimens HAVE_FUTIMENS)
 CHECK_FUNCTION_EXISTS_GLIBC(futimes HAVE_FUTIMES)
 CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID)
+CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R)
+CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R)
 CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
 CHECK_FUNCTION_EXISTS_GLIBC(lchflags HAVE_LCHFLAGS)
 CHECK_FUNCTION_EXISTS_GLIBC(lchmod HAVE_LCHMOD)
index 51f27c348b9eed289de542d29fc4630fe542c064..26f836b35a7279303799685beae7518d6566684c 100644 (file)
@@ -400,6 +400,7 @@ AC_CHECK_STDCALL_FUNC([CreateHardLinkA],[const char *, const char *, void *])
 AC_CHECK_FUNCS([chflags chown chroot ctime_r])
 AC_CHECK_FUNCS([fchdir fchflags fchmod fchown fcntl fork])
 AC_CHECK_FUNCS([fstat ftruncate futimens futimes geteuid getpid])
+AC_CHECK_FUNCS([getgrnam_r getpwnam_r])
 AC_CHECK_FUNCS([lchflags lchmod lchown link localtime_r lstat])
 AC_CHECK_FUNCS([lutimes mbrtowc memmove memset mkdir mkfifo mknod mkstemp])
 AC_CHECK_FUNCS([nl_langinfo pipe poll readlink])
index e7a81e75513b0122dcc4df02637f10b422cb3442..ce9b7923e1e5e8c08a31636bf5f969871b494972 100644 (file)
@@ -127,6 +127,7 @@ lookup_gid(void *private_data, const char *gname, int64_t gid)
        /* Note: If strdup fails, that's okay; we just won't cache. */
        b->hash = h;
 #if HAVE_GRP_H
+#  if HAVE_GETGRNAM_R
        {
                char _buffer[128];
                size_t bufsize = 128;
@@ -153,6 +154,15 @@ lookup_gid(void *private_data, const char *gname, int64_t gid)
                if (buffer != _buffer)
                        free(buffer);
        }
+#  else /* HAVE_GETGRNAM_R */
+       {
+               struct group *result;
+
+               result = getgrnam(gname);
+               if (result != NULL)
+                       gid = result->gr_gid;
+       }
+#  endif /* HAVE_GETGRNAM_R */
 #elif defined(_WIN32) && !defined(__CYGWIN__)
        /* TODO: do a gname->gid lookup for Windows. */
 #else
@@ -192,6 +202,7 @@ lookup_uid(void *private_data, const char *uname, int64_t uid)
        /* Note: If strdup fails, that's okay; we just won't cache. */
        b->hash = h;
 #if HAVE_PWD_H
+#  if HAVE_GETPWNAM_R
        {
                char _buffer[128];
                size_t bufsize = 128;
@@ -218,6 +229,15 @@ lookup_uid(void *private_data, const char *uname, int64_t uid)
                if (buffer != _buffer)
                        free(buffer);
        }
+#  else /* HAVE_GETPWNAM_R */
+       {
+               struct passwd *result;
+
+               result = getpwnam(uname);
+               if (result != NULL)
+                       uid = result->pw_uid;
+       }
+#endif /* HAVE_GETPWNAM_R */
 #elif defined(_WIN32) && !defined(__CYGWIN__)
        /* TODO: do a uname->uid lookup for Windows. */
 #else