Fix username lookup in case of missing USER environment variable
authorDariusz Ostolski <dariusz.ostolski@gmail.com>
Tue, 19 Sep 2017 20:23:53 +0000 (22:23 +0200)
committerDariusz Ostolski <dariusz.ostolski@gmail.com>
Tue, 19 Sep 2017 20:23:53 +0000 (22:23 +0200)
configure.ac
src/utilities.cc

index 69711b7..6a19cd0 100644 (file)
@@ -31,6 +31,7 @@ AC_HEADER_STDC
 AC_CHECK_HEADER(stdint.h, ac_cv_have_stdint_h=1, ac_cv_have_stdint_h=0)
 AC_CHECK_HEADER(sys/types.h, ac_cv_have_systypes_h=1, ac_cv_have_systypes_h=0)
 AC_CHECK_HEADER(inttypes.h, ac_cv_have_inttypes_h=1, ac_cv_have_inttypes_h=0)
+AC_CHECK_HEADER(pwd.h, ac_cv_have_pwd_h=1, ac_cv_have_pwd_h=0)
 AC_CHECK_HEADERS(unistd.h, ac_cv_have_unistd_h=1, ac_cv_have_unistd_h=0)
 AC_CHECK_HEADERS(syscall.h)
 AC_CHECK_HEADERS(sys/syscall.h)
index 9d5b123..1a3c7e1 100644 (file)
 #ifdef HAVE_SYSLOG_H
 # include <syslog.h>
 #endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>  // For geteuid.
+#endif
+#ifdef HAVE_PWD_H
+# include <pwd.h>
+#endif
 
 #include "base/googleinit.h"
 
@@ -299,8 +305,26 @@ static void MyUserNameInitializer() {
   if (user != NULL) {
     g_my_user_name = user;
   } else {
-    g_my_user_name = "invalid-user";
+#if defined(HAVE_PWD_H) && defined(HAVE_UNISTD_H)
+    uid_t uid;
+    struct passwd pwd;
+    struct passwd*result = NULL;
+    char buffer[1024] = {'\0'};
+    uid = geteuid();
+    int pwuid_res = getpwuid_r(uid, &pwd, buffer, sizeof (buffer), &result);
+    if(pwuid_res == 0) {
+      g_my_user_name = pwd.pw_name;
+    }
+    else {
+      snprintf(buffer, sizeof(buffer), "uid%d", uid);
+      g_my_user_name = buffer;
+    }
+#endif
+    if(g_my_user_name.empty()) {
+      g_my_user_name = "invalid-user";
+    }
   }
+
 }
 REGISTER_MODULE_INITIALIZER(utilities, MyUserNameInitializer());