diff options
author | Mattias Andrée <maandree@kth.se> | 2020-06-20 20:34:44 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2020-06-20 20:34:44 +0200 |
commit | 19fb6de1c1e47c03b611ac7a0b7636b85ab20118 (patch) | |
tree | 2f49c65d17c43239a85513c6f4cffed591e9083e /libaxl_connect.c | |
parent | Change libaxl_protocol_version_major, libaxl_protocol_version_minor, and libaxl_protocol_version into variables (diff) | |
download | libaxl-19fb6de1c1e47c03b611ac7a0b7636b85ab20118.tar.gz libaxl-19fb6de1c1e47c03b611ac7a0b7636b85ab20118.tar.bz2 libaxl-19fb6de1c1e47c03b611ac7a0b7636b85ab20118.tar.xz |
Misc.
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r-- | libaxl_connect.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/libaxl_connect.c b/libaxl_connect.c index ee4edd8..529295d 100644 --- a/libaxl_connect.c +++ b/libaxl_connect.c @@ -13,11 +13,36 @@ static char * path_in_home(const char *filename) { const char *home; - char *ret; + struct passwd *pwd, pwd_buf; + size_t buf_size; + char *buf, *ret; + int r; home = getenv("HOME"); - if (!home || !*home) { /* TODO */ - abort(); + if (!home || !*home) { + buf_size = sysconf(_SC_GETPW_R_SIZE_MAX); + buf_size = buf_size == -1 ? 16384 : buf_size; + buf = alloca(buf_size); + r = getpwuid_r(getuid(), &pwd_buf, buf, buf_size, &pwd); + if (!pwd) { + liberror_save_backtrace(NULL); + r = (r == ENOENT || r == ESRCH || r == EBADF || r == EPERM || r == EIO /* glibc bug */) ? 0 : r; + if (r) { + liberror_set_error_errno(strerror(r), "getpwuid_r", r); + } else { + liberror_set_error_errno("User does not exist", "getpwuid_r", "libaxl", + LIBAXL_ERROR_USER_DOES_NOT_EXIST); + } + return NULL; + } else { + home = pwd->pw_dir; + if (!home || !*home) { + liberror_save_backtrace(NULL); + liberror_set_error_errno("User does not have a home", "libaxl_connect", "libaxl", + LIBAXL_ERROR_USER_DOES_NOT_HAVE_A_HOME); + return NULL; + } + } } ret = liberror_malloc(strlen(home) + strlen(filename) + 2); |