]> git.cameronkatri.com Git - pw-darwin.git/commitdiff
Fix suspended vipw hangs
authorAndrey A. Chernov <ache@FreeBSD.org>
Thu, 9 Mar 1995 21:53:12 +0000 (21:53 +0000)
committerAndrey A. Chernov <ache@FreeBSD.org>
Thu, 9 Mar 1995 21:53:12 +0000 (21:53 +0000)
Obtained from: NetBSD

libutil/pw_util.c

index 9873f74c3a3183cd4eb79a3f88a1f7226cb62f6a..c851fcbefa87ff29c97c29fef6bf5d8f36a6cb41 100644 (file)
@@ -60,6 +60,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()
@@ -85,15 +96,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()
 {
@@ -153,7 +161,6 @@ pw_edit(notsetuid)
        int notsetuid;
 {
        int pstat;
-       pid_t pid;
        char *p, *editor;
 
        if (!(editor = getenv("EDITOR")))
@@ -163,7 +170,7 @@ pw_edit(notsetuid)
        else 
                p = editor;
 
-       if (!(pid = vfork())) {
+       if (!(editpid = vfork())) {
                if (notsetuid) {
                        (void)setgid(getgid());
                        (void)setuid(getuid());
@@ -171,9 +178,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