diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-07-07 11:49:48 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-07-07 15:25:55 +0200 |
commit | 7568345034f2890af745747783c5abfbf6eccf0f (patch) | |
tree | 711cb1a32730435553d00fe2b1fcc222d5bcc803 /src/timedate/timedated.c | |
parent | a940778fb1dd16479f455bab3ac6cbdbc5b06165 (diff) | |
download | systemd-7568345034f2890af745747783c5abfbf6eccf0f.tar.gz |
shared: make timezone and locale enumeration and validation generic
This way we can reuse it other code thatn just localectl/localed +
timedatectl/timedated.
Diffstat (limited to 'src/timedate/timedated.c')
-rw-r--r-- | src/timedate/timedated.c | 53 |
1 files changed, 2 insertions, 51 deletions
diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 204031fe77..5d3b8c41e6 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -22,6 +22,7 @@ #include <errno.h> #include <string.h> #include <unistd.h> +#include <sys/capability.h> #include "sd-id128.h" #include "sd-messages.h" @@ -58,54 +59,6 @@ static void context_free(Context *c, sd_bus *bus) { bus_verify_polkit_async_registry_free(bus, c->polkit_registry); } -static bool valid_timezone(const char *name) { - const char *p; - char *t; - bool slash = false; - int r; - struct stat st; - - assert(name); - - if (*name == '/' || *name == 0) - return false; - - for (p = name; *p; p++) { - if (!(*p >= '0' && *p <= '9') && - !(*p >= 'a' && *p <= 'z') && - !(*p >= 'A' && *p <= 'Z') && - !(*p == '-' || *p == '_' || *p == '+' || *p == '/')) - return false; - - if (*p == '/') { - - if (slash) - return false; - - slash = true; - } else - slash = false; - } - - if (slash) - return false; - - t = strappend("/usr/share/zoneinfo/", name); - if (!t) - return false; - - r = stat(t, &st); - free(t); - - if (r < 0) - return false; - - if (!S_ISREG(st.st_mode)) - return false; - - return true; -} - static int context_read_data(Context *c) { _cleanup_free_ char *t = NULL; int r; @@ -502,7 +455,7 @@ static int method_set_timezone(sd_bus *bus, sd_bus_message *m, void *userdata, s if (r < 0) return r; - if (!valid_timezone(z)) + if (!timezone_is_valid(z)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid time zone '%s'", z); if (streq_ptr(z, c->zone)) @@ -737,8 +690,6 @@ static int method_set_ntp(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus return sd_bus_reply_method_return(m, NULL); } -#include <sys/capability.h> - static const sd_bus_vtable timedate_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("Timezone", "s", NULL, offsetof(Context, zone), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |