diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-08-26 19:14:51 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-08-26 20:36:42 +0200 |
commit | 5c904ba5a5f0953b568ae257b9667222d1d21808 (patch) | |
tree | daf825083b3a98d781e916e1e1322926059e6487 /src/basic/time-util.c | |
parent | a00458421dd4b6fcb9b4cdc433ba0c13970907f1 (diff) |
time-util: add new get_timezone() call to get local timezone
Let's move the timedated-specific code to time-util.h and make it
generic.
Diffstat (limited to 'src/basic/time-util.c')
-rw-r--r-- | src/basic/time-util.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/basic/time-util.c b/src/basic/time-util.c index e278196c90..3d8d5d7568 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -26,6 +26,7 @@ #include "util.h" #include "time-util.h" +#include "path-util.h" #include "strv.h" usec_t now(clockid_t clock_id) { @@ -971,7 +972,10 @@ bool timezone_is_valid(const char *name) { const char *p, *t; struct stat st; - if (!name || *name == 0 || *name == '/') + if (isempty(name)) + return false; + + if (name[0] == '/') return false; for (p = name; *p; p++) { @@ -1021,3 +1025,30 @@ clockid_t clock_boottime_or_monotonic(void) { return clock; } + +int get_timezone(char **timezone) { + _cleanup_free_ char *t = NULL; + const char *e; + char *z; + int r; + + r = readlink_malloc("/etc/localtime", &t); + if (r < 0) + return r; /* returns EINVAL if not a symlink */ + + e = path_startswith(t, "/usr/share/zoneinfo/"); + if (!e) + e = path_startswith(t, "../usr/share/zoneinfo/"); + if (!e) + return -EINVAL; + + if (!timezone_is_valid(e)) + return -EINVAL; + + z = strdup(e); + if (!z) + return -ENOMEM; + + *timezone = z; + return 0; +} |