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);