summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Wilhelmi <wilhelmi@ira.uka.de>1999-01-20 15:06:46 +0000
committerSebastian Wilhelmi <wilhelmi@src.gnome.org>1999-01-20 15:06:46 +0000
commit8c54935c34ce2c7ce47115ab77e3bec05e1645ef (patch)
tree4bea93c8fdb26ffc67412b8d3041910c30c97958
parent32dbc0d51c95a3bb185523ad6fd1ecae2b5ea83c (diff)
downloadglib-8c54935c34ce2c7ce47115ab77e3bec05e1645ef.tar.gz
Use getpwuid_r with the right signature, if available.
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.
-rw-r--r--ChangeLog8
-rw-r--r--ChangeLog.pre-2-08
-rw-r--r--ChangeLog.pre-2-108
-rw-r--r--ChangeLog.pre-2-128
-rw-r--r--ChangeLog.pre-2-28
-rw-r--r--ChangeLog.pre-2-48
-rw-r--r--ChangeLog.pre-2-68
-rw-r--r--ChangeLog.pre-2-88
-rw-r--r--acconfig.h1
-rw-r--r--configure.in15
-rw-r--r--glib/gutils.c72
-rw-r--r--gutils.c72
12 files changed, 168 insertions, 56 deletions
diff --git a/ChangeLog b/ChangeLog
index f03398f2e..faae837e4 100644
--- 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.
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index f03398f2e..faae837e4 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -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.
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index f03398f2e..faae837e4 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -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.
diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12
index f03398f2e..faae837e4 100644
--- a/ChangeLog.pre-2-12
+++ b/ChangeLog.pre-2-12
@@ -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.
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index f03398f2e..faae837e4 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -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.
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index f03398f2e..faae837e4 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -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.
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index f03398f2e..faae837e4 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -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.
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index f03398f2e..faae837e4 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -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.
diff --git a/acconfig.h b/acconfig.h
index 1c0162a10..6b2910ef4 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -92,6 +92,7 @@
#undef G_THREAD_SOURCE
+#undef HAVE_GETPWUID_R_POSIX
/* #undef PACKAGE */
/* #undef VERSION */
diff --git a/configure.in b/configure.in
index 1f449abc4..d824df724 100644
--- a/configure.in
+++ b/configure.in
@@ -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
diff --git a/glib/gutils.c b/glib/gutils.c
index 5bcaa492a..b19fd447b 100644
--- a/glib/gutils.c
+++ b/glib/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
{
diff --git a/gutils.c b/gutils.c
index 5bcaa492a..b19fd447b 100644
--- 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
{