2 * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3 * Copyright (c) 1991-1998 University of Maryland at College Park
4 * Copyright (c) 2007-2012 Zmanda, Inc. All Rights Reserved.
7 * Permission to use, copy, modify, distribute, and sell this software and its
8 * documentation for any purpose is hereby granted without fee, provided that
9 * the above copyright notice appear in all copies and that both that
10 * copyright notice and this permission notice appear in supporting
11 * documentation, and that the name of U.M. not be used in advertising or
12 * publicity pertaining to distribution of the software without specific,
13 * written prior permission. U.M. makes no representations about the
14 * suitability of this software for any purpose. It is provided "as is"
15 * without express or implied warranty.
17 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
19 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
21 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 * Authors: the Amanda Development Team. Its members are listed in a
25 * file named AUTHORS, in the root directory of this distribution.
28 * $Id: killpgrp.c,v 1.17 2006/07/25 18:27:56 martinea Exp $
30 * if it is the process group leader, it kills all processes in its
31 * process group when it is killed itself.
33 * argv[0] is the killpgrp program name
34 * argv[1] is the config name or NOCONFIG
43 #define AM_GETPGRP() getpgrp()
45 #define AM_GETPGRP() getpgrp(getpid())
48 /* we cannot check it, so let us assume it is ok */
49 #define AM_GETPGRP() getpid()
52 int main(int argc, char **argv);
53 static void term_kill_soft(int sig);
54 static void term_kill_hard(int sig);
65 if (argc > 1 && argv && argv[1] && g_str_equal(argv[1], "--version")) {
66 printf("killpgrp-%s\n", VERSION);
71 * Configure program for internationalization:
72 * 1) Only set the message locale for now.
73 * 2) Set textdomain for all amanda related programs to "amanda"
74 * We don't want to be forced to support dozens of message catalogs.
76 setlocale(LC_MESSAGES, "C");
82 set_pname("killpgrp");
84 dbopen(DBG_SUBDIR_CLIENT);
85 config_init(CONFIG_INIT_CLIENT, NULL);
88 error("Need at least 2 arguments\n");
91 dbprintf(_("version %s\n"), VERSION);
92 dbprintf(_("config: %s\n"), argv[1]);
93 if (strcmp(argv[1], "NOCONFIG") != 0)
94 dbrename(argv[1], DBG_SUBDIR_CLIENT);
96 #ifdef WANT_SETUID_CLIENT
97 check_running_as(RUNNING_AS_CLIENT_LOGIN | RUNNING_AS_UID_ONLY);
99 error(_("error [%s could not become root (is the setuid bit set?)]\n"), get_pname());
103 check_running_as(RUNNING_AS_CLIENT_LOGIN);
106 if (AM_GETPGRP() != getpid()) {
107 error(_("error [must be the process group leader]"));
111 signal(SIGTERM, term_kill_soft);
113 /* Consume any extranious input */
122 if (wait(&status) != -1)
124 if (errno != EINTR) {
125 error(_("error [wait() failed: %s]"), strerror(errno));
129 exitstr = str_exit_status("child", status);
130 dbprintf("%s\n", exitstr);
134 return WIFEXITED(status)?WEXITSTATUS(status):1;
138 static void term_kill_soft(
141 pid_t dumppid = getpid();
144 (void)sig; /* Quiet unused parameter warning */
146 signal(SIGTERM, SIG_IGN);
147 signal(SIGALRM, term_kill_hard);
150 * First, try to kill the dump process nicely. If it ignores us
151 * for three seconds, hit it harder.
153 dbprintf(_("sending SIGTERM to process group %ld\n"), (long) dumppid);
154 killerr = kill(-dumppid, SIGTERM);
156 dbprintf(_("kill failed: %s\n"), strerror(errno));
160 static void term_kill_hard(
163 pid_t dumppid = getpid();
166 (void)sig; /* Quiet unused parameter warning */
168 dbprintf(_("It won\'t die with SIGTERM, but SIGKILL should do.\n"));
169 dbprintf(_("Don't expect any further output, this will be suicide.\n"));
170 killerr = kill(-dumppid, SIGKILL);
171 /* should never reach this point, but so what? */
173 dbprintf(_("kill failed: %s\n"), strerror(errno));
174 dbprintf(_("waiting until child terminates\n"));