From: Sebastian Wilhelmi Date: Wed, 20 Jan 1999 15:06:46 +0000 (+0000) Subject: Use getpwuid_r with the right signature, if available. X-Git-Tag: GLIB_1_1_14~30 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8c54935c34ce2c7ce47115ab77e3bec05e1645ef;p=platform%2Fupstream%2Fglib.git Use getpwuid_r with the right signature, if available. 1999-01-20 Sebastian Wilhelmi * 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. --- diff --git a/ChangeLog b/ChangeLog index f03398f..faae837 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index f03398f..faae837 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index f03398f..faae837 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index f03398f..faae837 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index f03398f..faae837 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index f03398f..faae837 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index f03398f..faae837 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index f03398f..faae837 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +1999-01-20 Sebastian Wilhelmi + + * 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 * Makefile.am (EXTRA_DIST): Add new Win32 files. diff --git a/acconfig.h b/acconfig.h index 1c0162a..6b2910e 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 1f449ab..d824df7 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 ], + [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 5bcaa49..b19fd44 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 5bcaa49..b19fd44 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 {