chiark / gitweb /
fedora: make sure the gettys are run before X starts up
[elogind.git] / src / load-fragment.c
index 394aa023f319599054997aee200d8f60dadfb7c5..50008101a1d2e81c2d594166d41df27ef8cad4a5 100644 (file)
@@ -29,6 +29,7 @@
 #include <sys/prctl.h>
 #include <sys/mount.h>
 #include <linux/fs.h>
+#include <sys/stat.h>
 
 #include "unit.h"
 #include "strv.h"
@@ -382,7 +383,7 @@ static int config_parse_exec(
                 char *w;
                 size_t l;
                 char *state;
-                bool honour_argv0, write_to_path;
+                bool honour_argv0 = false, ignore = false;
 
                 path = NULL;
                 nce = NULL;
@@ -393,9 +394,17 @@ static int config_parse_exec(
                 if (rvalue[0] == 0)
                         break;
 
-                honour_argv0 = rvalue[0] == '@';
+                if (rvalue[0] == '-') {
+                        ignore = true;
+                        rvalue ++;
+                }
+
+                if (rvalue[0] == '@') {
+                        honour_argv0 = true;
+                        rvalue ++;
+                }
 
-                if (rvalue[honour_argv0 ? 1 : 0] != '/') {
+                if (*rvalue != '/') {
                         log_error("[%s:%u] Invalid executable path in command line: %s", filename, line, rvalue);
                         return -EINVAL;
                 }
@@ -408,19 +417,18 @@ static int config_parse_exec(
                         k++;
                 }
 
-                if (!(n = new(char*, k + (honour_argv0 ? 0 : 1))))
+                if (!(n = new(char*, k + !honour_argv0)))
                         return -ENOMEM;
 
                 k = 0;
-                write_to_path = honour_argv0;
                 FOREACH_WORD_QUOTED(w, l, rvalue, state) {
                         if (strncmp(w, ";", l) == 0)
                                 break;
 
-                        if (write_to_path) {
-                                if (!(path = cunescape_length(w+1, l-1)))
+                        if (honour_argv0 && w == rvalue) {
+                                assert(!path);
+                                if (!(path = cunescape_length(w, l)))
                                         goto fail;
-                                write_to_path = false;
                         } else {
                                 if (!(n[k++] = cunescape_length(w, l)))
                                         goto fail;
@@ -446,6 +454,7 @@ static int config_parse_exec(
 
                 nce->argv = n;
                 nce->path = path;
+                nce->ignore = ignore;
 
                 path_kill_slashes(nce->path);
 
@@ -1550,10 +1559,13 @@ static int load_from_path(Unit *u, const char *path) {
                 { "Conflicts",              config_parse_deps,            UINT_TO_PTR(UNIT_CONFLICTS),                     "Unit"    },
                 { "Before",                 config_parse_deps,            UINT_TO_PTR(UNIT_BEFORE),                        "Unit"    },
                 { "After",                  config_parse_deps,            UINT_TO_PTR(UNIT_AFTER),                         "Unit"    },
+                { "OnFailure",              config_parse_deps,            UINT_TO_PTR(UNIT_ON_FAILURE),                    "Unit"    },
                 { "RecursiveStop",          config_parse_bool,            &u->meta.recursive_stop,                         "Unit"    },
                 { "StopWhenUnneeded",       config_parse_bool,            &u->meta.stop_when_unneeded,                     "Unit"    },
                 { "OnlyByDependency",       config_parse_bool,            &u->meta.only_by_dependency,                     "Unit"    },
                 { "DefaultDependencies",    config_parse_bool,            &u->meta.default_dependencies,                   "Unit"    },
+                { "IgnoreDependencyFailure",config_parse_bool,            &u->meta.ignore_dependency_failure,              "Unit"    },
+                { "JobTimeoutSec",          config_parse_usec,            &u->meta.job_timeout,                            "Unit"    },
 
                 { "PIDFile",                config_parse_path,            &u->service.pid_file,                            "Service" },
                 { "ExecStartPre",           config_parse_exec,            u->service.exec_command+SERVICE_EXEC_START_PRE,  "Service" },
@@ -1644,6 +1656,7 @@ static int load_from_path(Unit *u, const char *path) {
         FILE *f = NULL;
         char *filename = NULL, *id = NULL;
         Unit *merged;
+        struct stat st;
 
         if (!u) {
                 /* Dirty dirty hack. */
@@ -1731,6 +1744,17 @@ static int load_from_path(Unit *u, const char *path) {
                 goto finish;
         }
 
+        zero(st);
+        if (fstat(fileno(f), &st) < 0) {
+                r = -errno;
+                goto finish;
+        }
+
+        if (!S_ISREG(st.st_mode)) {
+                r = -ENOENT;
+                goto finish;
+        }
+
         /* Now, parse the file contents */
         if ((r = config_parse(filename, f, sections, items, false, u)) < 0)
                 goto finish;
@@ -1739,6 +1763,8 @@ static int load_from_path(Unit *u, const char *path) {
         u->meta.fragment_path = filename;
         filename = NULL;
 
+        u->meta.fragment_mtime = timespec_load(&st.st_mtim);
+
         u->meta.load_state = UNIT_LOADED;
         r = 0;