along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
-#include <string.h>
#include <unistd.h>
#include "util.h"
#include "unit-name.h"
#include "generator.h"
#include "path-util.h"
+#include "fstab-util.h"
#include "dropin.h"
int generator_write_fsck_deps(
FILE *f,
- const char *dest,
+ const char *dir,
const char *what,
const char *where,
const char *fstype) {
+ int r;
+
assert(f);
- assert(dest);
+ assert(dir);
assert(what);
assert(where);
}
if (!isempty(fstype) && !streq(fstype, "auto")) {
- int r;
r = fsck_exists(fstype);
if (r == -ENOENT) {
/* treat missing check as essentially OK */
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_errno(r, "Checking was requested for %s, but fsck.%s cannot be used: %m", what, fstype);
- 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, "/")) {
+ if (path_equal(where, "/")) {
char *lnk;
- lnk = strappenda(dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/systemd-fsck-root.service");
+ lnk = strjoina(dir, "/" 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;
- fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
- if (!fsck)
- return log_oom();
+ r = unit_name_from_path_instance("systemd-fsck", what, ".service", &fsck);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create fsck service name: %m");
fprintf(f,
- "RequiresOverridable=%s\n"
- "After=%s\n",
- fsck,
+ "RequiresOverridable=%1$s\n"
+ "After=%1$s\n",
fsck);
}
return 0;
}
-int generator_write_timeouts(const char *dir, const char *what, const char *where,
- const char *opts, char **filtered) {
+int generator_write_timeouts(
+ const char *dir,
+ const char *what,
+ const char *where,
+ const char *opts,
+ char **filtered) {
/* Allow configuration how long we wait for a device that
* backs a mount point to show up. This is useful to support
* 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 *start, *timeout;
+ _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 {
- if (filtered) {
- *filtered = strdup(opts ?: "");
- if (!*filtered)
- return log_oom();
- }
-
- return 0;
- }
-
- len = strcspn(timeout, ",;" WHITESPACE);
- t = strndup(timeout, len);
- if (!t)
- return -ENOMEM;
- if (filtered) {
- char *prefix, *postfix;
-
- prefix = strndupa(opts, start - opts - (start != opts));
- postfix = timeout + len + (start == opts && timeout[len] != '\0');
- *filtered = strjoin(prefix, *postfix ? postfix : NULL, NULL);
- if (!*filtered)
- return log_oom();
- }
+ r = fstab_filter_options(opts, "comment=systemd.device-timeout\0" "x-systemd.device-timeout\0",
+ NULL, &timeout, filtered);
+ if (r <= 0)
+ return r;
- 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);
+ log_warning("Failed to parse timeout for %s, ignoring: %s", where, timeout);
return 0;
}
if (!node)
return log_oom();
- unit = unit_name_from_path(node, ".device");
- if (!unit)
- return -ENOMEM;
+ r = unit_name_from_path(node, ".device", &unit);
+ if (r < 0)
+ return log_error_errno(r, "Failed to make unit name from path: %m");
return write_drop_in_format(dir, unit, 50, "device-timeout",
"# Automatically generated by %s\n\n"