Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Mar 2002 11:40:02 -0800 (PST)
From:      Sandeep Kumar <skumar@juniper.net>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/35214: dump program hangs while exiting
Message-ID:  <200203041940.g24Je2Q67732@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/35214; it has been noted by GNATS.

From: Sandeep Kumar <skumar@juniper.net>
To: freebsd-gnats-submit@FreeBSD.org, skumar@juniper.net
Cc:  
Subject: Re: bin/35214: dump program hangs while exiting
Date: Mon, 04 Mar 2002 11:32:41 -0800

 Submitting unified diff for the fix.
 
 Index: tape.c
 ===================================================================
 RCS file: /cvs/junos-2001/src/sbin/dump/tape.c,v
 retrieving revision 1.1.1.4
 retrieving revision 1.2
 diff -u -r1.1.1.4 -r1.2
 --- tape.c      2001/03/31 04:38:41     1.1.1.4
 +++ tape.c      2002/03/01 17:53:24     1.2
 @@ -57,7 +57,6 @@
  
  #include <errno.h>
  #include <fcntl.h>
 -#include <setjmp.h>
  #include <signal.h>
  #include <stdio.h>
  #ifdef __STDC__
 @@ -121,10 +120,6 @@
  int master;            /* pid of master, for sending error signals */
  int tenths;            /* length of tape used per block written */
  static int caught;     /* have we caught the signal to proceed? */
 -static int ready;      /* have we reached the lock point without having */
 -                       /* received the SIGUSR2 signal from the prev 
 slave? */
 -static jmp_buf jmpbuf; /* where to jump to if we are ready when the */
 -                       /* SIGUSR2 arrives from the previous slave */
  
  int
  alloctape()
 @@ -679,9 +674,6 @@
  proceed(signo)
         int signo;
  {
 -
 -       if (ready)
 -               longjmp(jmpbuf, 1);
         caught++;
  }
  
 @@ -755,7 +747,13 @@
  {
         register int nread;
         int nextslave, size, wrote, eot_count;
 +        sigset_t sigusr2_mask, omask;
 +
 +       /* Create a mask with SIGUSR2 */
 +        sigemptyset(&sigusr2_mask);
 +        sigaddset(&sigusr2_mask, SIGUSR2);
  
 +
         /*
          * Need our own seek pointer.
          */
 @@ -788,14 +786,12 @@
                                     TP_BSIZE) != TP_BSIZE)
                                        quit("master/slave protocol 
 botched.\n");
                         }
 -               }
 -               if (setjmp(jmpbuf) == 0) {
 -                       ready = 1;
 -                       if (!caught)
 -                               (void) pause();
                 }
 -               ready = 0;
 +               sigprocmask(SIG_BLOCK, &sigusr2_mask, &omask); /*Mask 
 SIGUSR2*/;
 +               if (!caught)
 +                       (void) sigsuspend(&omask); /* wait for SIGUSR2 */
                 caught = 0;
 +               sigprocmask(SIG_SETMASK, &omask, NULL); /* Set the old 
 mask */
  
                 /* Try to write the data... */
                 eot_count = 0;
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203041940.g24Je2Q67732>