X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils%2Fos.c;h=2b6a51460a67f89122dbee5ec7d75d70e2b3fe82;hb=1886cc190cfbd37daf047194fd1a2f5c13a15d64;hp=4afc466683138aed81667a446638698bbe96da91;hpb=05f5ac1f08dfe0d8f7216390a103ec58788c8ef9;p=sysdb.git diff --git a/src/utils/os.c b/src/utils/os.c index 4afc466..2b6a514 100644 --- a/src/utils/os.c +++ b/src/utils/os.c @@ -53,6 +53,60 @@ * public API */ +char * +sdb_get_homedir(void) +{ + char *username = sdb_get_current_user(); + + struct passwd pw_entry; + struct passwd *result = NULL; + + char buf[4096]; + + int status; + + if (username) { + memset(&pw_entry, 0, sizeof(pw_entry)); + status = getpwnam_r(username, &pw_entry, buf, sizeof(buf), &result); + } + else + status = -1; + + if (status || (! result)) { + char errbuf[1024]; + sdb_log(SDB_LOG_WARNING, "os: Failed to determine home directory " + "for user %s: %s", username, + sdb_strerror(errno, errbuf, sizeof(errbuf))); + free(username); + return NULL; + } + free(username); + return strdup(result->pw_dir); +} /* sdb_get_homedir */ + +char * +sdb_realpath(const char *path) +{ + if (! path) + return NULL; + + if ((strlen(path) >= 2) && (path[0] == '~') && (path[1] == '/')) { + char *homedir = sdb_get_homedir(); + char tmp[(homedir ? strlen(homedir) : 0) + strlen(path)]; + char *ret; + + if (! homedir) + return NULL; + + snprintf(tmp, sizeof(tmp), "%s/%s", homedir, path + 2); + ret = realpath(tmp, NULL); + free(homedir); + return ret; + } + + return realpath(path, NULL); +} /* sdb_realpath */ + int sdb_mkdir_all(const char *pathname, mode_t mode) { @@ -152,7 +206,7 @@ sdb_get_current_user(void) uid_t uid; - char buf[1024]; + char buf[4096]; int status; uid = geteuid(); @@ -265,7 +319,7 @@ sdb_resolve(int network, const char *address, struct addrinfo **res) if (address) { host = address; - port = strchr(host, ':'); + port = strrchr(host, ':'); if (port) { *port = '\0'; ++port;