X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=util.c;h=c7b2ca8516fa663f0d65158850e29088241dd143;hp=2e310f9f6848f325f2a3c49c0801bfa19bc7ba23;hb=acbb02252a38214ecba3aa8a5c9b3669f9c9317e;hpb=034c6ed7da5e44bfdde5a5d0da75f7b7a59953b8 diff --git a/util.c b/util.c index 2e310f9f6..c7b2ca851 100644 --- a/util.c +++ b/util.c @@ -100,9 +100,9 @@ int close_nointr(int fd) { int parse_boolean(const char *v) { assert(v); - if (!strcmp(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || !strcasecmp(v, "on")) + if (streq(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || !strcasecmp(v, "on")) return 1; - else if (!strcmp(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || !strcasecmp(v, "off")) + else if (streq(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || !strcasecmp(v, "off")) return 0; return -EINVAL; @@ -216,9 +216,6 @@ int safe_atolli(const char *s, long long int *ret_lli) { return 0; } -/* What is interpreted as whitespace? */ -#define WHITESPACE " \t\n" - /* Split a string into words. */ char *split_spaces(const char *c, size_t *l, char **state) { char *current; @@ -256,7 +253,7 @@ char *split_quoted(const char *c, size_t *l, char **state) { (*state)++; } else if (*current == '\"') { current ++; - *l = strcspn(current+1, "\""); + *l = strcspn(current, "\""); *state = current+*l; if (**state == '\"') @@ -266,6 +263,9 @@ char *split_quoted(const char *c, size_t *l, char **state) { *state = current+*l; } + /* FIXME: Cannot deal with strings that have spaces AND ticks + * in them */ + return (char*) current; } @@ -382,3 +382,89 @@ finish: fclose(f); return r; } + +char *strappend(const char *s, const char *suffix) { + size_t a, b; + char *r; + + assert(s); + assert(suffix); + + a = strlen(s); + b = strlen(suffix); + + if (!(r = new(char, a+b+1))) + return NULL; + + memcpy(r, s, a); + memcpy(r+a, suffix, b); + r[a+b] = 0; + + return r; +} + +int readlink_malloc(const char *p, char **r) { + size_t l = 100; + + assert(p); + assert(r); + + for (;;) { + char *c; + ssize_t n; + + if (!(c = new(char, l))) + return -ENOMEM; + + if ((n = readlink(p, c, l-1)) < 0) { + int ret = -errno; + free(c); + return ret; + } + + if ((size_t) n < l-1) { + c[n] = 0; + *r = c; + return 0; + } + + free(c); + l *= 2; + } +} + +char *file_name_from_path(const char *p) { + char *r; + + assert(p); + + if ((r = strrchr(p, '/'))) + return r + 1; + + return (char*) p; +} + +bool path_is_absolute(const char *p) { + assert(p); + + return p[0] == '/'; +} + +bool is_path(const char *p) { + + return !!strchr(p, '/'); +} + +char *path_make_absolute(const char *p, const char *prefix) { + char *r; + + assert(p); + + if (path_is_absolute(p) || !prefix) + return strdup(p); + + if (asprintf(&r, "%s/%s", prefix, p) < 0) + return NULL; + + return r; +}