summaryrefslogtreecommitdiffstats
path: root/utils/start-stop-daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/start-stop-daemon.c')
-rw-r--r--utils/start-stop-daemon.c77
1 files changed, 40 insertions, 37 deletions
diff --git a/utils/start-stop-daemon.c b/utils/start-stop-daemon.c
index 3453462..8899f0c 100644
--- a/utils/start-stop-daemon.c
+++ b/utils/start-stop-daemon.c
@@ -2672,15 +2672,22 @@ do_start(int argc, char **argv)
fatale("unable to start %s", startas);
}
+struct stop_context {
+ int retry_nr;
+ int n_killed;
+ int n_notkilled;
+ bool anykilled;
+};
+
static void
-do_stop(int sig_num, int *n_killed, int *n_notkilled)
+do_stop(struct stop_context *ctx, int sig_num)
{
struct pid_list *p;
do_findprocs();
- *n_killed = 0;
- *n_notkilled = 0;
+ ctx->n_killed = 0;
+ ctx->n_notkilled = 0;
if (!found)
return;
@@ -2690,21 +2697,21 @@ do_stop(int sig_num, int *n_killed, int *n_notkilled)
for (p = found; p; p = p->next) {
if (testmode) {
info("Would send signal %d to %d.\n", sig_num, p->pid);
- (*n_killed)++;
+ ctx->n_killed++;
} else if (kill(p->pid, sig_num) == 0) {
pid_list_push(&killed, p->pid);
- (*n_killed)++;
+ ctx->n_killed++;
} else {
if (sig_num)
warning("failed to kill %d: %s\n",
p->pid, strerror(errno));
- (*n_notkilled)++;
+ ctx->n_notkilled++;
}
}
}
static void
-do_stop_summary(int retry_nr)
+do_stop_summary(struct stop_context *ctx)
{
struct pid_list *p;
@@ -2715,8 +2722,8 @@ do_stop_summary(int retry_nr)
for (p = killed; p; p = p->next)
printf(" %d", p->pid);
putchar(')');
- if (retry_nr > 0)
- printf(", retry #%d", retry_nr);
+ if (ctx->retry_nr > 0)
+ printf(", retry #%d", ctx->retry_nr);
printf(".\n");
}
@@ -2755,7 +2762,7 @@ set_what_stop(const char *format, ...)
* about system performance).
*/
static bool
-do_stop_timeout(int timeout, int *n_killed, int *n_notkilled)
+do_stop_timeout(struct stop_context *ctx, int timeout)
{
struct timespec stopat, before, after, interval, maxinterval;
int ratio;
@@ -2770,8 +2777,8 @@ do_stop_timeout(int timeout, int *n_killed, int *n_notkilled)
if (timespec_cmp(&before, &stopat, >))
return false;
- do_stop(0, n_killed, n_notkilled);
- if (!*n_killed)
+ do_stop(ctx, 0);
+ if (ctx->n_killed == 0)
return true;
timespec_gettime(&after);
@@ -2803,12 +2810,12 @@ do_stop_timeout(int timeout, int *n_killed, int *n_notkilled)
}
static int
-finish_stop_schedule(bool anykilled)
+finish_stop_schedule(struct stop_context *ctx)
{
if (rpidfile && pidfile && !testmode)
remove_pidfile(pidfile);
- if (anykilled)
+ if (ctx->anykilled)
return 0;
info("No %s found running; none killed.\n", what_stop);
@@ -2819,8 +2826,8 @@ finish_stop_schedule(bool anykilled)
static int
run_stop_schedule(void)
{
- int position, n_killed, n_notkilled, value, retry_nr;
- bool anykilled;
+ struct stop_context ctx = { 0 };
+ int position, value;
if (testmode) {
if (schedule != NULL) {
@@ -2844,41 +2851,37 @@ run_stop_schedule(void)
else
BUG("no match option, please report");
- anykilled = false;
- retry_nr = 0;
- n_killed = 0;
- n_notkilled = 0;
-
if (schedule == NULL) {
- do_stop(signal_nr, &n_killed, &n_notkilled);
- do_stop_summary(0);
- if (n_notkilled > 0)
- info("%d pids were not killed\n", n_notkilled);
- if (n_killed)
- anykilled = true;
- return finish_stop_schedule(anykilled);
+ do_stop(&ctx, signal_nr);
+ do_stop_summary(&ctx);
+ if (ctx.n_notkilled > 0)
+ info("%d pids were not killed\n", ctx.n_notkilled);
+ if (ctx.n_killed)
+ ctx.anykilled = true;
+ return finish_stop_schedule(&ctx);
}
for (position = 0; position < schedule_length; position++) {
reposition:
value = schedule[position].value;
- n_notkilled = 0;
+ ctx.n_notkilled = 0;
switch (schedule[position].type) {
case sched_goto:
position = value;
goto reposition;
case sched_signal:
- do_stop(value, &n_killed, &n_notkilled);
- do_stop_summary(retry_nr++);
- if (!n_killed)
- return finish_stop_schedule(anykilled);
+ do_stop(&ctx, value);
+ do_stop_summary(&ctx);
+ ctx.retry_nr++;
+ if (ctx.n_killed == 0)
+ return finish_stop_schedule(&ctx);
else
- anykilled = true;
+ ctx.anykilled = true;
continue;
case sched_timeout:
- if (do_stop_timeout(value, &n_killed, &n_notkilled))
- return finish_stop_schedule(anykilled);
+ if (do_stop_timeout(&ctx, value))
+ return finish_stop_schedule(&ctx);
else
continue;
default:
@@ -2888,7 +2891,7 @@ run_stop_schedule(void)
}
info("Program %s, %d process(es), refused to die.\n",
- what_stop, n_killed);
+ what_stop, ctx.n_killed);
return 2;
}