X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fquotacheck%2Fquotacheck.c;h=90f542a058c4928f5df35c72595882a33e1f2fc9;hb=9a43fc6a2ad9e88719c4496fbeebf18cfb65cbb2;hp=a2a035f4f1e92eb5f658d8f69d9d07a72015a0df;hpb=07630cea1f3a845c09309f197ac7c4f11edd3b62;p=thirdparty%2Fsystemd.git diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c index a2a035f4f1e..90f542a058c 100644 --- a/src/quotacheck/quotacheck.c +++ b/src/quotacheck/quotacheck.c @@ -1,23 +1,4 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - -/*** - This file is part of systemd. - - Copyright 2010 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see . -***/ +/* SPDX-License-Identifier: LGPL-2.1+ */ #include #include @@ -25,6 +6,8 @@ #include #include +#include "main-func.h" +#include "proc-cmdline.h" #include "process-util.h" #include "signal-util.h" #include "string-util.h" @@ -33,9 +16,12 @@ static bool arg_skip = false; static bool arg_force = false; -static int parse_proc_cmdline_item(const char *key, const char *value) { +static int parse_proc_cmdline_item(const char *key, const char *value, void *data) { + + if (streq(key, "quotacheck.mode")) { - if (streq(key, "quotacheck.mode") && value) { + if (proc_cmdline_value_missing(key, value)) + return 0; if (streq(value, "auto")) arg_force = arg_skip = false; @@ -47,7 +33,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value) { log_warning("Invalid quotacheck.mode= parameter '%s'. Ignoring.", value); } -#ifdef HAVE_SYSV_COMPAT +#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."); arg_force = true; @@ -59,7 +45,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value) { static void test_files(void) { -#ifdef HAVE_SYSV_COMPAT +#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."); arg_force = true; @@ -67,29 +53,18 @@ static void test_files(void) { #endif } -int main(int argc, char *argv[]) { - - static const char * const cmdline[] = { - QUOTACHECK, - "-anug", - NULL - }; - - pid_t pid; +static int run(int argc, char *argv[]) { int r; - if (argc > 1) { - log_error("This program takes no arguments."); - return EXIT_FAILURE; - } + log_setup_service(); - log_set_target(LOG_TARGET_AUTO); - log_parse_environment(); - log_open(); + if (argc > 1) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "This program takes no arguments."); umask(0022); - r = parse_proc_cmdline(parse_proc_cmdline_item); + r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); if (r < 0) log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m"); @@ -97,29 +72,29 @@ int main(int argc, char *argv[]) { if (!arg_force) { if (arg_skip) - return EXIT_SUCCESS; + return 0; if (access("/run/systemd/quotacheck", F_OK) < 0) - return EXIT_SUCCESS; + return 0; } - pid = fork(); - if (pid < 0) { - log_error_errno(errno, "fork(): %m"); - return EXIT_FAILURE; - } else if (pid == 0) { + r = safe_fork("(quotacheck)", FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_RLIMIT_NOFILE_SAFE|FORK_WAIT|FORK_LOG, NULL); + if (r < 0) + return r; + if (r == 0) { + static const char * const cmdline[] = { + QUOTACHECK, + "-anug", + NULL + }; /* Child */ - (void) reset_all_signal_handlers(); - (void) reset_signal_mask(); - assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0); - execv(cmdline[0], (char**) cmdline); - _exit(1); /* Operational error */ + _exit(EXIT_FAILURE); /* Operational error */ } - r = wait_for_terminate_and_warn("quotacheck", pid, true); - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run);