From 0d24c2ed92012047c36a50bc12a95bc268e8ffc4 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 18 Dec 2008 18:52:18 +0000 Subject: [PATCH] Set the process group ID on the MOH process so that all children will get killed (closes issue #14099) Reported by: caspy Patches: res_musiconhold.c.patch.killpg.try2 uploaded by caspy (license 645) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@165661 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_musiconhold.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 6b6c115e0b..8bbf2ec67c 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -485,6 +485,7 @@ static int spawn_mp3(struct mohclass *class) ast_log(LOG_WARNING, "chdir() failed: %s\n", strerror(errno)); _exit(1); } + setpgid(0, getpid()); if (ast_test_flag(class, MOH_CUSTOM)) { execv(argv[0], argv); } else { @@ -566,11 +567,11 @@ static void *monmp3thread(void *data) class->srcfd = -1; pthread_testcancel(); if (class->pid > 1) { - kill(class->pid, SIGHUP); + killpg(class->pid, SIGHUP); usleep(100000); - kill(class->pid, SIGTERM); + killpg(class->pid, SIGTERM); usleep(100000); - kill(class->pid, SIGKILL); + killpg(class->pid, SIGKILL); class->pid = 0; } } else @@ -1178,11 +1179,11 @@ static int ast_moh_destroy_one(struct mohclass *moh) /* Back when this was just mpg123, SIGKILL was fine. Now we need * to give the process a reason and time enough to kill off its * children. */ - kill(pid, SIGHUP); + killpg(pid, SIGHUP); usleep(100000); - kill(pid, SIGTERM); + killpg(pid, SIGTERM); usleep(100000); - kill(pid, SIGKILL); + killpg(pid, SIGKILL); while ((ast_wait_for_input(moh->srcfd, 100) > 0) && (bytes = read(moh->srcfd, buff, 8192)) && time(NULL) < stime) tbytes = tbytes + bytes; ast_log(LOG_DEBUG, "mpg123 pid %d and child died after %d bytes read\n", pid, tbytes); -- 2.47.3