+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.
+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.
+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.
+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.
+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.
+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.
+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.
+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.
#undef G_THREAD_SOURCE
+#undef HAVE_GETPWUID_R_POSIX
/* #undef PACKAGE */
/* #undef VERSION */
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
{
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"));
#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
{
{
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"));
#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
{