X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fgenerator.c;h=569b25bb7c882ded2e3863ec6b7fd4a0d2826f98;hb=33928c053afd0e119828fb52a20979da415c425d;hp=762033bbdfaab8a9333c5906de12bf0f606c1800;hpb=2968644080fd103062f070e83edd620e0a58c44d;p=elogind.git
diff --git a/src/shared/generator.c b/src/shared/generator.c
index 762033bbd..569b25bb7 100644
--- a/src/shared/generator.c
+++ b/src/shared/generator.c
@@ -19,7 +19,6 @@
along with systemd; If not, see .
***/
-#include
#include
#include "util.h"
@@ -28,6 +27,7 @@
#include "unit-name.h"
#include "generator.h"
#include "path-util.h"
+#include "fstab-util.h"
#include "dropin.h"
int generator_write_fsck_deps(
@@ -52,24 +52,20 @@ int generator_write_fsck_deps(
r = fsck_exists(fstype);
if (r == -ENOENT) {
/* treat missing check as essentially OK */
- log_debug("Checking was requested for %s, but fsck.%s does not exist: %s", what, fstype, strerror(-r));
+ log_debug_errno(r, "Checking was requested for %s, but fsck.%s does not exist: %m", what, fstype);
return 0;
- } else if (r < 0) {
- log_warning("Checking was requested for %s, but fsck.%s cannot be used: %s", what, fstype, strerror(-r));
- return r;
- }
+ } else if (r < 0)
+ return log_warning_errno(r, "Checking was requested for %s, but fsck.%s cannot be used: %m", what, fstype);
}
if (streq(where, "/")) {
char *lnk;
- lnk = strappenda(dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/systemd-fsck-root.service");
+ lnk = strjoina(dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/systemd-fsck-root.service");
mkdir_parents(lnk, 0755);
- if (symlink(SYSTEM_DATA_UNIT_PATH "/systemd-fsck-root.service", lnk) < 0) {
- log_error("Failed to create symlink %s: %m", lnk);
- return -errno;
- }
+ if (symlink(SYSTEM_DATA_UNIT_PATH "/systemd-fsck-root.service", lnk) < 0)
+ return log_error_errno(errno, "Failed to create symlink %s: %m", lnk);
} else {
_cleanup_free_ char *fsck = NULL;
@@ -96,36 +92,16 @@ int generator_write_timeouts(const char *dir, const char *what, const char *wher
* endless device timeouts for devices that show up only after
* user input, like crypto devices. */
- _cleanup_free_ char *node = NULL, *unit = NULL, *t = NULL;
- char *prefix, *start, *timeout, *postfix;
+ _cleanup_free_ char *node = NULL, *unit = NULL, *timeout = NULL;
usec_t u;
int r;
- size_t len;
-
- if ((start = mount_test_option(opts, "comment=systemd.device-timeout")))
- timeout = start + 31;
- else if ((start = mount_test_option(opts, "x-systemd.device-timeout")))
- timeout = start + 25;
- else {
- *filtered = strdup(opts);
- if (!*filtered)
- return log_oom();
-
- return 0;
- }
- len = strcspn(timeout, ",;" WHITESPACE);
- t = strndup(timeout, len);
- if (!t)
- return -ENOMEM;
+ r = fstab_filter_options(opts, "comment=systemd.device-timeout\0" "x-systemd.device-timeout\0",
+ NULL, &timeout, filtered);
+ if (r <= 0)
+ return r;
- prefix = strndupa(opts, start - opts - (start != opts));
- postfix = timeout + len + (timeout[len] != '\0');
- *filtered = strjoin(prefix, *postfix ? postfix : NULL, NULL);
- if (!*filtered)
- return log_oom();
-
- r = parse_sec(t, &u);
+ r = parse_sec(timeout, &u);
if (r < 0) {
log_warning("Failed to parse timeout for %s, ignoring: %s",
where, timeout);
@@ -138,8 +114,11 @@ int generator_write_timeouts(const char *dir, const char *what, const char *wher
unit = unit_name_from_path(node, ".device");
if (!unit)
- return -ENOMEM;
+ return log_oom();
- return write_drop_in_format(dir, unit, "device-timeout",
- "[Unit]\nJobTimeoutSec=%u", u / USEC_PER_SEC);
+ return write_drop_in_format(dir, unit, 50, "device-timeout",
+ "# Automatically generated by %s\n\n"
+ "[Unit]\nJobTimeoutSec=" USEC_FMT,
+ program_invocation_short_name,
+ u / USEC_PER_SEC);
}