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

Diff for /src/usr.bin/mail/edit.c between version 1.16 and 1.17

version 1.16, 2007/09/10 14:29:53 version 1.17, 2007/10/17 20:02:33
Line 242 
Line 242 
 editit(const char *ed, const char *pathname)  editit(const char *ed, const char *pathname)
 {  {
         char *argp[] = {"sh", "-c", NULL, NULL}, *p;          char *argp[] = {"sh", "-c", NULL, NULL}, *p;
         sig_t sighup, sigint, sigquit;          sig_t sighup, sigint, sigquit, sigchld;
         pid_t pid;          pid_t pid;
         int saved_errno, st;          int saved_errno, st, ret = -1;
   
         if (ed == NULL)          if (ed == NULL)
                 ed = getenv("VISUAL");                  ed = getenv("VISUAL");
Line 259 
Line 259 
         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);
           sigchld = signal(SIGCHLD, SIG_DFL);
         if ((pid = fork()) == -1)          if ((pid = fork()) == -1)
                 goto fail;                  goto fail;
         if (pid == 0) {          if (pid == 0) {
Line 268 
Line 269 
         while (waitpid(pid, &st, 0) == -1)          while (waitpid(pid, &st, 0) == -1)
                 if (errno != EINTR)                  if (errno != EINTR)
                         goto fail;                          goto fail;
         free(p);          if (!WIFEXITED(st))
         (void)signal(SIGHUP, sighup);  
         (void)signal(SIGINT, sigint);  
         (void)signal(SIGQUIT, sigquit);  
         if (!WIFEXITED(st)) {  
                 errno = EINTR;                  errno = EINTR;
                 return (-1);          else
         }                  ret = WEXITSTATUS(st);
         return (WEXITSTATUS(st));  
   
  fail:   fail:
         saved_errno = errno;          saved_errno = errno;
         (void)signal(SIGHUP, sighup);          (void)signal(SIGHUP, sighup);
         (void)signal(SIGINT, sigint);          (void)signal(SIGINT, sigint);
         (void)signal(SIGQUIT, sigquit);          (void)signal(SIGQUIT, sigquit);
           (void)signal(SIGCHLD, sigchld);
         free(p);          free(p);
         errno = saved_errno;          errno = saved_errno;
         return (-1);          return (ret);
 }  }

Legend:
Removed from v.1.16  
changed lines
  Added in v.1.17