--- pinba.cc 2010-11-26 10:05:25.000000000 +0100 +++ pinba.cc 2011-03-18 14:27:34.000000000 +0100 @@ -103,6 +103,7 @@ #define timeval_cvt(a, b) do { (a)->tv_sec = (b)->tv_sec; (a)->tv_usec = (b)->tv_usec; } while (0); #define timeval_to_float(t) (float)(t).tv_sec + (float)(t).tv_usec / 1000000.0 +#define min(a, b) (a < b ? a : b) /* {{{ internal funcs */ @@ -1255,7 +1256,7 @@ PHP_FE(pinba_timer_get_info, NULL) PHP_FE(pinba_timers_stop, NULL) PHP_FE(pinba_script_name_set, NULL) - PHP_FE(pinba_hostname_set, NULL) + //PHP_FE(pinba_hostname_set, NULL) {NULL, NULL, NULL} }; /* }}} */ @@ -1396,6 +1397,17 @@ zval **tmp; struct timeval t; struct rusage u; + zval suexec_user; + uid_t euid; + int user_len; + struct passwd *pw = NULL; +#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R) + struct passwd _pw; + struct passwd *retpwptr = NULL; + long pwbuflen; + char *pwbuf = NULL; + int ret; +#endif PINBA_G(timers_stopped) = 0; @@ -1420,13 +1432,45 @@ PINBA_G(server_name) = NULL; PINBA_G(script_name) = NULL; - gethostname(PINBA_G(host_name), sizeof(PINBA_G(host_name))); - PINBA_G(host_name)[sizeof(PINBA_G(host_name))] = '\0'; - #if PHP_MAJOR_VERSION >= 5 zend_is_auto_global("_SERVER", sizeof("_SERVER") - 1 TSRMLS_CC); #endif + PINBA_G(host_name)[0] = '\0'; + if (zend_get_constant("SUEXEC_USER", sizeof("SUEXEC_USER") - 1, &suexec_user TSRMLS_CC)) { + if (Z_TYPE(suexec_user) == IS_STRING && Z_STRLEN(suexec_user) != 0) { + user_len = min(Z_STRLEN(suexec_user), sizeof(PINBA_G(host_name))); + memcpy(PINBA_G(host_name), Z_STRVAL(suexec_user), user_len); + PINBA_G(host_name)[user_len] = '\0'; + } + zval_dtor(&suexec_user); + } + if (PINBA_G(host_name)[0] == '\0') { + euid = geteuid(); +#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R) + pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX); + if (pwbuflen > 1) { + pwbuf = (char *)emalloc(pwbuflen); + ret = getpwuid_r(euid, &_pw, pwbuf, pwbuflen, &retpwptr); + if (ret == 0 && retpwptr != NULL) { + pw = &_pw; + } + } +#else + pw = getpwuid(euid); +#endif + if (pw != NULL) { + user_len = (pw->pw_name == NULL) ? 0 : min(strlen(pw->pw_name), sizeof(PINBA_G(host_name))); + memcpy(PINBA_G(host_name), pw->pw_name, user_len); + PINBA_G(host_name)[user_len] = '\0'; + } +#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R) + if (pwbuf != NULL) { + efree(pwbuf); + } +#endif + } + if (PG(http_globals)[TRACK_VARS_SERVER] && zend_hash_find(HASH_OF(PG(http_globals)[TRACK_VARS_SERVER]), "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &tmp) != FAILURE && Z_TYPE_PP(tmp) == IS_STRING && Z_STRLEN_PP(tmp) > 0) { PINBA_G(script_name) = estrndup(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); }