diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-04-23 20:26:59 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-04-23 20:26:59 +0200 |
commit | 24a6e4a401f0be0c4cd67621186792d0b7e401a1 (patch) | |
tree | 4eb964777415835d384bfc45e814980a8a0a2f73 /util.c | |
parent | 40d50879d9339e539a30e5d32234baffb732f0f9 (diff) |
load-fragment: allow timeout specifications such as '7min 5s'
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -1776,6 +1776,69 @@ int path_is_mount_point(const char *t) { return a.st_dev != b.st_dev; } +int parse_usec(const char *t, usec_t *usec) { + static const struct { + const char *suffix; + usec_t usec; + } table[] = { + { "sec", USEC_PER_SEC }, + { "s", USEC_PER_SEC }, + { "min", USEC_PER_MINUTE }, + { "hr", USEC_PER_HOUR }, + { "h", USEC_PER_HOUR }, + { "d", USEC_PER_DAY }, + { "w", USEC_PER_WEEK }, + { "msec", USEC_PER_MSEC }, + { "ms", USEC_PER_MSEC }, + { "m", USEC_PER_MINUTE }, + { "usec", 1ULL }, + { "us", 1ULL }, + { "", USEC_PER_SEC }, + }; + + const char *p; + usec_t r = 0; + + assert(t); + assert(usec); + + p = t; + do { + long long l; + char *e; + unsigned i; + + errno = 0; + l = strtoll(p, &e, 10); + + if (errno != 0) + return -errno; + + if (l < 0) + return -ERANGE; + + if (e == p) + return -EINVAL; + + e += strspn(e, WHITESPACE); + + for (i = 0; i < ELEMENTSOF(table); i++) + if (startswith(e, table[i].suffix)) { + r += (usec_t) l * table[i].usec; + p = e + strlen(table[i].suffix); + break; + } + + if (i >= ELEMENTSOF(table)) + return -EINVAL; + + } while (*p != 0); + + *usec = r; + + return 0; +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", |