X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Futil.c;h=58f67b0d15b86b860ca2bb9bbe08ac8d40541b53;hb=3e33a44a01078ea0699dca160b93f0399fbc994b;hp=ce8695be25f6c3fad0ee1e2b06028278b93db824;hpb=dd36de4d520fc77f0e2ea83f560040d36be3ee50;p=elogind.git diff --git a/src/util.c b/src/util.c index ce8695be2..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 = 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]) && @@ -671,7 +671,7 @@ int parse_env_file( } if (!key) - p += strcspn(p, seperator); + p += strcspn(p, separator); } fail: @@ -1681,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") || @@ -2247,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; - r = -errno; - } else + while (l > 0) { + size_t step; + + 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; @@ -3308,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",