#include <stdio.h>
#include <stdbool.h>
-#include <string.h>
#include <errno.h>
#include <unistd.h>
#include "util.h"
-#include "fileio.h"
static bool arg_skip = false;
static bool arg_force = false;
-static int parse_proc_cmdline_word(const char *w) {
- if (streq(w, "quotacheck.mode=auto"))
- arg_force = arg_skip = false;
- else if (streq(w, "quotacheck.mode=force"))
- arg_force = true;
- else if (streq(w, "quotacheck.mode=skip"))
- arg_skip = true;
- else if (startswith(w, "quotacheck"))
- log_warning("Invalid quotacheck parameter. Ignoring.");
+static int parse_proc_cmdline_item(const char *key, const char *value) {
+
+ if (streq(key, "quotacheck.mode") && value) {
+
+ if (streq(value, "auto"))
+ arg_force = arg_skip = false;
+ else if (streq(value, "force"))
+ arg_force = true;
+ else if (streq(value, "skip"))
+ arg_skip = true;
+ else
+ log_warning("Invalid quotacheck.mode= parameter '%s'. Ignoring.", value);
+ }
+
#ifdef HAVE_SYSV_COMPAT
- else if (streq(w, "forcequotacheck")) {
- log_error("Please use 'quotacheck.mode=force' rather than 'forcequotacheck' on the kernel command line.");
+ else if (streq(key, "forcequotacheck") && !value) {
+ log_warning("Please use 'quotacheck.mode=force' rather than 'forcequotacheck' on the kernel command line.");
arg_force = true;
}
#endif
}
static void test_files(void) {
+
#ifdef HAVE_SYSV_COMPAT
if (access("/forcequotacheck", F_OK) >= 0) {
log_error("Please pass 'quotacheck.mode=force' on the kernel command line rather than creating /forcequotacheck on the root file system.");
};
pid_t pid;
+ int r;
if (argc > 1) {
log_error("This program takes no arguments.");
umask(0022);
- parse_proc_cmdline(parse_proc_cmdline_word);
+ r = parse_proc_cmdline(parse_proc_cmdline_item);
+ if (r < 0)
+ log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
+
test_files();
if (!arg_force) {
pid = fork();
if (pid < 0) {
- log_error("fork(): %m");
+ log_error_errno(errno, "fork(): %m");
return EXIT_FAILURE;
} else if (pid == 0) {
/* Child */
_exit(1); /* Operational error */
}
- return wait_for_terminate_and_warn("quotacheck", pid) >= 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+ r = wait_for_terminate_and_warn("quotacheck", pid, true);
+
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}