#include <sys/prctl.h>
#include <sys/mount.h>
#include <linux/fs.h>
+#include <sys/stat.h>
#include "unit.h"
#include "strv.h"
{ "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" },
FILE *f = NULL;
char *filename = NULL, *id = NULL;
Unit *merged;
+ struct stat st;
if (!u) {
/* Dirty dirty hack. */
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;
u->meta.fragment_path = filename;
filename = NULL;
+ u->meta.fragment_mtime = timespec_load(&st.st_mtim);
+
u->meta.load_state = UNIT_LOADED;
r = 0;