]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/quotacheck/quotacheck.c
signal-util: modernize and share more code
[thirdparty/systemd.git] / src / quotacheck / quotacheck.c
CommitLineData
3d20ed6d
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
3d20ed6d
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
3d20ed6d 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
3d20ed6d
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
22#include <stdio.h>
23#include <stdbool.h>
3d20ed6d
LP
24#include <errno.h>
25#include <unistd.h>
26
27#include "util.h"
0b452006 28#include "process-util.h"
3d20ed6d
LP
29
30static bool arg_skip = false;
31static bool arg_force = false;
32
059cb385
LP
33static int parse_proc_cmdline_item(const char *key, const char *value) {
34
35 if (streq(key, "quotacheck.mode") && value) {
36
37 if (streq(value, "auto"))
38 arg_force = arg_skip = false;
39 else if (streq(value, "force"))
40 arg_force = true;
41 else if (streq(value, "skip"))
42 arg_skip = true;
43 else
85013844
LP
44 log_warning("Invalid quotacheck.mode= parameter '%s'. Ignoring.", value);
45 }
059cb385 46
32f992a5 47#ifdef HAVE_SYSV_COMPAT
059cb385
LP
48 else if (streq(key, "forcequotacheck") && !value) {
49 log_warning("Please use 'quotacheck.mode=force' rather than 'forcequotacheck' on the kernel command line.");
141a79f4 50 arg_force = true;
3d20ed6d 51 }
141a79f4
ZJS
52#endif
53
3d20ed6d
LP
54 return 0;
55}
56
57static void test_files(void) {
85013844 58
32f992a5
LP
59#ifdef HAVE_SYSV_COMPAT
60 if (access("/forcequotacheck", F_OK) >= 0) {
61 log_error("Please pass 'quotacheck.mode=force' on the kernel command line rather than creating /forcequotacheck on the root file system.");
3d20ed6d 62 arg_force = true;
32f992a5 63 }
3d20ed6d
LP
64#endif
65}
66
67int main(int argc, char *argv[]) {
83374163 68
3d20ed6d 69 static const char * const cmdline[] = {
83374163 70 QUOTACHECK,
3d20ed6d
LP
71 "-anug",
72 NULL
73 };
74
3d20ed6d 75 pid_t pid;
b5884878 76 int r;
3d20ed6d
LP
77
78 if (argc > 1) {
79 log_error("This program takes no arguments.");
80 return EXIT_FAILURE;
81 }
82
4cfa2c99 83 log_set_target(LOG_TARGET_AUTO);
3d20ed6d
LP
84 log_parse_environment();
85 log_open();
86
4c12626c
LP
87 umask(0022);
88
b5884878
LP
89 r = parse_proc_cmdline(parse_proc_cmdline_item);
90 if (r < 0)
da927ba9 91 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
b5884878 92
3d20ed6d
LP
93 test_files();
94
95 if (!arg_force) {
3d20ed6d 96 if (arg_skip)
83374163 97 return EXIT_SUCCESS;
3d20ed6d 98
2b583ce6 99 if (access("/run/systemd/quotacheck", F_OK) < 0)
83374163 100 return EXIT_SUCCESS;
3d20ed6d
LP
101 }
102
83374163
LP
103 pid = fork();
104 if (pid < 0) {
56f64d95 105 log_error_errno(errno, "fork(): %m");
83374163 106 return EXIT_FAILURE;
3d20ed6d
LP
107 } else if (pid == 0) {
108 /* Child */
109 execv(cmdline[0], (char**) cmdline);
110 _exit(1); /* Operational error */
111 }
112
820d3acf 113 r = wait_for_terminate_and_warn("quotacheck", pid, true);
b5884878
LP
114
115 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
3d20ed6d 116}