-$Id: CHANGES,v 1.54 2000/03/11 15:34:54 stelian Exp $
+$Id: CHANGES,v 1.55 2000/05/28 16:24:13 stelian Exp $
+
+Changes between versions 0.4b16 and 0.4b17 (released ??????????????)
+====================================================================
+
+1. The -F script is called now *only* at the end of a tape,
+ not at the end of the dump. Thanks to Chris
+ <haul@informatik.tu-darmstadt.de> for the bug report.
+
+2. Use posix signal handling to preserve dump functionality
+ with libc5. Thanks to Jeff Johnson <jbj@redhat.com> for
+ the patch.
Changes between versions 0.4b15 and 0.4b16 (released March 11, 2000)
====================================================================
-$Id: THANKS,v 1.25 2000/03/08 11:25:58 stelian Exp $
+$Id: THANKS,v 1.26 2000/05/28 16:24:13 stelian Exp $
Dump and restore were written by the people of the CSRG at the University
of California, Berkeley.
Stephen Carr sgcarr@civeng.adelaide.edu.au
Rob Cermak cermak@ahab.rutgers.edu
+Chris haul@informatik.tu-darmstadt.de
Isaac Chuang ike@isl.stanford.edu
Rainer Clasen bj@ncc.cicely.de
W. Reilly Cooley wcooley@nakedape.cc
Eirik Fuller eirik@netcom.com
Jean-Paul van der Jagt jeanpaul@dutepp0.et.tudelft.nl
Eric Jergensen eric@dvns.com
+Jeff Johnson jbj@redhat.com
Henry Katz hkatz@hkatz.dialup.access.net
Klaus Kudielka kkudielk@cacofonix.nt.tuwien.ac.at
Thorsten Kukuk kukuk@suse.de
%build
-%configure --with-binmode=6755 --with-manowner=root --with-mangrp=root --with-manmode=0644 --enable-static
+./configure --prefix=/usr --with-binmode=6755 --with-manowner=root --with-mangrp=root --with-manmode=0644 --enable-static
make OPT="$RPM_OPT_FLAGS -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wno-char-subscripts"
make distclean
-%configure --with-binmode=6755 --with-manowner=root --with-mangrp=root --with-manmode=0644 --enable-rmt
+./configure --prefix=/usr --with-binmode=6755 --with-manowner=root --with-mangrp=root --with-manmode=0644 --enable-rmt
make OPT="$RPM_OPT_FLAGS -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wno-char-subscripts"
/sbin/rdump
%attr(6755,root,tty) /sbin/restore
/sbin/rrestore
-%{_prefix}/man/man8/dump.8
-%{_prefix}/man/man8/rdump.8
-%{_prefix}/man/man8/restore.8
-%{_prefix}/man/man8/rrestore.8
+%{_prefix}/man/man8/dump.*
+%{_prefix}/man/man8/rdump.*
+%{_prefix}/man/man8/restore.*
+%{_prefix}/man/man8/rrestore.*
%files -n rmt
%defattr(-,root,root)
%attr(0755,root,root) /sbin/rmt
/etc/rmt
-%{_prefix}/man/man8/rmt.8
+%{_prefix}/man/man8/rmt.*
%files -n dump-static
%defattr(-,root,root)
#ifndef lint
static const char rcsid[] =
- "$Id: tape.c,v 1.18 2000/03/11 15:29:01 stelian Exp $";
+ "$Id: tape.c,v 1.19 2000/05/28 16:24:14 stelian Exp $";
#endif /* not lint */
#ifdef __linux__
(void) close(f);
}
eot_code = 1;
- if (eot_script) {
+ if (eot_script && spcl.c_type != TS_END) {
msg("Launching %s\n", eot_script);
eot_code = system_command(eot_script, tape, tapeno);
}
}
slp->req[0] = *q;
nextblock = slp->tblock;
- if (q->dblk == 0)
+ if (q->dblk == 0) {
#ifdef __linux__
- *(union u_spcl *)(*(nextblock)++) = *(union u_spcl *)tslp->tblock;
-#else
- nextblock++;
+ /* XXX post increment triggers an egcs-1.1.2-12 bug on alpha/sparc */
+ *(union u_spcl *)(*nextblock) = *(union u_spcl *)tslp->tblock;
#endif
+ nextblock++;
+ }
trecno = 1;
/*
int status;
int waitpid;
char *p;
+
#ifdef __linux__
- void (*interrupt_save) __P((int signo));
+ sigset_t sigs;
+ sigemptyset(&sigs);
+ sigaddset(&sigs, SIGINT);
+ sigprocmask(SIG_BLOCK, &sigs, NULL);
#else /* __linux__ */
#ifdef sunos
void (*interrupt_save)();
#else
sig_t interrupt_save;
#endif
+ interrupt_save = signal(SIGINT, SIG_IGN);
#endif /* __linux__ */
- interrupt_save = signal(SIGINT, SIG_IGN);
parentpid = getpid();
tapea_volume = spcl.c_tapea;
#ifdef __linux__
#endif
restore_check_point:
+#ifdef __linux__
+ sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+#else
(void)signal(SIGINT, interrupt_save);
+#endif
/*
* All signals are inherited...
*/
* until the child doing all of the work returns.
* don't catch the interrupt
*/
+#ifdef __linux__
+ sigprocmask(SIG_BLOCK, &sigs, NULL);
+#else
signal(SIGINT, SIG_IGN);
+#endif
#ifdef TDEBUG
msg("Tape: %d; parent process: %d child process %d\n",
tapeno+1, parentpid, childpid);
static void
proceed(int signo)
{
-
+ caught++;
if (ready)
siglongjmp(jmpbuf, 1);
- caught++;
}
void
master = getpid();
- signal(SIGTERM, dumpabort); /* Slave sends SIGTERM on dumpabort() */
- signal(SIGPIPE, sigpipe);
- signal(SIGUSR1, tperror); /* Slave sends SIGUSR1 on tape errors */
- signal(SIGUSR2, proceed); /* Slave sends SIGUSR2 to next slave */
+ { struct sigaction sa;
+ sa.sa_handler = dumpabort;
+ sigaction(SIGTERM, &sa, NULL); /* Slave sends SIGTERM on dumpabort() */
+ sa.sa_handler = sigpipe;
+ sigaction(SIGPIPE, &sa, NULL);
+ sa.sa_handler = tperror;
+ sigaction(SIGUSR1, &sa, NULL); /* Slave sends SIGUSR1 on tape errors */
+ sa.sa_handler = proceed;
+ sa.sa_flags = SA_RESTART;
+ sigaction(SIGUSR2, &sa, NULL); /* Slave sends SIGUSR2 to next slave */
+ }
for (i = 0; i < SLAVES; i++) {
if (i == slp - &slaves[0]) {
slaves[i].fd = cmd[1];
slaves[i].sent = 0;
if (slaves[i].pid == 0) { /* Slave starts up here */
+ sigset_t sigs;
for (j = 0; j <= i; j++)
(void) close(slaves[j].fd);
- signal(SIGINT, SIG_IGN); /* Master handles this */
+ sigemptyset(&sigs);
+ sigaddset(&sigs, SIGINT); /* Master handles this */
#if defined(SIGINFO)
- signal(SIGINFO, SIG_IGN);
+ sigaddset(&sigs, SIGINFO);
#endif
+ sigprocmask(SIG_BLOCK, &sigs, NULL);
#ifdef LINUX_FORK_BUG
if (atomic_write( cmd[0], (char *) &i, sizeof i)
quit("master/slave protocol botched.\n");
}
}
- if (setjmp(jmpbuf) == 0) {
+ if (sigsetjmp(jmpbuf, 1) == 0) {
ready = 1;
if (!caught)
(void) pause();