diff options
Diffstat (limited to 'src/quotacheck/quotacheck.c')
-rw-r--r-- | src/quotacheck/quotacheck.c | 34 |
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 }; |