[BACK]Return to logmsg.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / cvs

Diff for /src/usr.bin/cvs/logmsg.c between version 1.39 and 1.40

version 1.39, 2007/04/20 08:36:00 version 1.40, 2007/05/11 02:37:31
Line 198 
Line 198 
         char *argp[] = {"sh", "-c", NULL, NULL}, *p;          char *argp[] = {"sh", "-c", NULL, NULL}, *p;
         sig_t sighup, sigint, sigquit;          sig_t sighup, sigint, sigquit;
         pid_t pid;          pid_t pid;
         int st;          int saved_errno, st;
   
         (void)xasprintf(&p, "%s %s", cvs_editor, pathname);          (void)xasprintf(&p, "%s %s", cvs_editor, pathname);
         argp[2] = p;          argp[2] = p;
   
 top:  
         sighup = signal(SIGHUP, SIG_IGN);          sighup = signal(SIGHUP, SIG_IGN);
         sigint = signal(SIGINT, SIG_IGN);          sigint = signal(SIGINT, SIG_IGN);
         sigquit = signal(SIGQUIT, SIG_IGN);          sigquit = signal(SIGQUIT, SIG_IGN);
         if ((pid = fork()) == -1) {          if ((pid = fork()) == -1)
                 int saved_errno = errno;                  goto fail;
   
                 (void)signal(SIGHUP, sighup);  
                 (void)signal(SIGINT, sigint);  
                 (void)signal(SIGQUIT, sigquit);  
                 if (saved_errno == EAGAIN) {  
                         sleep(1);  
                         goto top;  
                 }  
                 xfree(p);  
                 errno = saved_errno;  
                 return (-1);  
         }  
         if (pid == 0) {          if (pid == 0) {
                 execv(_PATH_BSHELL, argp);                  execv(_PATH_BSHELL, argp);
                 _exit(127);                  _exit(127);
         }          }
           while (waitpid(pid, &st, 0) == -1)
                   if (errno != EINTR)
                           goto fail;
         xfree(p);          xfree(p);
         for (;;) {  
                 if (waitpid(pid, &st, WUNTRACED) == -1) {  
                         if (errno != EINTR)  
                                 return (-1);  
                 } else if (WIFSTOPPED(st))  
                         raise(WSTOPSIG(st));  
                 else  
                         break;  
         }  
         (void)signal(SIGHUP, sighup);          (void)signal(SIGHUP, sighup);
         (void)signal(SIGINT, sigint);          (void)signal(SIGINT, sigint);
         (void)signal(SIGQUIT, sigquit);          (void)signal(SIGQUIT, sigquit);
         if (!WIFEXITED(st) || WEXITSTATUS(st) != 0) {          if (!WIFEXITED(st)) {
                 errno = ECHILD;                  errno = EINTR;
                 return (-1);                  return (-1);
         }          }
         return (0);          return (WEXITSTATUS(st));
   
    fail:
           saved_errno = errno;
           (void)signal(SIGHUP, sighup);
           (void)signal(SIGINT, sigint);
           (void)signal(SIGQUIT, sigquit);
           xfree(p);
           errno = saved_errno;
           return (-1);
 }  }

Legend:
Removed from v.1.39  
changed lines
  Added in v.1.40