chiark / gitweb /
systemctl: warn if user enables unit with no installation instructions
[elogind.git] / src / util.c
index c1ee936aaf97d7166d26bc9dcb863d5243f8abc2..434f311e71f9cdbbdafe85229fdeb653f0b22965 100644 (file)
@@ -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;
@@ -2009,23 +2015,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 +2247,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;
@@ -3296,6 +3316,23 @@ 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;
+}
+
 static const char *const ioprio_class_table[] = {
         [IOPRIO_CLASS_NONE] = "none",
         [IOPRIO_CLASS_RT] = "realtime",