summaryrefslogtreecommitdiffstats
path: root/src/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/conf-parser.c52
-rw-r--r--src/shared/conf-parser.h11
-rw-r--r--src/shared/install.c3
-rw-r--r--src/shared/sleep-config.c12
4 files changed, 51 insertions, 27 deletions
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index 2eda6ae03a..2122657342 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -199,7 +199,7 @@ static int parse_line(
if (!fn)
return -ENOMEM;
- return config_parse(unit, fn, NULL, sections, lookup, table, flags, userdata);
+ return config_parse(unit, fn, NULL, sections, lookup, table, flags, userdata, NULL);
}
if (!utf8_is_valid(l))
@@ -289,13 +289,15 @@ int config_parse(const char *unit,
ConfigItemLookup lookup,
const void *table,
ConfigParseFlags flags,
- void *userdata) {
+ void *userdata,
+ usec_t *ret_mtime) {
_cleanup_free_ char *section = NULL, *continuation = NULL;
_cleanup_fclose_ FILE *ours = NULL;
unsigned line = 0, section_line = 0;
bool section_ignored = false, bom_seen = false;
int r, fd;
+ usec_t mtime;
assert(filename);
assert(lookup);
@@ -313,8 +315,16 @@ int config_parse(const char *unit,
}
fd = fileno(f);
- if (fd >= 0) /* stream might not have an fd, let's be careful hence */
- fd_warn_permissions(filename, fd);
+ if (fd >= 0) { /* stream might not have an fd, let's be careful hence */
+ struct stat st;
+
+ if (fstat(fd, &st) < 0)
+ return log_full_errno(FLAGS_SET(flags, CONFIG_PARSE_WARN) ? LOG_ERR : LOG_DEBUG, errno,
+ "Failed to fstat(%s): %m", filename);
+
+ (void) stat_warn_permissions(filename, &st);
+ mtime = timespec_load(&st.st_mtim);
+ }
for (;;) {
_cleanup_free_ char *buf = NULL;
@@ -434,6 +444,9 @@ int config_parse(const char *unit,
}
}
+ if (ret_mtime)
+ *ret_mtime = mtime;
+
return 0;
}
@@ -444,23 +457,32 @@ static int config_parse_many_files(
ConfigItemLookup lookup,
const void *table,
ConfigParseFlags flags,
- void *userdata) {
+ void *userdata,
+ usec_t *ret_mtime) {
+ usec_t mtime = 0;
char **fn;
int r;
if (conf_file) {
- r = config_parse(NULL, conf_file, NULL, sections, lookup, table, flags, userdata);
+ r = config_parse(NULL, conf_file, NULL, sections, lookup, table, flags, userdata, &mtime);
if (r < 0)
return r;
}
STRV_FOREACH(fn, files) {
- r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata);
+ usec_t t;
+
+ r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &t);
if (r < 0)
return r;
+ if (t > mtime) /* Find the newest */
+ mtime = t;
}
+ if (ret_mtime)
+ *ret_mtime = mtime;
+
return 0;
}
@@ -472,7 +494,8 @@ int config_parse_many_nulstr(
ConfigItemLookup lookup,
const void *table,
ConfigParseFlags flags,
- void *userdata) {
+ void *userdata,
+ usec_t *ret_mtime) {
_cleanup_strv_free_ char **files = NULL;
int r;
@@ -481,7 +504,7 @@ int config_parse_many_nulstr(
if (r < 0)
return r;
- return config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata);
+ return config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata, ret_mtime);
}
/* Parse each config file in the directories specified as strv. */
@@ -494,7 +517,7 @@ int config_parse_many(
const void *table,
ConfigParseFlags flags,
void *userdata,
- char ***ret_dropins) {
+ usec_t *ret_mtime) {
_cleanup_strv_free_ char **dropin_dirs = NULL;
_cleanup_strv_free_ char **files = NULL;
@@ -510,14 +533,7 @@ int config_parse_many(
if (r < 0)
return r;
- r = config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata);
- if (r < 0)
- return r;
-
- if (ret_dropins)
- *ret_dropins = TAKE_PTR(files);
-
- return 0;
+ return config_parse_many_files(conf_file, files, sections, lookup, table, flags, userdata, ret_mtime);
}
#define DEFINE_PARSER(type, vartype, conv_func) \
diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h
index 480988f392..6c8c1092ea 100644
--- a/src/shared/conf-parser.h
+++ b/src/shared/conf-parser.h
@@ -10,6 +10,7 @@
#include "alloc-util.h"
#include "log.h"
#include "macro.h"
+#include "time-util.h"
/* An abstract parser for simple, line based, shallow configuration files consisting of variable assignments only. */
@@ -84,11 +85,12 @@ int config_parse(
const char *unit,
const char *filename,
FILE *f,
- const char *sections, /* nulstr */
+ const char *sections, /* nulstr */
ConfigItemLookup lookup,
const void *table,
ConfigParseFlags flags,
- void *userdata);
+ void *userdata,
+ usec_t *ret_mtime); /* possibly NULL */
int config_parse_many_nulstr(
const char *conf_file, /* possibly NULL */
@@ -97,7 +99,8 @@ int config_parse_many_nulstr(
ConfigItemLookup lookup,
const void *table,
ConfigParseFlags flags,
- void *userdata);
+ void *userdata,
+ usec_t *ret_mtime); /* possibly NULL */
int config_parse_many(
const char *conf_file, /* possibly NULL */
@@ -108,7 +111,7 @@ int config_parse_many(
const void *table,
ConfigParseFlags flags,
void *userdata,
- char ***ret_dropins); /* possibly NULL */
+ usec_t *ret_mtime); /* possibly NULL */
CONFIG_PARSER_PROTOTYPE(config_parse_int);
CONFIG_PARSER_PROTOTYPE(config_parse_unsigned);
diff --git a/src/shared/install.c b/src/shared/install.c
index 60005967e7..5dd5d2aa9a 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1304,7 +1304,8 @@ static int unit_file_load(
"-Target\0"
"-Timer\0",
config_item_table_lookup, items,
- CONFIG_PARSE_ALLOW_INCLUDE, info);
+ CONFIG_PARSE_ALLOW_INCLUDE, info,
+ NULL);
if (r < 0)
return log_debug_errno(r, "Failed to parse %s: %m", info->name);
diff --git a/src/shared/sleep-config.c b/src/shared/sleep-config.c
index 5cee1ce1aa..81862c776d 100644
--- a/src/shared/sleep-config.c
+++ b/src/shared/sleep-config.c
@@ -59,10 +59,14 @@ int parse_sleep_config(SleepConfig **ret_sleep_config) {
{}
};
- (void) config_parse_many_nulstr(PKGSYSCONFDIR "/sleep.conf",
- CONF_PATHS_NULSTR("systemd/sleep.conf.d"),
- "Sleep\0", config_item_table_lookup, items,
- CONFIG_PARSE_WARN, NULL);
+ (void) config_parse_many_nulstr(
+ PKGSYSCONFDIR "/sleep.conf",
+ CONF_PATHS_NULSTR("systemd/sleep.conf.d"),
+ "Sleep\0",
+ config_item_table_lookup, items,
+ CONFIG_PARSE_WARN,
+ NULL,
+ NULL);
/* use default values unless set */
sc->allow_suspend = allow_suspend != 0;