X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Futil.c;h=58f67b0d15b86b860ca2bb9bbe08ac8d40541b53;hb=3e33a44a01078ea0699dca160b93f0399fbc994b;hp=c1ee936aaf97d7166d26bc9dcb863d5243f8abc2;hpb=e7db37dd19d540e9ac8b89c689914d44d15433c4;p=elogind.git diff --git a/src/util.c b/src/util.c index c1ee936aa..58f67b0d1 100644 --- a/src/util.c +++ b/src/util.c @@ -600,13 +600,13 @@ finish: int parse_env_file( const char *fname, - const char *seperator, ...) { + const char *separator, ...) { - int r; + int r = 0; char *contents, *p; assert(fname); - assert(seperator); + assert(separator); if ((r = read_full_file(fname, &contents)) < 0) return r; @@ -615,7 +615,7 @@ int parse_env_file( for (;;) { const char *key = NULL; - p += strspn(p, seperator); + p += strspn(p, separator); p += strspn(p, WHITESPACE); if (!*p) @@ -625,7 +625,7 @@ int parse_env_file( va_list ap; char **value; - va_start(ap, seperator); + va_start(ap, separator); while ((key = va_arg(ap, char *))) { size_t n; char *v; @@ -638,7 +638,7 @@ int parse_env_file( continue; p += n + 1; - n = strcspn(p, seperator); + n = strcspn(p, separator); if (n >= 2 && strchr(QUOTES, p[0]) && @@ -653,21 +653,27 @@ int parse_env_file( goto fail; } + if (v[0] == '\0') { + /* return empty value strings as NULL */ + free(v); + v = NULL; + } + free(*value); *value = v; p += n; + + r ++; break; } va_end(ap); } if (!key) - p += strcspn(p, seperator); + p += strcspn(p, separator); } - r = 0; - fail: free(contents); return r; @@ -1675,6 +1681,8 @@ bool ignore_file(const char *filename) { return filename[0] == '.' || streq(filename, "lost+found") || + streq(filename, "aquota.user") || + streq(filename, "aquota.group") || endswith(filename, "~") || endswith(filename, ".rpmnew") || endswith(filename, ".rpmsave") || @@ -2009,23 +2017,29 @@ int read_one_char(FILE *f, char *ret, bool *need_nl) { } int ask(char *ret, const char *replies, const char *text, ...) { + bool on_tty; + assert(ret); assert(replies); assert(text); + on_tty = isatty(STDOUT_FILENO); + for (;;) { va_list ap; char c; int r; bool need_nl = true; - fputs("\x1B[1m", stdout); + if (on_tty) + fputs("\x1B[1m", stdout); va_start(ap, text); vprintf(text, ap); va_end(ap); - fputs("\x1B[0m", stdout); + if (on_tty) + fputs("\x1B[0m", stdout); fflush(stdout); @@ -2235,26 +2249,34 @@ int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocst assert(notify >= 0); for (;;) { - struct inotify_event e; + uint8_t inotify_buffer[sizeof(struct inotify_event) + FILENAME_MAX]; ssize_t l; + struct inotify_event *e; - if ((l = read(notify, &e, sizeof(e))) != sizeof(e)) { + if ((l = read(notify, &inotify_buffer, sizeof(inotify_buffer))) < 0) { - if (l < 0) { + if (errno == EINTR) + continue; - if (errno == EINTR) - continue; + r = -errno; + goto fail; + } + + e = (struct inotify_event*) inotify_buffer; + + while (l > 0) { + size_t step; - r = -errno; - } else + if (e->wd != wd || !(e->mask & IN_CLOSE)) { r = -EIO; + goto fail; + } - goto fail; - } + step = sizeof(struct inotify_event) + e->len; + assert(step <= (size_t) l); - if (e.wd != wd || !(e.mask & IN_CLOSE)) { - r = -EIO; - goto fail; + e = (struct inotify_event*) ((uint8_t*) e + step); + l -= step; } break; @@ -3296,6 +3318,27 @@ int wait_for_terminate_and_warn(const char *name, pid_t pid) { } +void freeze(void) { + for (;;) + pause(); +} + +bool null_or_empty(struct stat *st) { + assert(st); + + if (S_ISREG(st->st_mode) && st->st_size <= 0) + return true; + + if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) + return true; + + return false; +} + +DIR *xopendirat(int fd, const char *name) { + return fdopendir(openat(fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC)); +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime",