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;
for (;;) {
const char *key = NULL;
- p += strspn(p, seperator);
+ p += strspn(p, separator);
p += strspn(p, WHITESPACE);
if (!*p)
va_list ap;
char **value;
- va_start(ap, seperator);
+ va_start(ap, separator);
while ((key = va_arg(ap, char *))) {
size_t n;
char *v;
continue;
p += n + 1;
- n = strcspn(p, seperator);
+ n = strcspn(p, separator);
if (n >= 2 &&
strchr(QUOTES, p[0]) &&
}
if (!key)
- p += strcspn(p, seperator);
+ p += strcspn(p, separator);
}
fail:
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;
+ }
- r = -errno;
- } else
+ e = (struct inotify_event*) inotify_buffer;
+
+ 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;
}
+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;
+}
+
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",