2005-12-04 Matthias Clasen <mclasen@redhat.com>
+ Handle multiple user names with the same UID better.
+ (#319535, Laszlo Peter)
+
+ * glib/gutils.c (g_get_any_init_do): When determining user
+ data, first look up $LOGNAME. If the UID doesn't match
+ getuid(), fall back to the current behaviour of looking
+ up the user data based on getuid().
+
+2005-12-04 Matthias Clasen <mclasen@redhat.com>
+
* glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro
to make gcc warn if a function result is ignored. (#145466,
Arjan van de Ven, Alex Larsson)
2005-12-04 Matthias Clasen <mclasen@redhat.com>
+ Handle multiple user names with the same UID better.
+ (#319535, Laszlo Peter)
+
+ * glib/gutils.c (g_get_any_init_do): When determining user
+ data, first look up $LOGNAME. If the UID doesn't match
+ getuid(), fall back to the current behaviour of looking
+ up the user data based on getuid().
+
+2005-12-04 Matthias Clasen <mclasen@redhat.com>
+
* glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro
to make gcc warn if a function result is ignored. (#145466,
Arjan van de Ven, Alex Larsson)
2005-12-04 Matthias Clasen <mclasen@redhat.com>
+ Handle multiple user names with the same UID better.
+ (#319535, Laszlo Peter)
+
+ * glib/gutils.c (g_get_any_init_do): When determining user
+ data, first look up $LOGNAME. If the UID doesn't match
+ getuid(), fall back to the current behaviour of looking
+ up the user data based on getuid().
+
+2005-12-04 Matthias Clasen <mclasen@redhat.com>
+
* glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro
to make gcc warn if a function result is ignored. (#145466,
Arjan van de Ven, Alex Larsson)
struct passwd *pw = NULL;
gpointer buffer = NULL;
gint error;
-
+ gchar *logname;
+
# if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R)
struct passwd pwd;
# ifdef _SC_GETPW_R_SIZE_MAX
# else /* _SC_GETPW_R_SIZE_MAX */
glong bufsize = 64;
# endif /* _SC_GETPW_R_SIZE_MAX */
-
+
+ logname = (gchar *) g_getenv ("LOGNAME");
+
do
{
g_free (buffer);
errno = 0;
# ifdef HAVE_POSIX_GETPWUID_R
- error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+ if (logname) {
+ error = getpwnam_r (logname, &pwd, buffer, bufsize, &pw);
+ if (!pw || (pw->pw_uid != getuid ())) {
+ /* LOGNAME is lying, fall back to looking up the uid */
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+ }
+ } else {
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+ }
error = error < 0 ? errno : error;
# else /* HAVE_NONPOSIX_GETPWUID_R */
/* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */
error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
pw = error == 0 ? &pwd : NULL;
# else /* !_AIX */
- pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ if (logname) {
+ pw = getpwnam_r (logname, &pwd, buffer, bufsize);
+ if (!pw || (pw->pw_uid != getuid ())) {
+ /* LOGNAME is lying, fall back to looking up the uid */
+ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ }
+ } else {
+ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ }
error = pw ? 0 : errno;
# endif /* !_AIX */
# endif /* HAVE_NONPOSIX_GETPWUID_R */