Handle stop signals gracefully.

This commit is contained in:
mycroft 1995-01-20 19:45:39 +00:00
parent 2303fc40d7
commit 21102aadfa
1 changed files with 26 additions and 10 deletions

View File

@ -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