X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=client-src%2Fkillpgrp.c;h=3777d7d9ef342a7a89ba24ddbb87b9115fb06e5c;hb=310f09c0f55a2fb6f3f3746d6ded20099792b773;hp=f21944f1fd6bb0cf5ff73383246e8b6738ace175;hpb=bde83ad58d800ae004caccab6531234272181da2;p=debian%2Famanda diff --git a/client-src/killpgrp.c b/client-src/killpgrp.c index f21944f..3777d7d 100644 --- a/client-src/killpgrp.c +++ b/client-src/killpgrp.c @@ -24,10 +24,14 @@ * file named AUTHORS, in the root directory of this distribution. */ /* - * $Id: killpgrp.c,v 1.8.4.2.4.1.2.1 2005/09/20 21:31:52 jrjackson Exp $ + * $Id: killpgrp.c,v 1.17 2006/07/25 18:27:56 martinea Exp $ * * if it is the process group leader, it kills all processes in its * process group when it is killed itself. + * + * argv[0] is the killpgrp program name + * argv[1] is the config name or NOCONFIG + * */ #include "amanda.h" #include "version.h" @@ -43,14 +47,15 @@ #define AM_GETPGRP() getpid() #endif -int main P((int argc, char **argv)); -static void term_kill_soft P((int sig)); -static void term_kill_hard P((int sig)); +int main(int argc, char **argv); +static void term_kill_soft(int sig); +static void term_kill_hard(int sig); -int main(argc, argv) -int argc; -char **argv; +int main( + int argc, + char **argv) { + int ch; amwait_t status; safe_fd(-1, 0); @@ -58,20 +63,29 @@ char **argv; set_pname("killpgrp"); - dbopen(); - dbprintf(("%s: version %s\n", argv[0], version())); + dbopen(DBG_SUBDIR_CLIENT); + if (argc < 2) { + error("%s: Need at least 2 arguments\n", debug_prefix(NULL)); + /*NOTREACHED*/ + } + dbprintf(("%s: version %s\n", debug_prefix(NULL), version())); + dbprintf(("config: %s\n", argv[1])); + if (strcmp(argv[1], "NOCONFIG") != 0) + dbrename(argv[1], DBG_SUBDIR_CLIENT); if(client_uid == (uid_t) -1) { error("error [cannot find user %s in passwd file]", CLIENT_LOGIN); + /*NOTREACHED*/ } #ifdef FORCE_USERID if (getuid() != client_uid) { error("error [must be invoked by %s]", CLIENT_LOGIN); + /*NOTREACHED*/ } - if (geteuid() != 0) { error("error [must be setuid root]"); + /*NOTREACHED*/ } #endif /* FORCE_USERID */ @@ -81,13 +95,16 @@ char **argv; if (AM_GETPGRP() != getpid()) { error("error [must be the process group leader]"); + /*NOTREACHED*/ } + /* Consume any extranious input */ signal(SIGTERM, term_kill_soft); - while (getchar() != EOF) { + do { + ch = getchar(); /* wait until EOF */ - } + } while (ch != EOF); term_kill_soft(0); @@ -96,21 +113,25 @@ char **argv; break; if (errno != EINTR) { error("error [wait() failed: %s]", strerror(errno)); - return -1; + /*NOTREACHED*/ } } + /*@ignore@*/ dbprintf(("child process exited with status %d\n", WEXITSTATUS(status))); return WEXITSTATUS(status); + /*@end@*/ } -static void term_kill_soft(sig) -int sig; +static void term_kill_soft( + int sig) { pid_t dumppid = getpid(); int killerr; + (void)sig; /* Quiet unused parameter warning */ + signal(SIGTERM, SIG_IGN); signal(SIGALRM, term_kill_hard); alarm(3); @@ -125,12 +146,14 @@ int sig; } } -static void term_kill_hard(sig) -int sig; +static void term_kill_hard( + int sig) { pid_t dumppid = getpid(); int killerr; + (void)sig; /* Quiet unused parameter warning */ + dbprintf(("it won\'t die with SIGTERM, but SIGKILL should do\n")); dbprintf(("do\'t expect any further output, this will be suicide\n")); killerr = kill(-dumppid, SIGKILL);