X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=31596ddd36c3a3314daa2de1db6db19690b7800a;hb=fb198a1138d32ac7218695c564909d96018eb1b7;hp=ea1e5db0ee31dd192d7661dd2537f9a9c5c30298;hpb=00c76ceaeb0074e47167be56c0920284e6a0360e;p=lttng-tools.git diff --git a/src/common/utils.c b/src/common/utils.c index ea1e5db0e..31596ddd3 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -854,6 +855,46 @@ char *utils_get_home_dir(void) return getenv(DEFAULT_LTTNG_FALLBACK_HOME_ENV_VAR); } +/** + * Get user's home directory. Dynamically allocated, must be freed + * by the caller. + */ +LTTNG_HIDDEN +char *utils_get_user_home_dir(uid_t uid) +{ + struct passwd pwd; + struct passwd *result; + char *home_dir = NULL; + char *buf = NULL; + long buflen; + int ret; + + buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + if (buflen == -1) { + goto end; + } +retry: + buf = zmalloc(buflen); + if (!buf) { + goto end; + } + + ret = getpwuid_r(uid, &pwd, buf, buflen, &result); + if (ret || !result) { + if (ret == ERANGE) { + free(buf); + buflen *= 2; + goto retry; + } + goto end; + } + + home_dir = strdup(pwd.pw_dir); +end: + free(buf); + return home_dir; +} + /* * With the given format, fill dst with the time of len maximum siz. *