From 21102aadfa99e8011a0f08cfa3357fe7b4812a86 Mon Sep 17 00:00:00 2001 From: mycroft Date: Fri, 20 Jan 1995 19:45:39 +0000 Subject: [PATCH] Handle stop signals gracefully. --- usr.sbin/vipw/pw_util.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/usr.sbin/vipw/pw_util.c b/usr.sbin/vipw/pw_util.c index c0dfdb16ec7b..ddafa60d57d1 100644 --- a/usr.sbin/vipw/pw_util.c +++ b/usr.sbin/vipw/pw_util.c @@ -1,4 +1,4 @@ -/* $NetBSD: pw_util.c,v 1.5 1995/01/20 19:19:54 mycroft Exp $ */ +/* $NetBSD: pw_util.c,v 1.6 1995/01/20 19:45:39 mycroft Exp $ */ /*- * Copyright (c) 1990, 1993, 1994 @@ -62,6 +62,17 @@ static char sccsid[] = "@(#)pw_util.c 8.3 (Berkeley) 4/2/94"; #include "pw_util.h" extern char *tempname; +static pid_t editpid = -1; +static int lockfd; + +void +pw_cont(sig) + int sig; +{ + + if (editpid != -1) + kill(editpid, sig); +} void pw_init() @@ -87,15 +98,12 @@ pw_init() (void)signal(SIGPIPE, SIG_IGN); (void)signal(SIGQUIT, SIG_IGN); (void)signal(SIGTERM, SIG_IGN); - (void)signal(SIGTSTP, SIG_IGN); - (void)signal(SIGTTOU, SIG_IGN); + (void)signal(SIGCONT, pw_cont); /* Create with exact permissions. */ (void)umask(0); } -static int lockfd; - int pw_lock() { @@ -155,7 +163,6 @@ pw_edit(notsetuid) int notsetuid; { int pstat; - pid_t pid; char *p, *editor; if (!(editor = getenv("EDITOR"))) @@ -165,7 +172,7 @@ pw_edit(notsetuid) else p = editor; - if (!(pid = vfork())) { + if (!(editpid = vfork())) { if (notsetuid) { (void)setgid(getgid()); (void)setuid(getuid()); @@ -173,9 +180,18 @@ pw_edit(notsetuid) execlp(editor, p, tempname, NULL); _exit(1); } - pid = waitpid(pid, (int *)&pstat, 0); - if (pid == -1 || !WIFEXITED(pstat) || WEXITSTATUS(pstat) != 0) - pw_error(editor, 1, 1); + for (;;) { + editpid = waitpid(editpid, (int *)&pstat, WUNTRACED); + if (editpid == -1) + pw_error(editor, 1, 1); + else if (WIFSTOPPED(pstat)) + raise(WSTOPSIG(pstat)); + else if (WIFEXITED(pstat) && WEXITSTATUS(pstat) == 0) + break; + else + pw_error(editor, 1, 1); + } + editpid = -1; } void