Use getpwuid_r with the right signature, if available.
authorSebastian Wilhelmi <wilhelmi@ira.uka.de>
Wed, 20 Jan 1999 15:06:46 +0000 (15:06 +0000)
committerSebastian Wilhelmi <wilhelmi@src.gnome.org>
Wed, 20 Jan 1999 15:06:46 +0000 (15:06 +0000)
1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

* gutils.c (g_get_any_init): Use getpwuid_r with the right
signature, if available.

* configure.in, acconfig.h: Test for existance of getpwuid_r and
its signature.

12 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
acconfig.h
configure.in
glib/gutils.c
gutils.c

index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index f03398f2ebe23a7d814335800a6a2f1177416fd6..faae837e490dd4f5c1c83f6f44e760e95a5da8c8 100644 (file)
@@ -1,3 +1,11 @@
+1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Use getpwuid_r with the right
+       signature, if available.
+
+       * configure.in, acconfig.h: Test for existance of getpwuid_r and
+       its signature.
+
 Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
        
        * Makefile.am (EXTRA_DIST): Add new Win32 files.
index 1c0162a10510d0eed811073e8ca6bf268f0421fc..6b2910ef4309a0d70eeabe34a972424834d89f1b 100644 (file)
@@ -92,6 +92,7 @@
 
 #undef G_THREAD_SOURCE
 
+#undef HAVE_GETPWUID_R_POSIX
 /* #undef PACKAGE */
 /* #undef VERSION */
 
index 1f449abc44c0395185da187e1522dc67f1bbaa0c..d824df724254cf5bf134738db4bff28374b9a037 100644 (file)
@@ -685,6 +685,21 @@ if test x"$have_threads" != xnone; then
        glib_save_LIBS="$LIBS"
        LIBS="$LIBS $G_THREAD_LIBS"
        AC_CHECK_FUNCS(localtime_r rand_r)
+       if test "$ac_cv_header_pwd_h" = "yes"; then
+               AC_CHECK_FUNCS(getpwuid_r)
+               if test "$ac_cv_func_getpwuid_r" = "yes"; then
+                       AC_MSG_CHECKING(whether getpwuid_r is posix like)
+                       # getpwuid_r(0, NULL, NULL, 0) is the signature on
+                       # solaris, if that is not found, the prog below won't 
+                       # compile, then the posix signature is assumed as 
+                       # the default.
+                       AC_TRY_COMPILE([#include <pwd.h>],
+                               [getpwuid_r(0, NULL, NULL, 0);],
+                               [AC_MSG_RESULT(no)],
+                               [AC_MSG_RESULT(yes)
+                               AC_DEFINE(HAVE_GETPWUID_R_POSIX)])
+               fi
+       fi
        LIBS="$glib_save_LIBS"
 fi
 
index 5bcaa492afb7d59a847a29d3e17a0156822532d1..b19fd447bea234f88a7f14d311988e7be79f0743 100644 (file)
@@ -384,10 +384,6 @@ g_get_any_init (void)
 {
   if (!g_tmp_dir)
     {
-#ifdef HAVE_PWD_H
-      struct passwd *pw;
-#endif
-
       g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
       if (!g_tmp_dir)
        g_tmp_dir = g_strdup (g_getenv ("TMP"));
@@ -439,30 +435,50 @@ g_get_any_init (void)
 #endif
       
 #ifdef HAVE_PWD_H
-      /* FIXME: we must actually use the getpwuid_r function here, as
-        getpwuid is not MT-safe, but the prototype doesn't seem to be
-        agreed upon on the different systems, i.e. it is
-
-        struct passwd *getpwuid_r(uid_t uid, struct passwd * pwd, 
-                                  char *buffer, int buflen); 
-
-         on solaris, but 
-        
-        int getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, 
-                       size_t bufsize  struct passwd **result); 
-         on posix. weird. */
-      setpwent ();
-      pw = getpwuid (getuid ());
-      endpwent ();
-      
-      if (pw)
-       {
-         g_user_name = g_strdup (pw->pw_name);
-         g_real_name = g_strdup (pw->pw_gecos);
-         if (!g_home_dir)
-           g_home_dir = g_strdup (pw->pw_dir);
-       }
+      {
+       struct passwd *pw = NULL, pwd;
+       gpointer buffer = NULL;
+       guint bufsize = sizeof (struct passwd);
+#  ifdef HAVE_GETPWUID_R 
+       while (TRUE)
+         {
+           int error = 0;
+           buffer = g_realloc (buffer, bufsize);
+#    ifdef HAVE_GETPWUID_R_POSIX
+           error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+           if (error == 0)
+             break;
+#    else /* HAVE_GETPWUID_R_POSIX */
+           pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+           if (pw)
+             break;
+           error = errno;
+#    endif /* HAVE_GETPWUID_R_POSIX */
+           if (error != ERANGE)
+             g_error( "Could not read account information: %s", 
+                      g_strerror (error));
+           bufsize *= 2;
+         }
+#  else /* HAVE_GETPWUID_R */
+#    if defined(G_THREADS_ENABLED) && defined(__GNUC__)
+#    warning "the `g_get_(user_name|real_name|home_dir|tmp_dir)'"
+#    warning "functions will not be MT-safe at their first call"
+#    warning "because there is no `getpwuid_r' on your system."
+#    endif
+       setpwent ();
+       pw = getpwuid (getuid ());
+       endpwent ();
+#  endif /* HAVE_GETPWUID_R */
+       
+       if (pw)
+         {
+           g_user_name = g_strdup (pw->pw_name);
+           g_real_name = g_strdup (pw->pw_gecos);
+           if (!g_home_dir)
+             g_home_dir = g_strdup (pw->pw_dir);
+         }
+       g_free (buffer);
+      }
 #else /* !HAVE_PWD_H */
 #  ifdef NATIVE_WIN32
       {
index 5bcaa492afb7d59a847a29d3e17a0156822532d1..b19fd447bea234f88a7f14d311988e7be79f0743 100644 (file)
--- a/gutils.c
+++ b/gutils.c
@@ -384,10 +384,6 @@ g_get_any_init (void)
 {
   if (!g_tmp_dir)
     {
-#ifdef HAVE_PWD_H
-      struct passwd *pw;
-#endif
-
       g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
       if (!g_tmp_dir)
        g_tmp_dir = g_strdup (g_getenv ("TMP"));
@@ -439,30 +435,50 @@ g_get_any_init (void)
 #endif
       
 #ifdef HAVE_PWD_H
-      /* FIXME: we must actually use the getpwuid_r function here, as
-        getpwuid is not MT-safe, but the prototype doesn't seem to be
-        agreed upon on the different systems, i.e. it is
-
-        struct passwd *getpwuid_r(uid_t uid, struct passwd * pwd, 
-                                  char *buffer, int buflen); 
-
-         on solaris, but 
-        
-        int getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, 
-                       size_t bufsize  struct passwd **result); 
-         on posix. weird. */
-      setpwent ();
-      pw = getpwuid (getuid ());
-      endpwent ();
-      
-      if (pw)
-       {
-         g_user_name = g_strdup (pw->pw_name);
-         g_real_name = g_strdup (pw->pw_gecos);
-         if (!g_home_dir)
-           g_home_dir = g_strdup (pw->pw_dir);
-       }
+      {
+       struct passwd *pw = NULL, pwd;
+       gpointer buffer = NULL;
+       guint bufsize = sizeof (struct passwd);
+#  ifdef HAVE_GETPWUID_R 
+       while (TRUE)
+         {
+           int error = 0;
+           buffer = g_realloc (buffer, bufsize);
+#    ifdef HAVE_GETPWUID_R_POSIX
+           error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+           if (error == 0)
+             break;
+#    else /* HAVE_GETPWUID_R_POSIX */
+           pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+           if (pw)
+             break;
+           error = errno;
+#    endif /* HAVE_GETPWUID_R_POSIX */
+           if (error != ERANGE)
+             g_error( "Could not read account information: %s", 
+                      g_strerror (error));
+           bufsize *= 2;
+         }
+#  else /* HAVE_GETPWUID_R */
+#    if defined(G_THREADS_ENABLED) && defined(__GNUC__)
+#    warning "the `g_get_(user_name|real_name|home_dir|tmp_dir)'"
+#    warning "functions will not be MT-safe at their first call"
+#    warning "because there is no `getpwuid_r' on your system."
+#    endif
+       setpwent ();
+       pw = getpwuid (getuid ());
+       endpwent ();
+#  endif /* HAVE_GETPWUID_R */
+       
+       if (pw)
+         {
+           g_user_name = g_strdup (pw->pw_name);
+           g_real_name = g_strdup (pw->pw_gecos);
+           if (!g_home_dir)
+             g_home_dir = g_strdup (pw->pw_dir);
+         }
+       g_free (buffer);
+      }
 #else /* !HAVE_PWD_H */
 #  ifdef NATIVE_WIN32
       {