summaryrefslogtreecommitdiffstats
path: root/src/quotacheck/quotacheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/quotacheck/quotacheck.c')
-rw-r--r--src/quotacheck/quotacheck.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c
index 27a914d..d46f280 100644
--- a/src/quotacheck/quotacheck.c
+++ b/src/quotacheck/quotacheck.c
@@ -12,11 +12,15 @@
#include "proc-cmdline.h"
#include "process-util.h"
#include "signal-util.h"
+#include "static-destruct.h"
#include "string-util.h"
+static char *arg_path = NULL;
static bool arg_skip = false;
static bool arg_force = false;
+STATIC_DESTRUCTOR_REGISTER(arg_path, freep);
+
static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
if (streq(key, "quotacheck.mode")) {
@@ -31,12 +35,12 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
else if (streq(value, "skip"))
arg_skip = true;
else
- log_warning("Invalid quotacheck.mode= parameter '%s'. Ignoring.", value);
+ log_warning("Invalid quotacheck.mode= value, ignoring: %s", value);
}
#if HAVE_SYSV_COMPAT
else if (streq(key, "forcequotacheck") && !value) {
- log_warning("Please use 'quotacheck.mode=force' rather than 'forcequotacheck' on the kernel command line.");
+ log_warning("Please use 'quotacheck.mode=force' rather than 'forcequotacheck' on the kernel command line. Proceeding anyway.");
arg_force = true;
}
#endif
@@ -48,7 +52,7 @@ static void test_files(void) {
#if 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.");
+ log_error("Please pass 'quotacheck.mode=force' on the kernel command line rather than creating /forcequotacheck on the root file system. Proceeding anyway.");
arg_force = true;
}
#endif
@@ -59,9 +63,9 @@ static int run(int argc, char *argv[]) {
log_setup();
- if (argc > 1)
+ if (argc > 2)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "This program takes no arguments.");
+ "This program expects one or no arguments.");
umask(0022);
@@ -75,17 +79,31 @@ static int run(int argc, char *argv[]) {
if (arg_skip)
return 0;
- if (access("/run/systemd/quotacheck", F_OK) < 0)
+ /* This is created by systemd-fsck when fsck detected and corrected errors. In normal
+ * operations quotacheck is not needed. */
+ if (access("/run/systemd/quotacheck", F_OK) < 0) {
+ if (errno != ENOENT)
+ log_warning_errno(errno,
+ "Failed to check whether /run/systemd/quotacheck exists, ignoring: %m");
+
return 0;
+ }
+ }
+
+ if (argc == 2) {
+ arg_path = strdup(argv[1]);
+ if (!arg_path)
+ return log_oom();
}
r = safe_fork("(quotacheck)", FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_RLIMIT_NOFILE_SAFE|FORK_WAIT|FORK_LOG, NULL);
if (r < 0)
return r;
if (r == 0) {
- static const char * const cmdline[] = {
+ const char *cmdline[] = {
QUOTACHECK,
- "-anug",
+ arg_path ? "-nug" : "-anug", /* Check all file systems if path isn't specified */
+ arg_path,
NULL
};