Skip to content
Browse files

Release 1.11.2 as of 1993-03-25

  • Loading branch information...
1 parent 80baaf0 commit d1cc7607afa0c66f9b49282ddb20c24ecb3282fe @pinard committed Jul 1, 2009
Showing with 9,642 additions and 6,293 deletions.
  1. +246 −0 ChangeLog
  2. +26 −20 INSTALL
  3. +17 −15 Makefile.in
  4. +34 −3 NEWS
  5. +4 −11 README
  6. +4 −1 alloca.c
  7. +39 −21 backup-specs
  8. +1,092 −931 buffer.c
  9. +260 −152 configure
  10. +9 −8 configure.in
  11. +991 −911 create.c
  12. +537 −480 diffarch.c
  13. +97 −0 dump-remind
  14. +596 −517 extract.c
  15. +6 −6 fnmatch.c
  16. +5 −7 fnmatch.h
  17. +1,854 −0 getdate.c
  18. +15 −11 getdate.y
  19. +54 −46 getoldopt.c
  20. +51 −18 getopt.c
  21. +3 −6 getopt.h
  22. +12 −4 getopt1.c
  23. +5 −1 getpagesize.h
  24. +542 −510 gnu.c
  25. +163 −107 level-0
  26. +167 −110 level-1
  27. +667 −611 list.c
  28. +9 −8 makefile.pc
  29. +917 −711 malloc.c
  30. +202 −184 mangle.c
  31. +143 −134 msd_dir.c
  32. +24 −21 msd_dir.h
  33. +75 −64 names.c
  34. +9 −9 open3.h
  35. +1 −1 pathmax.h
  36. +730 −643 port.c
  37. +36 −11 port.h
Sorry, we could not display the entire diff because it was too big.
View
246 ChangeLog
@@ -1,3 +1,249 @@
+Thu Mar 25 13:32:40 1993 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * version.c: Released version 1.11.2.
+
+ * Makefile.in (dist): Do the link differently; some of the
+ files have changed filesystems which makes it more complex.
+
+ * Makefile.in (dist, shar): Use gzip instead of compress.
+
+ * create.c (dump_file): Test for curdev==-1, not curdev<0.
+ Some losing NFS systems give negative device numbers
+ sometimes.
+
+Thu Mar 25 11:55:15 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * level-0, level-1 (TAR_PART1): Use `--block-size', not just
+ `--block', which is now ambiguous.
+
+Wed Mar 24 22:12:51 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * backup-specs (TAR): New variable.
+
+ * level-0, level-1 (TAR_PART1): Get path of GNU tar from `TAR'
+ variable, don't hardcode it.
+
+Sat Mar 20 00:20:05 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * backup-specs (SLEEP_MESSAGE): put backslashes in front of nested
+ double quotes.
+
+ * level-0, level-1 (BACKUP_DIRS): Don't put in quotes.
+ (LOGFILE): Use sed to construct name, not awk.
+
+ * dump-remind (recipients): Replaced inefficient pipeline with a
+ single, simple sed script.
+ (volno): Deal with the possibility that VOLNO_FILE may not be
+ created yet.
+
+Fri Mar 19 15:05:15 1993 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * backup-specs (VOLNO_FILE): Removed abusive comment by Noah.
+
+ * buffer.c (new_volume): Write the global volume number to the
+ volno file before running the info script, so that the script
+ can look at it.
+
+Thu Mar 18 20:11:54 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * Makefile.in (AUX): Include `dump-remind' in distribution.
+
+ * backup-specs (SLEEP_MESSAGE): New variable.
+ level-0, level-1: Use it instead of external `dont_touch' file.
+
+ * level-0, level-1: Put most of the script in () and pipe
+ everything from the subshell through tee -a $LOGFILE. Since you
+ really want most of the output to go to the logfile anyway, and
+ since all those pipelines were preventing one from getting the
+ exit status of most commands, this seems like the right idea.
+
+ * level-0, level-1 (LOGFILE): Use YYYY-MM-DD (all numeric) format
+ for log file name, since that makes the file names sortable in a
+ coherent way. Suffix should always be `level-n' where n is the
+ dump level. level-0 script was just using `-full' instead.
+
+ * level-0, level-1 (DUMP_LEVEL): New variable. Set to `0' or `1'
+ in each script as appropriate.
+
+ * level-0, level-1 (HOST): Renamed to `localhost' for clarity.
+ (host): renamed to `remotehost' for clarity.
+
+ * level-0, level-1 (startdate): New variable. Use it in Subject
+ line of mailed report.
+
+ * level-0, level-1: Fixed all instances where sed is called with a
+ script on the command line to use `-e' option.
+
+ * level-0, level-1: Don't try to call logfile.sed to filter
+ LOGFILE. It's not distributed with tar and was never really used
+ anyway.
+
+ * level-0, level-1: Put quotes around most variable names (barring
+ those that are known to intentionally contain text that should be
+ expanded into multiple words, like `TAR_PART1').
+
+ * level-0, level-1: Got rid of annoying trailing backslashes in awk
+ scripts. They were gratuitous. Made them a little more readable
+ by adding some whitespace.
+
+Wed Mar 17 10:30:58 1993 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * tar.c (describe, long_options): Changed --compress-block to
+ --block-compress.
+ (options): Fixed f_compress_block sanity check error message
+ to give the correct name of the option.
+
+Tue Mar 16 14:52:40 1993 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * extract.c (extract_archive): case LF_DIR: Do chown when
+ necessary. Don't bother jumping to set_filestat for
+ f_modified; repeat the chmod code here. Replace `break',
+ deleted on 2 September 1992.
+
+ * tar.c (describe, long_options, options): Added gzip options
+ and use-compress-program option.
+ * tar.h: Added new compression options.
+ * buffer.c (child_open, open_archive): Use new compression options.
+
+ * create.c (start_header): Only mask off high bits when
+ creating old-style archives.
+ * list.c (decode_header): Mask off potentially misleading
+ high bits from the mode when reading headers.
+
+Mon Mar 15 11:34:34 1993 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * extract.c (extract_archive): Put arguments in the right
+ order for error message.
+
+ * create.c (deal_with_sparse): if the last byte was null, we
+ didn't write it out.
+
+ * gnu.c, create.c, extract.c, diffarch.c, list.c throughout:
+ Replace malloc calls with ck_malloc and realloc with ck_realloc.
+
+ * tar.c (describe): Improve doc for -L.
+
+ * tar.c (name_next): Don't apply exclusion to explicitly named
+ files.
+
+ * tar.c (long_options, describe): Added new-volume-script as
+ an alias for info-script.
+
+ * extract.c (extract_archive): LF_DUMPDIR case; misplaced paren.
+
+ * extract.c (extract_archive): extract_file case, first if,
+ include space for null in namelen computation.
+
+ * extract.c (extract_sparse_file): Use value returned by write
+ to properly create error message.
+
+ * create.c (create_archive): Don't assume we have anything to
+ dump.
+
+ * buffer.c (open_archive): Set current_file_name for the
+ volume header so that verbose listings work properly.
+
+ * Makefile.in (realclean): Added getdate.c.
+
+Thu Jan 14 23:38:44 1993 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu)
+
+ * tar.c: Include fnmatch.h after port.h to make sure we get our FNM_*
+ (e.g. on HPUX 8).
+
+Tue Nov 24 08:30:54 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * tar.c (addname), gnu.c (read_dir_file): Use HAVE_GETCWD, not USG.
+
+ * port.h, rmt.h: Use HAVE_STRING_H, not USG.
+
+ * port.h: Add dir header decls.
+ * create.c, gnu.c: Use SYSNDIR, SYSDIR, and NDIR
+ instead of BSD42 and USG. Rename DP_NAMELEN to NLENGTH.
+ Use `struct dirent' instead of `struct direct'.
+ * create.c, gnu.c, tar.c: Remove dir header decls.
+
+Wed Nov 18 15:31:30 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * tar.c: Change FNM_TARPATH to FNM_LEADING_DIR to match change
+ in fnmatch.[ch].
+
+Wed Oct 21 00:52:24 1992 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * level-0, level-1: put curly braces around variables for clarity.
+
+ * backup-specs (DUMP_REMIND_SCRIPT): define it (but commented out
+ so that distributed dump scripts won't use it by default).
+ level-0, level-1 (TAR_PART1): use --info-script if
+ DUMP_REMIND_SCRIPT is defined.
+ dump-remind: new file (intended as an example).
+
+Thu Oct 15 03:33:28 1992 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * level-0, level-1: remove $LOGFILE.tmp files before exiting.
+
+Fri Oct 2 00:28:01 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * tar.c (describe): Fix some tab alignments.
+
+ * Makefile.in (SRC3): Add getdate.c, for systems without bison/yacc
+ (like MS-DOS).
+
+ * diffarch.c (diff_sparse_files): Add missing arg to fprintf calls.
+
+ * extract.c (extract_archive, restore_saved_dir_info),
+ buffer.c (child_open), list.c (decode_header, print_header):
+ Delete unused vars.
+
+ * port.c [__MSDOS__]: Have strstr, rename, and mkdir. Don't
+ define ck_pipe.
+
+ * buffer.c, tar.c (init_volume_number, closeout_volume_number),
+ create.c (write_long): Declare as void, not int, since they
+ don't return a value.
+
+Thu Sep 24 00:06:02 1992 Michael I Bushnell (mib@churchy.gnu.ai.mit.edu)
+
+ * level-0, level-1 (TAR_PART1): remove --atime-preserve
+ because of a total screw.
+
+Tue Sep 22 14:15:48 1992 Michael I Bushnell (mib@wookumz.gnu.ai.mit.edu)
+
+ * buffer.c (close_archive): Removed leftover `break' from when
+ this was a switch.
+
+Tue Sep 22 08:33:16 1992 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * create.c, port.h: indented #pragma directives with 1 space.
+
+Fri Sep 18 14:15:17 1992 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * All source files: re indented using GNU indent.
+
+ * rtapelib.c (__rmt_read): Only read the amount left in the
+ buffer; otherwise a broken rmt server (which puts too much
+ data out) could overwrite past our buffer.
+
+Thu Sep 17 14:08:58 1992 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * create.c: Throughout, use struct utimbuf rather than array
+ of longs.
+
+ * configure.in: Check for getpwuid and getgrgid.
+
+ * Makefile.in (SRC3, AUX): Move alloca.c to SRC3.
+ (OBJ3): Add @ALLOCA@.
+
+ * Makefile.in (getdate.c): Look in srcdir for getdate.y.
+
+ * buffer.c (close_archive): We can't check WTERMSIG
+ meaningfully unless we already know tha WIFSIGNALED is true.
+ (There is no guarantee it WTERMSIG will return zero when
+ WIFSIGNALED is false.)
+ * port.c (rmdir, mkdir): Check WIFSIGNALED rather than
+ WTERMSIG.
+
+ * Makefile.in (getdate.c): Use $(YACC) instead of `yacc'.
+
Tue Sep 15 14:49:48 1992 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
* version.c: Released version 1.11.1.
View
46 INSTALL
@@ -22,8 +22,8 @@ see the messages, run `configure' with its standard output redirected
to `/dev/null'; for example, `./configure >/dev/null'.
To compile the package in a different directory from the one
-containing the source code, you must use a version of make that
-supports the VPATH variable, such as GNU make. `cd' to the directory
+containing the source code, you must use a version of `make' that
+supports the VPATH variable, such as GNU `make'. `cd' to the directory
where you want the object files and executables to go and run
`configure'. `configure' automatically checks for the source code in
the directory that `configure' is in and in `..'. If for some reason
@@ -35,27 +35,31 @@ DIR is the directory that contains the source code.
By default, `make install' will install the package's files in
/usr/local/bin, /usr/local/lib, /usr/local/man, etc. You can specify
an installation prefix other than /usr/local by giving `configure' the
-option `--prefix=PATH'. Alternately, you can do so by changing the
-`prefix' variable in the Makefile that `configure' creates (the
-Makefile in the top-level directory, if the package contains
-subdirectories).
+option `--prefix=PATH'. Alternately, you can do so by giving a value
+for the `prefix' variable when you run `make', e.g.,
+ make prefix=/usr/gnu
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If
-you give `configure' the option `--exec_prefix=PATH', the package will
-use PATH as the prefix for installing programs and libraries. Data
-files and documentation will still use the regular prefix. Normally,
-all files are installed using the regular prefix.
-
-You can tell `configure' to figure out the configuration for your
-system, and record it in `config.status', without actually configuring
-the package (creating `Makefile's and perhaps a configuration header
-file). To do this, give `configure' the `--no-create' option. Later,
-you can run `./config.status' to actually configure the package. This
-option is useful mainly in `Makefile' rules for updating `config.status'
-and `Makefile'. You can also give `config.status' the `--recheck'
-option, which makes it re-run `configure' with the same arguments you
-used before. This is useful if you change `configure'.
+you give `configure' the option `--exec-prefix=PATH' or set the
+`make' variable `exec_prefix' to PATH, the package will use PATH as
+the prefix for installing programs and libraries. Data files and
+documentation will still use the regular prefix. Normally, all files
+are installed using the regular prefix.
+
+Another `configure' option is useful mainly in `Makefile' rules for
+updating `config.status' and `Makefile'. The `--no-create' option
+figures out the configuration for your system and records it in
+`config.status', without actually configuring the package (creating
+`Makefile's and perhaps a configuration header file). Later, you can
+run `./config.status' to actually configure the package. You can also
+give `config.status' the `--recheck' option, which makes it re-run
+`configure' with the same arguments you used before. This option is
+useful if you change `configure'.
+
+Some packages pay attention to `--with-PACKAGE' options to `configure',
+where PACKAGE is something like `gnu-libc' or `x' (for the X Window System).
+The README should mention any --with- options that the package recognizes.
`configure' ignores any other arguments that you give it.
@@ -79,6 +83,8 @@ INSTALL Program to use to install files.
(For these variables, any value given in the environment is added to
the value that `configure' chooses:)
DEFS Configuration options, in the form `-Dfoo -Dbar ...'
+ Do not use this variable in packages that create a
+ configuration header file.
LIBS Libraries to link with, in the form `-lfoo -lbar ...'
If you need to do unusual things to compile the package, we encourage
View
32 Makefile.in
@@ -1,5 +1,5 @@
# Un*x Makefile for GNU tar program.
-# Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+# Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -32,14 +32,14 @@ INSTALL_DATA = @INSTALL_DATA@
# Things you might add to DEFS:
# -DSTDC_HEADERS If you have ANSI C headers and libraries.
# -DHAVE_UNISTD_H If you have unistd.h.
+# -DHAVE_STRING_H If you don't have ANSI C headers but have string.h.
# -DHAVE_LIMITS_H If you have limits.h.
# -DBSD42 If you have sys/dir.h (unless you use -DPOSIX),
# sys/file.h, and st_blocks in `struct stat'.
-# -DUSG If you have System V/ANSI C string
-# and memory functions and headers,
-# fcntl.h, getcwd, no valloc,
-# and ndir.h (unless you use -DDIRENT).
-# -DDIRENT If USG and you have dirent.h instead of ndir.h.
+# -DDIRENT If you have dirent.h.
+# -DSYSNDIR Old Xenix systems (sys/ndir.h).
+# -DSYSDIR Old BSD systems (sys/dir.h).
+# -DNDIR Old System V systems (ndir.h).
# -DMAJOR_IN_MKDEV If major, minor, makedev defined in sys/mkdev.h.
# -DMAJOR_IN_SYSMACROS If major, minor, makedev defined in sys/sysmacros.h.
# -DRETSIGTYPE=int If your signal handlers return int, not void.
@@ -56,6 +56,7 @@ INSTALL_DATA = @INSTALL_DATA@
# -DHAVE_MKDIR If you have mkdir and rmdir system calls.
# -DHAVE_MKNOD If you have mknod system call.
# -DHAVE_RENAME If you have rename system call.
+# -DHAVE_GETCWD If not POSIX.1 but have getcwd function.
# -DHAVE_FTRUNCATE If you have ftruncate system call.
# -DV7 On Version 7 Unix (not tested in a long time).
# -DEMUL_OPEN3 If you lack a 3-argument version of open, and want
@@ -97,18 +98,18 @@ SHELL = /bin/sh
SRC1 = tar.c create.c extract.c buffer.c getoldopt.c update.c gnu.c mangle.c
SRC2 = version.c list.c names.c diffarch.c port.c fnmatch.c getopt.c malloc.c
-SRC3 = getopt1.c regex.c getdate.y
+SRC3 = getopt1.c regex.c getdate.y getdate.c alloca.c
SRCS = $(SRC1) $(SRC2) $(SRC3)
OBJ1 = tar.o create.o extract.o buffer.o getoldopt.o update.o gnu.o mangle.o
OBJ2 = version.o list.o names.o diffarch.o port.o fnmatch.o getopt.o @MALLOC@
-OBJ3 = getopt1.o regex.o getdate.o $(RTAPELIB)
+OBJ3 = getopt1.o regex.o getdate.o $(RTAPELIB) @ALLOCA@
OBJS = $(OBJ1) $(OBJ2) $(OBJ3)
AUX = README INSTALL NEWS COPYING ChangeLog Makefile.in makefile.pc \
configure configure.in \
tar.h fnmatch.h pathmax.h port.h open3.h getopt.h regex.h \
- rmt.h rmt.c rtapelib.c alloca.c \
+ rmt.h rmt.c rtapelib.c \
msd_dir.h msd_dir.c tcexparg.c \
- level-0 level-1 backup-specs testpad.c getpagesize.h
+ level-0 level-1 backup-specs dump-remind testpad.c getpagesize.h
# tar.texinfo tar.info* texinfo.tex \
all: @PROGS@
@@ -142,7 +143,7 @@ regex.o buffer.o tar.o: regex.h
tar.o fnmatch.o: fnmatch.h
getdate.c: getdate.y
- yacc getdate.y
+ $(YACC) $(srcdir)/getdate.y
mv y.tab.c getdate.c
# getdate.y has 8 shift/reduce conflicts.
@@ -164,17 +165,18 @@ distclean: clean
rm -f Makefile config.status
realclean: distclean
- rm -f TAGS *.info*
+ rm -f TAGS *.info* getdate.c y.tab.c
shar: $(SRCS) $(AUX)
- shar $(SRCS) $(AUX) | compress > tar-`sed -e '/version_string/!d' -e 's/[^0-9.]*\([0-9.]*\).*/\1/' -e q version.c`.shar.Z
+ shar $(SRCS) $(AUX) | gzip > tar-`sed -e '/version_string/!d' -e 's/[^0-9.]*\([0-9.]*\).*/\1/' -e q version.c`.shar.z
dist: $(SRCS) $(AUX)
echo tar-`sed -e '/version_string/!d' -e 's/[^0-9.]*\([0-9.]*\).*/\1/' -e q version.c` > .fname
-rm -rf `cat .fname`
mkdir `cat .fname`
- ln $(SRCS) $(AUX) `cat .fname`
- tar chZf `cat .fname`.tar.Z `cat .fname`
+ for file in $(SRCS) $(AUX); do \
+ ln $$file `cat .fname` || cp $$file `cat .fname`; done
+ tar chzf `cat .fname`.tar.z `cat .fname`
-rm -rf `cat .fname` .fname
tar.zoo: $(SRCS) $(AUX)
View
37 NEWS
@@ -1,5 +1,36 @@
-Current Version: 1.11.
+Current Version: 1.11.2
+
+
+User-visible changes since 1.11.1:
+
+o Changes in backup scripts
+ - cleaned up considerably; notices error conditions better over rsh
+ - DUMP_REMIND_SCRIPT is now an option in backup-specs
+ - new file dump-remind is an example of a DUMP_REMIND_SCRIPT
+o Superfluous "Reading dirname" was a bug; fixed.
+o Incompatibility problems with a bug on Solaris are fixed.
+o New option --gzip (aliases are --ungzip and -z); calls gzip instead
+ of compress. Also, --use-compress-program lets you specify any
+ compress program. --compress-block is renamed --block-compress and
+ now requires one of the three compression options to be specified.
+o Several error messages are cleaned up.
+o Directory owners are now set properly when running as root.
+o Provide DUMP_REMIND_SCRIPT in backup-specs as a possible option
+ for --info-script.
+o Behave better with broken rmt servers.
+o Dump scripts no longer use --atime-preserve; this causes a nasty probem.
+o Several Makefile cleanups.
+
+==============
+Version 1.11.1
+User-visible changes since 1.11:
+
+o Many bug fixes
+
+
+============
+Version 1.11
User-visible changes since 1.10:
o Many bug fixes
@@ -53,8 +84,8 @@ o Longnames support is redone differently--long name info directly
long names to work.
-==================
-
+=============
+Version 1.10:
User-visible changes since 1.09:
Filename to -G is optional. -C works right.
View
15 README
@@ -1,16 +1,12 @@
Hey! Emacs! Yo! This is -*- Text -*- !!!
-This GNU tar 1.11.1. Please send bug reports, etc., to
+This GNU tar 1.11.2. Please send bug reports, etc., to
bug-gnu-utils@prep.ai.mit.edu. This is a beta-test release. Please
-try it out. After bug reports are processed for this release, version
-1.12 will be released. This release includes only bugfixes past
-version 1.11, most of which are fairly important.
+try it out. There is no manual; the release of version 1.12 will
+contain a manual.
GNU tar is based heavily on John Gilmore's public domain tar, but with
-added features. The manual is currently being written. An old
-manual, surely riddled with errors, is in tar.texinfo. Please don't
-send in bug reports about that manual. In particular, the mechanism
-for doing incremental dumps has been significantly changed.
+added features. The manual is currently being written.
This distribution also includes rmt, the remote tape server (which
normally must reside in /etc). The mt tape drive control program is
@@ -33,9 +29,6 @@ importantly, do not use --incremental (-G) or --after-date (-N) or
correctly for this purpose is --listed-incremental. (When extracting
incremental dumps, use --incremental (-G).)
-There is no tar manual in this release. The old manual has too many
-problems to make it usable. A new manual will appear in version 1.12.
-
If your system needs to link with -lPW to get alloca, but has
rename in the C library (so HAVE_RENAME is defined), -lPW might
give you an incorrect version of rename. On HP-UX this manifests
View
5 alloca.c
@@ -30,8 +30,11 @@
static char SCCSid[] = "@(#)alloca.c 1.1"; /* for the "what" utility */
#endif
-#ifdef emacs
+#ifdef HAVE_CONFIG_H
#include "config.h"
+#endif
+
+#ifdef emacs
#ifdef static
/* actually, only want this if static is defined as ""
-- this is for usg, in which emacs must undefine static
View
60 backup-specs
@@ -1,20 +1,27 @@
# site-specific parameters for file system backup.
# User name of administrator of backups.
-ADMINISTRATOR=friedman
+ADMINISTRATOR=backup-reports
# Hour at which backups are normally done.
# This should be a number from 0 to 23.
BACKUP_HOUR=1
+# Location of GNU tar. This must be the same for all hosts.
+TAR=/usr/local/gnubin/tar
+
# Device to use for dumping. It should be on the host
# on which the dump scripts are run.
TAPE_FILE=/dev/nrsmt0
# Command to obtain status of tape drive, including error count.
# On some tape drives there may not be such a command;
# then simply use `TAPE_STATUS=false'.
-TAPE_STATUS="mts -t $TAPE_FILE"
+#
+# Might also consider
+# TAPE_STATUS="mt -f ${TAPE_FILE} status"
+# if `mts' is missing, though this alternative is rather verbose.
+TAPE_STATUS="mts -t ${TAPE_FILE}"
# Blocking factor to use for writing the dump.
BLOCKING=124
@@ -23,41 +30,52 @@ BLOCKING=124
# by all the machines which have filesystems to be dumped.
VOLNO_FILE=/home/gd2/dump/volnofile
-# List of file systems to be dumped.
-# Actually, any directory may be used,
-# but if it has subdirectories on other file systems,
-# they are not included.
+# Script to be run when it's time to insert a new tape in for the next
+# volume. Administrators may want to tailor this script for their site.
+# If this variable isn't set, tar will use some default behavior which is
+# probably defined in the manual.
+#DUMP_REMIND_SCRIPT='rsh apple-gunkies /home/gd2/dump/dump-remind'
+# List of file systems to be dumped.
+# Actually, any directory may be used, but if it has subdirectories on
+# other file systems, they are not included.
# The host name specifies which host to run tar on.
# It should normally be the host that actually has the file system.
-# If GNU tar is not installed on that machine,
-# then you can specify some other host which can access
-# the file system through NFS.
+# If GNU tar is not installed on that machine, then you can specify some
+# other host which can access the file system through NFS.
# Although these are arranged one per line, that is not mandatory.
# It does not work to use # for comments within the string.
-BACKUP_DIRS="
+BACKUP_DIRS='
albert:/fs/fsf
- apple-gunkies:/gd
+ sugar-bombs:/fs/gd
albert:/fs/gd2
nutrimat:/fs/gp
nutrimat:/fs/gp2
albert:/fs/mailer
+ placebo:/archive
+ nutrimat:/fs/dist
albert:/
albert:/usr
- apple-gunkies:/
- apple-gunkies:/usr
nutrimat:/
- placebo:/archive
placebo:/
- wombat:/
- wombat:/usr
- wombat:/usr1
- gnu:/
- gnu:/usr
ernst:/usr1
- nutrimat:/fs/dist"
+'
# List of individual files to be dumped.
# These should be accesible from the machine on which the dump is run.
-BACKUP_FILES=""
+BACKUP_FILES=''
+
+# Message to display on the terminal while waiting for dump time. Usually
+# this will just be some literal text, preferably something more
+# entertaining than this. The awk script here saves some redundant
+# repetition, but is not really all that desirable.
+SLEEP_MESSAGE="`awk '
+ BEGIN {
+ for (i = 0; i < 30; i++)
+ print \" \" \
+ \"D O N O T T O U C H T H I S T E R M I N A L !!!!!\"
+ }' /dev/null`"
+
+
+# eof
View
2,023 buffer.c
@@ -1,5 +1,5 @@
/* Buffer management for tar.
- Copyright (C) 1988, 1992 Free Software Foundation
+ Copyright (C) 1988, 1992, 1993 Free Software Foundation
This file is part of GNU Tar.
@@ -31,7 +31,7 @@ extern int errno;
#include <sys/types.h> /* For non-Berkeley systems */
#include <signal.h>
#include <time.h>
-time_t time();
+time_t time ();
#ifdef HAVE_SYS_MTIO_H
#include <sys/ioctl.h>
@@ -73,21 +73,21 @@ FILE *msg_file = stdout;
it can't exec. We hope compress/sh
never return this status! */
-void *valloc();
+void *valloc ();
-void writeerror();
-void readerror();
+void writeerror ();
+void readerror ();
-void ck_pipe();
-void ck_close();
+void ck_pipe ();
+void ck_close ();
-int backspace_output();
-extern void finish_header();
-void flush_archive();
-int isfile();
-int new_volume();
-void verify_volume();
-extern void to_oct();
+int backspace_output ();
+extern void finish_header ();
+void flush_archive ();
+int isfile ();
+int new_volume ();
+void verify_volume ();
+extern void to_oct ();
#ifndef __MSDOS__
/* Obnoxious test to see if dimwit is trying to dump the archive */
@@ -104,35 +104,35 @@ ino_t ar_ino;
* header record.
*/
static union record **save_rec;
- union record record_save_area;
-static long saved_recno;
+union record record_save_area;
+static long saved_recno;
/*
* PID of child program, if f_compress or remote archive access.
*/
-static int childpid = 0;
+static int childpid = 0;
/*
* Record number of the start of this block of records
*/
-long baserec;
+long baserec;
/*
* Error recovery stuff
*/
-static int r_error_count;
+static int r_error_count;
/*
* Have we hit EOF yet?
*/
-static int hit_eof;
+static int hit_eof;
/* Checkpointing counter */
static int checkpoint;
/* JF we're reading, but we just read the last record and its time to update */
extern time_to_start_writing;
-int file_to_switch_to= -1; /* If remote update, close archive, and use
+int file_to_switch_to = -1; /* If remote update, close archive, and use
this descriptor to write to */
static int volno = 1; /* JF which volume of a multi-volume tape
@@ -155,14 +155,15 @@ static long real_s_sizeleft;
/* Reset the EOF flag (if set), and re-set ar_record, etc */
void
-reset_eof()
+reset_eof ()
{
- if(hit_eof) {
- hit_eof=0;
- ar_record=ar_block;
- ar_last=ar_block+blocking;
- ar_reading=0;
- }
+ if (hit_eof)
+ {
+ hit_eof = 0;
+ ar_record = ar_block;
+ ar_last = ar_block + blocking;
+ ar_reading = 0;
+ }
}
/*
@@ -171,18 +172,20 @@ reset_eof()
* it, to avoid accidentally going on to the next file on the "tape".
*/
union record *
-findrec()
+findrec ()
{
- if (ar_record == ar_last) {
- if (hit_eof)
- return (union record *)NULL; /* EOF */
- flush_archive();
- if (ar_record == ar_last) {
- hit_eof++;
- return (union record *)NULL; /* EOF */
- }
+ if (ar_record == ar_last)
+ {
+ if (hit_eof)
+ return (union record *) NULL; /* EOF */
+ flush_archive ();
+ if (ar_record == ar_last)
+ {
+ hit_eof++;
+ return (union record *) NULL; /* EOF */
}
- return ar_record;
+ }
+ return ar_record;
}
@@ -191,19 +194,19 @@ findrec()
* (should the arg have an off-by-1? XXX FIXME)
*/
void
-userec(rec)
- union record *rec;
+userec (rec)
+ union record *rec;
{
- while(rec >= ar_record)
- ar_record++;
- /*
+ while (rec >= ar_record)
+ ar_record++;
+ /*
* Do NOT flush the archive here. If we do, the same
* argument to userec() could mean the next record (if the
* input block is exactly one record long), which is not what
* is intended.
*/
- if (ar_record > ar_last)
- abort();
+ if (ar_record > ar_last)
+ abort ();
}
@@ -213,9 +216,9 @@ userec(rec)
* for filling with data, or taking data from.
*/
union record *
-endofrecs()
+endofrecs ()
{
- return ar_last;
+ return ar_last;
}
@@ -224,255 +227,300 @@ endofrecs()
* Equivalent to BSD "dup2" with error reporting.
*/
void
-dupto(from, to, msg)
- int from, to;
- char *msg;
+dupto (from, to, msg)
+ int from, to;
+ char *msg;
{
- int err;
+ int err;
- if (from != to) {
- err=close(to);
- if(err<0 && errno!=EBADF) {
- msg_perror("Cannot close descriptor %d",to);
- exit(EX_SYSTEM);
- }
- err = dup(from);
- if (err != to) {
- msg_perror("cannot dup %s",msg);
- exit(EX_SYSTEM);
- }
- ck_close(from);
+ if (from != to)
+ {
+ err = close (to);
+ if (err < 0 && errno != EBADF)
+ {
+ msg_perror ("Cannot close descriptor %d", to);
+ exit (EX_SYSTEM);
+ }
+ err = dup (from);
+ if (err != to)
+ {
+ msg_perror ("cannot dup %s", msg);
+ exit (EX_SYSTEM);
}
+ ck_close (from);
+ }
}
#ifdef __MSDOS__
void
-child_open()
+child_open ()
{
- fprintf(stderr,"MS-DOS %s can't use compressed or remote archives\n",tar);
- exit(EX_ARGSBAD);
+ fprintf (stderr, "MS-DOS %s can't use compressed or remote archives\n", tar);
+ exit (EX_ARGSBAD);
}
+
#else
void
-child_open()
+child_open ()
{
- int pipe[2];
- int err = 0;
- int nar;
+ int pipe[2];
+ int err = 0;
- int kidpipe[2];
- int kidchildpid;
+ int kidpipe[2];
+ int kidchildpid;
#define READ 0
#define WRITE 1
- ck_pipe(pipe);
+ ck_pipe (pipe);
+
+ childpid = fork ();
+ if (childpid < 0)
+ {
+ msg_perror ("cannot fork");
+ exit (EX_SYSTEM);
+ }
+ if (childpid > 0)
+ {
+ /* We're the parent. Clean up and be happy */
+ /* This, at least, is easy */
- childpid=fork();
- if(childpid<0) {
- msg_perror("cannot fork");
- exit(EX_SYSTEM);
+ if (ar_reading)
+ {
+ f_reblock++;
+ archive = pipe[READ];
+ ck_close (pipe[WRITE]);
}
- if(childpid>0) {
- /* We're the parent. Clean up and be happy */
- /* This, at least, is easy */
-
- if(ar_reading) {
- f_reblock++;
- archive=pipe[READ];
- ck_close(pipe[WRITE]);
- } else {
- archive = pipe[WRITE];
- ck_close(pipe[READ]);
- }
- return;
+ else
+ {
+ archive = pipe[WRITE];
+ ck_close (pipe[READ]);
}
+ return;
+ }
- /* We're the kid */
- if(ar_reading) {
- dupto(pipe[WRITE],STDOUT,"(child) pipe to stdout");
- ck_close(pipe[READ]);
- } else {
- dupto(pipe[READ],STDIN,"(child) pipe to stdin");
- ck_close(pipe[WRITE]);
- }
+ /* We're the kid */
+ if (ar_reading)
+ {
+ dupto (pipe[WRITE], STDOUT, "(child) pipe to stdout");
+ ck_close (pipe[READ]);
+ }
+ else
+ {
+ dupto (pipe[READ], STDIN, "(child) pipe to stdin");
+ ck_close (pipe[WRITE]);
+ }
- /* We need a child tar only if
+ /* We need a child tar only if
1: we're reading/writing stdin/out (to force reblocking)
2: the file is to be accessed by rmt (compress doesn't know how)
3: the file is not a plain file */
#ifdef NO_REMOTE
- if(!(ar_files[0][0]=='-' && ar_files[0][1]=='\0') && isfile(ar_files[0]))
+ if (!(ar_files[0][0] == '-' && ar_files[0][1] == '\0') && isfile (ar_files[0]))
#else
- if(!(ar_files[0][0]=='-' && ar_files[0][1]=='\0') && !_remdev(ar_files[0]) && isfile(ar_files[0]))
+ if (!(ar_files[0][0] == '-' && ar_files[0][1] == '\0') && !_remdev (ar_files[0]) && isfile (ar_files[0]))
#endif
+ {
+ /* We don't need a child tar. Open the archive */
+ if (ar_reading)
{
- /* We don't need a child tar. Open the archive */
- if(ar_reading) {
- archive=open(ar_files[0], O_RDONLY|O_BINARY, 0666);
- if(archive<0) {
- msg_perror("can't open archive %s",ar_files[0]);
- exit(EX_BADARCH);
- }
- dupto(archive,STDIN,"archive to stdin");
- /* close(archive); */
- } else {
- archive=creat(ar_files[0],0666);
- if(archive<0) {
- msg_perror("can't open archive %s",ar_files[0]);
- exit(EX_BADARCH);
- }
- dupto(archive,STDOUT,"archive to stdout");
- /* close(archive); */
- }
- } else {
- /* We need a child tar */
- ck_pipe(kidpipe);
-
- kidchildpid=fork();
- if(kidchildpid<0) {
- msg_perror("child can't fork");
- exit(EX_SYSTEM);
- }
+ archive = open (ar_files[0], O_RDONLY | O_BINARY, 0666);
+ if (archive < 0)
+ {
+ msg_perror ("can't open archive %s", ar_files[0]);
+ exit (EX_BADARCH);
+ }
+ dupto (archive, STDIN, "archive to stdin");
+ /* close(archive); */
+ }
+ else
+ {
+ archive = creat (ar_files[0], 0666);
+ if (archive < 0)
+ {
+ msg_perror ("can't open archive %s", ar_files[0]);
+ exit (EX_BADARCH);
+ }
+ dupto (archive, STDOUT, "archive to stdout");
+ /* close(archive); */
+ }
+ }
+ else
+ {
+ /* We need a child tar */
+ ck_pipe (kidpipe);
- if(kidchildpid>0) {
- /* About to exec compress: set up the files */
- if(ar_reading) {
- dupto(kidpipe[READ],STDIN,"((child)) pipe to stdin");
- ck_close(kidpipe[WRITE]);
- /* dup2(pipe[WRITE],STDOUT); */
- } else {
- /* dup2(pipe[READ],STDIN); */
- dupto(kidpipe[WRITE],STDOUT,"((child)) pipe to stdout");
- ck_close(kidpipe[READ]);
- }
- /* ck_close(pipe[READ]); */
- /* ck_close(pipe[WRITE]); */
- /* ck_close(kidpipe[READ]);
+ kidchildpid = fork ();
+ if (kidchildpid < 0)
+ {
+ msg_perror ("child can't fork");
+ exit (EX_SYSTEM);
+ }
+
+ if (kidchildpid > 0)
+ {
+ /* About to exec compress: set up the files */
+ if (ar_reading)
+ {
+ dupto (kidpipe[READ], STDIN, "((child)) pipe to stdin");
+ ck_close (kidpipe[WRITE]);
+ /* dup2(pipe[WRITE],STDOUT); */
+ }
+ else
+ {
+ /* dup2(pipe[READ],STDIN); */
+ dupto (kidpipe[WRITE], STDOUT, "((child)) pipe to stdout");
+ ck_close (kidpipe[READ]);
+ }
+ /* ck_close(pipe[READ]); */
+ /* ck_close(pipe[WRITE]); */
+ /* ck_close(kidpipe[READ]);
ck_close(kidpipe[WRITE]); */
- } else {
- /* Grandchild. Do the right thing, namely sit here and
+ }
+ else
+ {
+ /* Grandchild. Do the right thing, namely sit here and
read/write the archive, and feed stuff back to compress */
- tar="tar (child)";
- if(ar_reading) {
- dupto(kidpipe[WRITE],STDOUT,"[child] pipe to stdout");
- ck_close(kidpipe[READ]);
- } else {
- dupto(kidpipe[READ],STDIN,"[child] pipe to stdin");
- ck_close(kidpipe[WRITE]);
- }
-
- if (ar_files[0][0] == '-' && ar_files[0][1] == '\0') {
- if (ar_reading)
- archive = STDIN;
- else
- archive = STDOUT;
- } else /* This can't happen if (ar_reading==2)
+ tar = "tar (child)";
+ if (ar_reading)
+ {
+ dupto (kidpipe[WRITE], STDOUT, "[child] pipe to stdout");
+ ck_close (kidpipe[READ]);
+ }
+ else
+ {
+ dupto (kidpipe[READ], STDIN, "[child] pipe to stdin");
+ ck_close (kidpipe[WRITE]);
+ }
+
+ if (ar_files[0][0] == '-' && ar_files[0][1] == '\0')
+ {
+ if (ar_reading)
+ archive = STDIN;
+ else
+ archive = STDOUT;
+ }
+ else /* This can't happen if (ar_reading==2)
archive = rmtopen(ar_files[0], O_RDWR|O_CREAT|O_BINARY, 0666);
- else */if(ar_reading)
- archive = rmtopen(ar_files[0], O_RDONLY|O_BINARY, 0666);
- else
- archive = rmtcreat(ar_files[0], 0666);
-
- if (archive < 0) {
- msg_perror("can't open archive %s",ar_files[0]);
- exit(EX_BADARCH);
- }
-
- if(ar_reading) {
- for(;;) {
- char *ptr;
- int max,count;
-
- r_error_count = 0;
- error_loop:
- err=rmtread(archive, ar_block->charptr,(int)(blocksize));
- if(err<0) {
- readerror();
- goto error_loop;
- }
- if(err==0)
- break;
- ptr = ar_block->charptr;
- max = err;
- while(max) {
- count = (max<RECORDSIZE) ? max : RECORDSIZE;
- err=write(STDOUT,ptr,count);
- if(err!=count) {
- if(err<0) {
- msg_perror("can't write to compress");
- exit(EX_SYSTEM);
- } else
- msg("write to compress short %d bytes",count-err);
- count = (err<0) ? 0 : err;
- }
- ptr+=count;
- max-=count;
- }
- }
- } else {
- for(;;) {
- int n;
- char *ptr;
-
- n=blocksize;
- ptr = ar_block->charptr;
- while(n) {
- err=read(STDIN,ptr,(n<RECORDSIZE) ? n : RECORDSIZE);
- if(err<=0)
- break;
- n-=err;
- ptr+=err;
- }
- /* EOF */
- if(err==0) {
- if(f_compress<2)
- blocksize-=n;
- else
- bzero(ar_block->charptr+blocksize-n,n);
- err=rmtwrite(archive,ar_block->charptr,blocksize);
- if(err!=(blocksize))
- writeerror(err);
- if(f_compress<2)
- blocksize+=n;
- break;
- }
- if(n) {
- msg_perror("can't read from compress");
- exit(EX_SYSTEM);
- }
- err=rmtwrite(archive, ar_block->charptr, (int)blocksize);
- if(err!=blocksize)
- writeerror(err);
- }
+ else */ if (ar_reading)
+ archive = rmtopen (ar_files[0], O_RDONLY | O_BINARY, 0666);
+ else
+ archive = rmtcreat (ar_files[0], 0666);
+
+ if (archive < 0)
+ {
+ msg_perror ("can't open archive %s", ar_files[0]);
+ exit (EX_BADARCH);
+ }
+
+ if (ar_reading)
+ {
+ for (;;)
+ {
+ char *ptr;
+ int max, count;
+
+ r_error_count = 0;
+ error_loop:
+ err = rmtread (archive, ar_block->charptr, (int) (blocksize));
+ if (err < 0)
+ {
+ readerror ();
+ goto error_loop;
+ }
+ if (err == 0)
+ break;
+ ptr = ar_block->charptr;
+ max = err;
+ while (max)
+ {
+ count = (max < RECORDSIZE) ? max : RECORDSIZE;
+ err = write (STDOUT, ptr, count);
+ if (err != count)
+ {
+ if (err < 0)
+ {
+ msg_perror ("can't write to compression program");
+ exit (EX_SYSTEM);
+ }
+ else
+ msg ("write to compression program short %d bytes",
+ count - err);
+ count = (err < 0) ? 0 : err;
}
-
- /* close_archive(); */
- exit(0);
+ ptr += count;
+ max -= count;
+ }
}
+ }
+ else
+ {
+ for (;;)
+ {
+ int n;
+ char *ptr;
+
+ n = blocksize;
+ ptr = ar_block->charptr;
+ while (n)
+ {
+ err = read (STDIN, ptr, (n < RECORDSIZE) ? n : RECORDSIZE);
+ if (err <= 0)
+ break;
+ n -= err;
+ ptr += err;
+ }
+ /* EOF */
+ if (err == 0)
+ {
+ if (!f_compress_block)
+ blocksize -= n;
+ else
+ bzero (ar_block->charptr + blocksize - n, n);
+ err = rmtwrite (archive, ar_block->charptr, blocksize);
+ if (err != (blocksize))
+ writeerror (err);
+ if (!f_compress_block)
+ blocksize += n;
+ break;
+ }
+ if (n)
+ {
+ msg_perror ("can't read from compression program");
+ exit (EX_SYSTEM);
+ }
+ err = rmtwrite (archive, ar_block->charptr, (int) blocksize);
+ if (err != blocksize)
+ writeerror (err);
+ }
+ }
+
+ /* close_archive(); */
+ exit (0);
}
- /* So we should exec compress (-d) */
- if(ar_reading)
- execlp("compress", "compress", "-d", (char *)0);
- else
- execlp("compress", "compress", (char *)0);
- msg_perror("can't exec compress");
- _exit(EX_SYSTEM);
+ }
+ /* So we should exec compress (-d) */
+ if (ar_reading)
+ execlp (f_compressprog, f_compressprog, "-d", (char *) 0);
+ else
+ execlp (f_compressprog, f_compressprog, (char *) 0);
+ msg_perror ("can't exec %s", f_compressprog);
+ _exit (EX_SYSTEM);
}
/* return non-zero if p is the name of a directory */
int
-isfile(p)
-char *p;
+isfile (p)
+ char *p;
{
- struct stat stbuf;
+ struct stat stbuf;
- if(stat(p,&stbuf)<0)
- return 1;
- if(S_ISREG(stbuf.st_mode))
- return 1;
- return 0;
+ if (stat (p, &stbuf) < 0)
+ return 1;
+ if (S_ISREG (stbuf.st_mode))
+ return 1;
+ return 0;
}
#endif
@@ -483,146 +531,179 @@ char *p;
*/
/* JF if the arg is 2, open for reading and writing. */
void
-open_archive(reading)
- int reading;
+open_archive (reading)
+ int reading;
{
- msg_file = f_exstdout ? stderr : stdout;
+ msg_file = f_exstdout ? stderr : stdout;
- if (blocksize == 0) {
- msg("invalid value for blocksize");
- exit(EX_ARGSBAD);
- }
+ if (blocksize == 0)
+ {
+ msg ("invalid value for blocksize");
+ exit (EX_ARGSBAD);
+ }
- if(n_ar_files==0) {
- msg("No archive name given, what should I do?");
- exit(EX_BADARCH);
- }
+ if (n_ar_files == 0)
+ {
+ msg ("No archive name given, what should I do?");
+ exit (EX_BADARCH);
+ }
- /*NOSTRICT*/
- if(f_multivol) {
- ar_block = (union record *) valloc((unsigned)(blocksize+(2*RECORDSIZE)));
- if(ar_block)
- ar_block += 2;
- } else
- ar_block = (union record *) valloc((unsigned)blocksize);
- if (!ar_block) {
- msg("could not allocate memory for blocking factor %d",
- blocking);
- exit(EX_ARGSBAD);
- }
+ /*NOSTRICT*/
+ if (f_multivol)
+ {
+ ar_block = (union record *) valloc ((unsigned) (blocksize + (2 * RECORDSIZE)));
+ if (ar_block)
+ ar_block += 2;
+ }
+ else
+ ar_block = (union record *) valloc ((unsigned) blocksize);
+ if (!ar_block)
+ {
+ msg ("could not allocate memory for blocking factor %d",
+ blocking);
+ exit (EX_ARGSBAD);
+ }
- ar_record = ar_block;
- ar_last = ar_block + blocking;
- ar_reading = reading;
+ ar_record = ar_block;
+ ar_last = ar_block + blocking;
+ ar_reading = reading;
- if (f_multivol && f_verify)
- {
- msg ("cannot verify multi-volume archives");
- exit (EX_ARGSBAD);
- }
-
- if (f_compress) {
- if(reading==2 || f_verify) {
- msg("cannot update or verify compressed archives");
- exit(EX_ARGSBAD);
- }
- if (f_multivol) {
- msg ("cannot use multi-volume compressed archives");
- exit (EX_ARGSBAD);
- }
- child_open();
- if(!reading && ar_files[0][0]=='-' && ar_files[0][1]=='\0')
- msg_file = stderr;
- /* child_open(rem_host, rem_file); */
- } else if (ar_files[0][0] == '-' && ar_files[0][1] == '\0') {
- f_reblock++; /* Could be a pipe, be safe */
- if(f_verify) {
- msg("can't verify stdin/stdout archive");
- exit(EX_ARGSBAD);
- }
- if(reading==2) {
- archive=STDIN;
- msg_file=stderr;
- write_archive_to_stdout++;
- } else if (reading)
- archive = STDIN;
- else {
- archive = STDOUT;
- msg_file = stderr;
- }
- } else if (reading==2 || f_verify) {
- archive = rmtopen(ar_files[0], O_RDWR|O_CREAT|O_BINARY, 0666);
- } else if(reading) {
- archive = rmtopen(ar_files[0], O_RDONLY|O_BINARY, 0666);
- } else {
- archive = rmtcreat(ar_files[0], 0666);
+ if (f_multivol && f_verify)
+ {
+ msg ("cannot verify multi-volume archives");
+ exit (EX_ARGSBAD);
+ }
+
+ if (f_compressprog)
+ {
+ if (reading == 2 || f_verify)
+ {
+ msg ("cannot update or verify compressed archives");
+ exit (EX_ARGSBAD);
+ }
+ if (f_multivol)
+ {
+ msg ("cannot use multi-volume compressed archives");
+ exit (EX_ARGSBAD);
}
- if (archive < 0) {
- msg_perror("can't open %s",ar_files[0]);
- exit(EX_BADARCH);
+ child_open ();
+ if (!reading && ar_files[0][0] == '-' && ar_files[0][1] == '\0')
+ msg_file = stderr;
+ /* child_open(rem_host, rem_file); */
+ }
+ else if (ar_files[0][0] == '-' && ar_files[0][1] == '\0')
+ {
+ f_reblock++; /* Could be a pipe, be safe */
+ if (f_verify)
+ {
+ msg ("can't verify stdin/stdout archive");
+ exit (EX_ARGSBAD);
+ }
+ if (reading == 2)
+ {
+ archive = STDIN;
+ msg_file = stderr;
+ write_archive_to_stdout++;
}
+ else if (reading)
+ archive = STDIN;
+ else
+ {
+ archive = STDOUT;
+ msg_file = stderr;
+ }
+ }
+ else if (reading == 2 || f_verify)
+ {
+ archive = rmtopen (ar_files[0], O_RDWR | O_CREAT | O_BINARY, 0666);
+ }
+ else if (reading)
+ {
+ archive = rmtopen (ar_files[0], O_RDONLY | O_BINARY, 0666);
+ }
+ else
+ {
+ archive = rmtcreat (ar_files[0], 0666);
+ }
+ if (archive < 0)
+ {
+ msg_perror ("can't open %s", ar_files[0]);
+ exit (EX_BADARCH);
+ }
#ifndef __MSDOS__
- if(!_isrmt(archive)) {
- struct stat tmp_stat;
+ if (!_isrmt (archive))
+ {
+ struct stat tmp_stat;
- fstat(archive,&tmp_stat);
- if(S_ISREG(tmp_stat.st_mode)) {
- ar_dev=tmp_stat.st_dev;
- ar_ino=tmp_stat.st_ino;
- }
+ fstat (archive, &tmp_stat);
+ if (S_ISREG (tmp_stat.st_mode))
+ {
+ ar_dev = tmp_stat.st_dev;
+ ar_ino = tmp_stat.st_ino;
}
+ }
#endif
#ifdef __MSDOS__
- setmode(archive, O_BINARY);
+ setmode (archive, O_BINARY);
#endif
- if (reading) {
- ar_last = ar_block; /* Set up for 1st block = # 0 */
- (void) findrec(); /* Read it in, check for EOF */
+ if (reading)
+ {
+ ar_last = ar_block; /* Set up for 1st block = # 0 */
+ (void) findrec (); /* Read it in, check for EOF */
- if(f_volhdr) {
- union record *head;
+ if (f_volhdr)
+ {
+ union record *head;
#if 0
- char *ptr;
-
- if(f_multivol) {
- ptr=malloc(strlen(f_volhdr)+20);
- sprintf(ptr,"%s Volume %d",f_volhdr,1);
- } else
- ptr=f_volhdr;
+ char *ptr;
+
+ if (f_multivol)
+ {
+ ptr = malloc (strlen (f_volhdr) + 20);
+ sprintf (ptr, "%s Volume %d", f_volhdr, 1);
+ }
+ else
+ ptr = f_volhdr;
#endif
- head=findrec();
- if(!head) {
- msg("Archive not labelled to match %s",f_volhdr);
- exit(EX_BADVOL);
- }
- if (re_match (label_pattern, head->header.arch_name,
- strlen (head->header.arch_name), 0, 0) < 0) {
- msg ("Volume mismatch! %s!=%s", f_volhdr,
- head->header.arch_name);
- exit (EX_BADVOL);
- }
-#if 0
- if(strcmp(ptr,head->header.name)) {
- msg("Volume mismatch! %s!=%s",ptr,head->header.name);
- exit(EX_BADVOL);
- }
- if(ptr!=f_volhdr)
- free(ptr);
+ head = findrec ();
+ if (!head)
+ {
+ msg ("Archive not labelled to match %s", f_volhdr);
+ exit (EX_BADVOL);
+ }
+ if (re_match (label_pattern, head->header.arch_name,
+ strlen (head->header.arch_name), 0, 0) < 0)
+ {
+ msg ("Volume mismatch! %s!=%s", f_volhdr,
+ head->header.arch_name);
+ exit (EX_BADVOL);
+ }
+#if 0
+ if (strcmp (ptr, head->header.name))
+ {
+ msg ("Volume mismatch! %s!=%s", ptr, head->header.name);
+ exit (EX_BADVOL);
+ }
+ if (ptr != f_volhdr)
+ free (ptr);
#endif
- }
- } else if(f_volhdr) {
- bzero((void *)ar_block,RECORDSIZE);
- if(f_multivol)
- sprintf(ar_block->header.arch_name,"%s Volume 1",f_volhdr);
- else
- strcpy(ar_block->header.arch_name,f_volhdr);
- ar_block->header.linkflag = LF_VOLHDR;
- to_oct(time(0), 1+12, ar_block->header.mtime);
- finish_header(ar_block);
- /* ar_record++; */
}
+ }
+ else if (f_volhdr)
+ {
+ bzero ((void *) ar_block, RECORDSIZE);
+ if (f_multivol)
+ sprintf (ar_block->header.arch_name, "%s Volume 1", f_volhdr);
+ else
+ strcpy (ar_block->header.arch_name, f_volhdr);
+ current_file_name = ar_block->header.arch_name;
+ ar_block->header.linkflag = LF_VOLHDR;
+ to_oct (time (0), 1 + 12, ar_block->header.mtime);
+ finish_header (ar_block);
+ /* ar_record++; */
+ }
}
@@ -637,14 +718,14 @@ open_archive(reading)
* subtracting ar_block from that, shifting it back, losing the top 9 bits.
*/
void
-saverec(pointer)
- union record **pointer;
+saverec (pointer)
+ union record **pointer;
{
- long offset;
+ long offset;
- save_rec = pointer;
- offset = ar_record - ar_block;
- saved_recno = baserec + offset;
+ save_rec = pointer;
+ offset = ar_record - ar_block;
+ saved_recno = baserec + offset;
}
/*
@@ -659,143 +740,159 @@ saverec(pointer)
*/
void
-fl_write()
+fl_write ()
{
- int err;
- int copy_back;
- static long bytes_written = 0;
-
- if (f_checkpoint && ! (++checkpoint % 10))
- msg ("Write checkpoint %d\n", checkpoint);
- if(tape_length && bytes_written >= tape_length * 1024) {
- errno = ENOSPC;
- err = 0;
- } else
- err = rmtwrite(archive, ar_block->charptr,(int) blocksize);
- if(err!=blocksize && !f_multivol)
- writeerror(err);
- else if (f_totals)
- tot_written += blocksize;
-
- if(err>0)
- bytes_written+=err;
- if (err == blocksize) {
- if(f_multivol) {
- if(!save_name) {
- real_s_name[0]='\0';
- real_s_totsize=0;
- real_s_sizeleft = 0;
- return;
- }
+ int err;
+ int copy_back;
+ static long bytes_written = 0;
+
+ if (f_checkpoint && !(++checkpoint % 10))
+ msg ("Write checkpoint %d\n", checkpoint);
+ if (tape_length && bytes_written >= tape_length * 1024)
+ {
+ errno = ENOSPC;
+ err = 0;
+ }
+ else
+ err = rmtwrite (archive, ar_block->charptr, (int) blocksize);
+ if (err != blocksize && !f_multivol)
+ writeerror (err);
+ else if (f_totals)
+ tot_written += blocksize;
+
+ if (err > 0)
+ bytes_written += err;
+ if (err == blocksize)
+ {
+ if (f_multivol)
+ {
+ if (!save_name)
+ {
+ real_s_name[0] = '\0';
+ real_s_totsize = 0;
+ real_s_sizeleft = 0;
+ return;
+ }
#ifdef __MSDOS__
- if(save_name[1]==':')
- save_name+=2;
+ if (save_name[1] == ':')
+ save_name += 2;
#endif
- while(*save_name=='/')
- save_name++;
+ while (*save_name == '/')
+ save_name++;
- strcpy(real_s_name,save_name);
- real_s_totsize = save_totsize;
- real_s_sizeleft = save_sizeleft;
- }
- return;
+ strcpy (real_s_name, save_name);
+ real_s_totsize = save_totsize;
+ real_s_sizeleft = save_sizeleft;
}
+ return;
+ }
- /* We're multivol Panic if we didn't get the right kind of response */
- /* ENXIO is for the UNIX PC */
- if(err<0 && errno!=ENOSPC && errno!=EIO && errno!=ENXIO)
- writeerror(err);
-
- /* If error indicates a short write, we just move to the next tape. */
-
- if(new_volume(0)<0)
- return;
- bytes_written=0;
- if(f_volhdr && real_s_name[0]) {
- copy_back=2;
- ar_block-=2;
- } else if(f_volhdr || real_s_name[0]) {
- copy_back = 1;
- ar_block--;
- } else
- copy_back = 0;
- if(f_volhdr) {
- bzero((void *)ar_block,RECORDSIZE);
- sprintf(ar_block->header.arch_name,"%s Volume %d",f_volhdr,volno);
- to_oct(time(0), 1+12, ar_block->header.mtime);
- ar_block->header.linkflag = LF_VOLHDR;
- finish_header(ar_block);
- }
- if(real_s_name[0]) {
- int tmp;
-
- if(f_volhdr)
- ar_block++;
- bzero((void *)ar_block,RECORDSIZE);
- strcpy(ar_block->header.arch_name,real_s_name);
- ar_block->header.linkflag = LF_MULTIVOL;
- to_oct((long)real_s_sizeleft,1+12,
- ar_block->header.size);
- to_oct((long)real_s_totsize-real_s_sizeleft,
- 1+12,ar_block->header.offset);
- tmp=f_verbose;
- f_verbose=0;
- finish_header(ar_block);
- f_verbose=tmp;
- if(f_volhdr)
- ar_block--;
- }
+ /* We're multivol Panic if we didn't get the right kind of response */
+ /* ENXIO is for the UNIX PC */
+ if (err < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
+ writeerror (err);
+
+ /* If error indicates a short write, we just move to the next tape. */
+
+ if (new_volume (0) < 0)
+ return;
+ bytes_written = 0;
+ if (f_volhdr && real_s_name[0])
+ {
+ copy_back = 2;
+ ar_block -= 2;
+ }
+ else if (f_volhdr || real_s_name[0])
+ {
+ copy_back = 1;
+ ar_block--;
+ }
+ else
+ copy_back = 0;
+ if (f_volhdr)
+ {
+ bzero ((void *) ar_block, RECORDSIZE);
+ sprintf (ar_block->header.arch_name, "%s Volume %d", f_volhdr, volno);
+ to_oct (time (0), 1 + 12, ar_block->header.mtime);
+ ar_block->header.linkflag = LF_VOLHDR;
+ finish_header (ar_block);
+ }
+ if (real_s_name[0])
+ {
+ int tmp;
+
+ if (f_volhdr)
+ ar_block++;
+ bzero ((void *) ar_block, RECORDSIZE);
+ strcpy (ar_block->header.arch_name, real_s_name);
+ ar_block->header.linkflag = LF_MULTIVOL;
+ to_oct ((long) real_s_sizeleft, 1 + 12,
+ ar_block->header.size);
+ to_oct ((long) real_s_totsize - real_s_sizeleft,
+ 1 + 12, ar_block->header.offset);
+ tmp = f_verbose;
+ f_verbose = 0;
+ finish_header (ar_block);
+ f_verbose = tmp;
+ if (f_volhdr)
+ ar_block--;
+ }
- err = rmtwrite(archive, ar_block->charptr,(int) blocksize);
- if(err!=blocksize)
- writeerror(err);
- else if (f_totals)
- tot_written += blocksize;
-
-
- bytes_written = blocksize;
- if(copy_back) {
- ar_block+=copy_back;
- bcopy((void *)(ar_block+blocking-copy_back),
- (void *)ar_record,
- copy_back*RECORDSIZE);
- ar_record+=copy_back;
-
- if(real_s_sizeleft>=copy_back*RECORDSIZE)
- real_s_sizeleft-=copy_back*RECORDSIZE;
- else if((real_s_sizeleft+RECORDSIZE-1)/RECORDSIZE<=copy_back)
- real_s_name[0] = '\0';
- else {
+ err = rmtwrite (archive, ar_block->charptr, (int) blocksize);
+ if (err != blocksize)
+ writeerror (err);
+ else if (f_totals)
+ tot_written += blocksize;
+
+
+ bytes_written = blocksize;
+ if (copy_back)
+ {
+ ar_block += copy_back;
+ bcopy ((void *) (ar_block + blocking - copy_back),
+ (void *) ar_record,
+ copy_back * RECORDSIZE);
+ ar_record += copy_back;
+
+ if (real_s_sizeleft >= copy_back * RECORDSIZE)
+ real_s_sizeleft -= copy_back * RECORDSIZE;
+ else if ((real_s_sizeleft + RECORDSIZE - 1) / RECORDSIZE <= copy_back)
+ real_s_name[0] = '\0';
+ else
+ {
#ifdef __MSDOS__
- if(save_name[1]==':')
- save_name+=2;
+ if (save_name[1] == ':')
+ save_name += 2;
#endif
- while(*save_name=='/')
- save_name++;
+ while (*save_name == '/')
+ save_name++;
- strcpy(real_s_name,save_name);
- real_s_sizeleft = save_sizeleft;
- real_s_totsize=save_totsize;
- }
- copy_back = 0;
+ strcpy (real_s_name, save_name);
+ real_s_sizeleft = save_sizeleft;
+ real_s_totsize = save_totsize;
}
+ copy_back = 0;
+ }
}
/* Handle write errors on the archive. Write errors are always fatal */
/* Hitting the end of a volume does not cause a write error unless the write
* was the first block of the volume */
void
-writeerror(err)
-int err;
+writeerror (err)
+ int err;
{
- if (err < 0) {
- msg_perror("can't write to %s",ar_files[cur_ar_file]);
- exit(EX_BADARCH);
- } else {
- msg("only wrote %u of %u bytes to %s",err,blocksize,ar_files[cur_ar_file]);
- exit(EX_BADARCH);
- }
+ if (err < 0)
+ {
+ msg_perror ("can't write to %s", ar_files[cur_ar_file]);
+ exit (EX_BADARCH);
+ }
+ else
+ {
+ msg ("only wrote %u of %u bytes to %s", err, blocksize, ar_files[cur_ar_file]);
+ exit (EX_BADARCH);
+ }
}
/*
@@ -804,358 +901,403 @@ int err;
* If the read should be retried, readerror() returns to the caller.
*/
void
-readerror()
+readerror ()
{
# define READ_ERROR_MAX 10
- read_error_flag++; /* Tell callers */
+ read_error_flag++; /* Tell callers */
- msg_perror("read error on %s",ar_files[cur_ar_file]);
+ msg_perror ("read error on %s", ar_files[cur_ar_file]);
- if (baserec == 0) {
- /* First block of tape. Probably stupidity error */
- exit(EX_BADARCH);
- }
+ if (baserec == 0)
+ {
+ /* First block of tape. Probably stupidity error */
+ exit (EX_BADARCH);
+ }
- /*
+ /*
* Read error in mid archive. We retry up to READ_ERROR_MAX times
* and then give up on reading the archive. We set read_error_flag
* for our callers, so they can cope if they want.
*/
- if (r_error_count++ > READ_ERROR_MAX) {
- msg("Too many errors, quitting.");
- exit(EX_BADARCH);
- }
- return;
+ if (r_error_count++ > READ_ERROR_MAX)
+ {
+ msg ("Too many errors, quitting.");
+ exit (EX_BADARCH);
+ }
+ return;
}
/*
* Perform a read to flush the buffer.
*/
void
-fl_read()
+fl_read ()
{
- int err; /* Result from system call */
- int left; /* Bytes left */
- char *more; /* Pointer to next byte to read */
+ int err; /* Result from system call */
+ int left; /* Bytes left */
+ char *more; /* Pointer to next byte to read */
- if (f_checkpoint && ! (++checkpoint % 10))
- msg ("Read checkpoint %d\n", checkpoint);
+ if (f_checkpoint && !(++checkpoint % 10))
+ msg ("Read checkpoint %d\n", checkpoint);
- /*
+ /*
* Clear the count of errors. This only applies to a single
* call to fl_read. We leave read_error_flag alone; it is
* only turned off by higher level software.
*/
- r_error_count = 0; /* Clear error count */
+ r_error_count = 0; /* Clear error count */
- /*
+ /*
* If we are about to wipe out a record that
* somebody needs to keep, copy it out to a holding
* area and adjust somebody's pointer to it.
*/
- if (save_rec &&
- *save_rec >= ar_record &&
- *save_rec < ar_last) {
- record_save_area = **save_rec;
- *save_rec = &record_save_area;
- }
- if(write_archive_to_stdout && baserec!=0) {
- err=rmtwrite(1, ar_block->charptr, blocksize);
- if(err!=blocksize)
- writeerror(err);
- }
- if(f_multivol) {
- if(save_name) {
- if(save_name!=real_s_name) {
+ if (save_rec &&
+ *save_rec >= ar_record &&
+ *save_rec < ar_last)
+ {
+ record_save_area = **save_rec;
+ *save_rec = &record_save_area;
+ }
+ if (write_archive_to_stdout && baserec != 0)
+ {
+ err = rmtwrite (1, ar_block->charptr, blocksize);
+ if (err != blocksize)
+ writeerror (err);
+ }
+ if (f_multivol)
+ {
+ if (save_name)
+ {
+ if (save_name != real_s_name)
+ {
#ifdef __MSDOS__
- if(save_name[1]==':')
- save_name+=2;
+ if (save_name[1] == ':')
+ save_name += 2;
#endif
- while(*save_name=='/')
- save_name++;
+ while (*save_name == '/')
+ save_name++;
- strcpy(real_s_name,save_name);
- save_name=real_s_name;
- }
- real_s_totsize = save_totsize;
- real_s_sizeleft = save_sizeleft;
-
- } else {
- real_s_name[0]='\0';
- real_s_totsize=0;
- real_s_sizeleft = 0;
- }
+ strcpy (real_s_name, save_name);
+ save_name = real_s_name;
+ }
+ real_s_totsize = save_totsize;
+ real_s_sizeleft = save_sizeleft;
+
+ }
+ else
+ {
+ real_s_name[0] = '\0';
+ real_s_totsize = 0;
+ real_s_sizeleft = 0;
}
+ }
error_loop:
- err = rmtread(archive, ar_block->charptr, (int)blocksize);
- if (err == blocksize)
- return;
-
- if((err == 0 || (err<0 && errno==ENOSPC) || (err > 0 && !f_reblock)) && f_multivol) {
- union record *head;
-
- try_volume:
- if(new_volume((cmd_mode==CMD_APPEND || cmd_mode==CMD_CAT || cmd_mode==CMD_UPDATE) ? 2 : 1)<0)
- return;
- vol_error:
- err = rmtread(archive, ar_block->charptr,(int) blocksize);
- if(err < 0) {
- readerror();
- goto vol_error;
- }
- if(err!=blocksize)
- goto short_read;
+ err = rmtread (archive, ar_block->charptr, (int) blocksize);
+ if (err == blocksize)
+ return;
- head=ar_block;
+ if ((err == 0 || (err < 0 && errno == ENOSPC) || (err > 0 && !f_reblock)) && f_multivol)
+ {
+ union record *head;
- if(head->header.linkflag==LF_VOLHDR) {
- if(f_volhdr) {
-#if 0
- char *ptr;
+ try_volume:
+ if (new_volume ((cmd_mode == CMD_APPEND || cmd_mode == CMD_CAT || cmd_mode == CMD_UPDATE) ? 2 : 1) < 0)
+ return;
+ vol_error:
+ err = rmtread (archive, ar_block->charptr, (int) blocksize);
+ if (err < 0)
+ {
+ readerror ();
+ goto vol_error;
+ }
+ if (err != blocksize)
+ goto short_read;
- ptr=(char *)malloc(strlen(f_volhdr)+20);
- sprintf(ptr,"%s Volume %d",f_volhdr,volno);
-#endif
- if (re_match (label_pattern, head->header.arch_name,
- strlen (head->header.arch_name),
- 0, 0) < 0) {
- msg("Volume mismatch! %s!=%s",f_volhdr,
- head->header.arch_name);
- --volno;
- --global_volno;
- goto try_volume;
- }
-
+ head = ar_block;
+
+ if (head->header.linkflag == LF_VOLHDR)
+ {
+ if (f_volhdr)
+ {
#if 0
- if(strcmp(ptr,head->header.name)) {
- msg("Volume mismatch! %s!=%s",ptr,head->header.name);
- --volno;
- --global_volno;
- free(ptr);
- goto try_volume;
- }
- free(ptr);
+ char *ptr;
+
+ ptr = (char *) malloc (strlen (f_volhdr) + 20);
+ sprintf (ptr, "%s Volume %d", f_volhdr, volno);
#endif
- }
- if(f_verbose)
- fprintf(msg_file,"Reading %s\n",head->header.arch_name);
- head++;
- } else if(f_volhdr) {
- msg("Warning: No volume header!");
+ if (re_match (label_pattern, head->header.arch_name,
+ strlen (head->header.arch_name),
+ 0, 0) < 0)
+ {
+ msg ("Volume mismatch! %s!=%s", f_volhdr,
+ head->header.arch_name);
+ --volno;
+ --global_volno;
+ goto try_volume;
}
- if(real_s_name[0]) {
- long from_oct();
-
- if(head->header.linkflag!=LF_MULTIVOL || strcmp(head->header.arch_name,real_s_name)) {
- msg("%s is not continued on this volume!",real_s_name);
- --volno;
- --global_volno;
- goto try_volume;
- }
- if(real_s_totsize!=from_oct(1+12,head->header.size)+from_oct(1+12,head->header.offset)) {
- msg("%s is the wrong size (%ld!=%ld+%ld)",
- head->header.arch_name,save_totsize,
- from_oct(1+12,head->header.size),
- from_oct(1+12,head->header.offset));
- --volno;
- --global_volno;
- goto try_volume;
- }
- if(real_s_totsize-real_s_sizeleft!=from_oct(1+12,head->header.offset)) {
- msg("This volume is out of sequence");
- --volno;
- --global_volno;
- goto try_volume;
- }
- head++;
+#if 0
+ if (strcmp (ptr, head->header.name))
+ {
+ msg ("Volume mismatch! %s!=%s", ptr, head->header.name);
+ --volno;
+ --global_volno;
+ free (ptr);
+ goto try_volume;
}
- ar_record=head;
- return;
- } else if (err < 0) {
- readerror();
- goto error_loop; /* Try again */
+ free (ptr);
+#endif
+ }
+ if (f_verbose)
+ fprintf (msg_file, "Reading %s\n", head->header.arch_name);
+ head++;
+ }
+ else if (f_volhdr)
+ {
+ msg ("Warning: No volume header!");
+ }
+
+ if (real_s_name[0])
+ {
+ long from_oct ();
+
+ if (head->header.linkflag != LF_MULTIVOL || strcmp (head->header.arch_name, real_s_name))
+ {
+ msg ("%s is not continued on this volume!", real_s_name);
+ --volno;
+ --global_volno;
+ goto try_volume;
+ }
+ if (real_s_totsize != from_oct (1 + 12, head->header.size) + from_oct (1 + 12, head->header.offset))
+ {
+ msg ("%s is the wrong size (%ld!=%ld+%ld)",
+ head->header.arch_name, save_totsize,
+ from_oct (1 + 12, head->header.size),
+ from_oct (1 + 12, head->header.offset));
+ --volno;
+ --global_volno;
+ goto try_volume;
+ }
+ if (real_s_totsize - real_s_sizeleft != from_oct (1 + 12, head->header.offset))
+ {
+ msg ("This volume is out of sequence");
+ --volno;
+ --global_volno;
+ goto try_volume;
+ }
+ head++;
}
+ ar_record = head;
+ return;
+ }
+ else if (err < 0)
+ {
+ readerror ();
+ goto error_loop; /* Try again */
+ }
- short_read:
- more = ar_block->charptr + err;
- left = blocksize - err;
+short_read:
+ more = ar_block->charptr + err;
+ left = blocksize - err;
again:
- if (0 == (((unsigned)left) % RECORDSIZE)) {
- /* FIXME, for size=0, multi vol support */
- /* On the first block, warn about the problem */
- if (!f_reblock && baserec == 0 && f_verbose && err > 0) {
- /* msg("Blocksize = %d record%s",
+ if (0 == (((unsigned) left) % RECORDSIZE))
+ {
+ /* FIXME, for size=0, multi vol support */
+ /* On the first block, warn about the problem */
+ if (!f_reblock && baserec == 0 && f_verbose && err > 0)
+ {
+ /* msg("Blocksize = %d record%s",
err / RECORDSIZE, (err > RECORDSIZE)? "s": "");*/
- msg("Blocksize = %d records", err / RECORDSIZE);
- }
- ar_last = ar_block + ((unsigned)(blocksize - left))/RECORDSIZE;
- return;
+ msg ("Blocksize = %d records", err / RECORDSIZE);
}
- if (f_reblock) {
- /*
+ ar_last = ar_block + ((unsigned) (blocksize - left)) / RECORDSIZE;
+ return;
+ }
+ if (f_reblock)
+ {
+ /*
* User warned us about this. Fix up.
*/
- if (left > 0) {
-error2loop:
- err = rmtread(archive, more, (int)left);
- if (err < 0) {
- readerror();
- goto error2loop; /* Try again */
- }
- if (err == 0) {
- msg("archive %s EOF not on block boundary",ar_files[cur_ar_file]);
- exit(EX_BADARCH);
- }
- left -= err;
- more += err;
- goto again;
- }
- } else {
- msg("only read %d bytes from archive %s",err,ar_files[cur_ar_file]);
- exit(EX_BADARCH);
+ if (left > 0)
+ {
+ error2loop:
+ err = rmtread (archive, more, (int) left);
+ if (err < 0)
+ {
+ readerror ();
+ goto error2loop; /* Try again */
+ }
+ if (err == 0)
+ {
+ msg ("archive %s EOF not on block boundary", ar_files[cur_ar_file]);
+ exit (EX_BADARCH);
+ }
+ left -= err;
+ more += err;
+ goto again;
}
+ }
+ else
+ {
+ msg ("only read %d bytes from archive %s", err, ar_files[cur_ar_file]);
+ exit (EX_BADARCH);
+ }
}
/*
* Flush the current buffer to/from the archive.
*/
void
-flush_archive()
+flush_archive ()
{
- int c;
-
- baserec += ar_last - ar_block; /* Keep track of block #s */
- ar_record = ar_block; /* Restore pointer to start */
- ar_last = ar_block + blocking; /* Restore pointer to end */
-
- if (ar_reading) {
- if(time_to_start_writing) {
- time_to_start_writing=0;
- ar_reading=0;
-
- if(file_to_switch_to>=0) {
- if((c=rmtclose(archive))<0)
- msg_perror("Warning: can't close %s(%d,%d)",ar_files[cur_ar_file],archive,c);
-
- archive=file_to_switch_to;
- } else
- (void)backspace_output();
- fl_write();
- } else
- fl_read();
- } else {
- fl_write();
+ int c;
+
+ baserec += ar_last - ar_block;/* Keep track of block #s */
+ ar_record = ar_block; /* Restore pointer to start */
+ ar_last = ar_block + blocking;/* Restore pointer to end */
+
+ if (ar_reading)
+ {
+ if (time_to_start_writing)
+ {
+ time_to_start_writing = 0;
+ ar_reading = 0;
+
+ if (file_to_switch_to >= 0)
+ {
+ if ((c = rmtclose (archive)) < 0)
+ msg_perror ("Warning: can't close %s(%d,%d)", ar_files[cur_ar_file], archive, c);
+
+ archive = file_to_switch_to;
+ }
+ else
+ (void) backspace_output ();
+ fl_write ();
}
+ else
+ fl_read ();
+ }
+ else
+ {
+ fl_write ();
+ }
}
/* Backspace the archive descriptor by one blocks worth.
If its a tape, MTIOCTOP will work. If its something else,
we try to seek on it. If we can't seek, we lose! */
int