rsalz@uunet.uu.net (Rich Salz) (02/03/89)
Submitted-by: Rahul Dhesi <bsu-cs!dhesi> Posting-number: Volume 17, Issue 65 Archive-name: zoo2/part02 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 10)." # Wrapped by rsalz@papaya.bbn.com on Thu Feb 2 18:03:57 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Copyright' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Copyright'\" else echo shar: Extracting \"'Copyright'\" \(3768 characters\) sed "s/^X//" >'Copyright' <<'END_OF_FILE' X X COPYRIGHT X X XThe following rules apply only to the zoo archiver itself. XCurrently, all extract-only programs, and all supporting utili- Xties, are fully in the public domain and are expected to remain so Xfor the forseeable future. X X X Copyright Statement for Version 1.71 X XThe distribution restrictions placed on zoo versions 1.71 and ear- Xlier are now relaxed. Version 1.71 and earlier source and the XAmigaDOS and MS-DOS binary files may be distributed for any pur- Xpose, whether commercial or noncommercial, by anybody, provided X(a) the files are distributed unmodified and (b) the recipient is Xnotified in advance of being provided the software that "version X1.71 is an outdated version and version 2.00 and higher versions Xare now available from other sources". However, creation and dis- Xtribution of any derivative work is governed by the copyright Xstatement for versions 2.00 and 2.01. X X X Copyright Statement for Versions 2.00 and 2.01 X XThe following conditions apply to the C source code, the MS-DOS Xsupport package, and to the MS-DOS executable code. Distribution Xconditions for J. Brian Waters's AmigaDOS implementation may Xdiffer and will be stated in the copyright statement accompanying Xit. X X"This program" refers to versions 2.00 and 2.01 and separately to Xeach subsequent version of the Zoo archiver and to all derivative Xworks thereof. "Distribution right" means any copyright, compila- Xtion copyright, license, or other right to control distribution or Xcopying. "Compiled code" means software that can be executed by a Xcomputer system. X XThis program is copyrighted but its distribution for noncommercial Xpurposes is permitted, with the following restrictions. X X - You are prohibited from distributing this program as part of X any package over which you claim a distribution right. This X restriction does not apply if any distribution right is X claimed only over individual items that you own or for which X the distribution right has been explicitly assigned to you, X and not over the package as a collection. X X - You are prohibited from making this program available for X downloading via telecommunications if you charge a total of X more than $8.00 per hour at 1200 bps during evening and night X hours. X X - You are prohibited from distributing this program as compiled X code unless you also distribute the source code from which X the compiled code was obtained. This restriction does not X apply if the compiled code was created by me. X X - You are prohibited from creating, from this program, any X derivative work over which you claim a distribution right. X X - You are prohibited from creating from this program, whether X deliberately or through negligence, any derivative work that X violates the compatibility goals stated in the user manual X for this program. X X - You may use this program, and any derivative works that you X create, internally within your own organization free of X charge. You may distribute such derivative works outside X your organization provided you adhere to all other conditions X of this copyright policy. X XThe above restrictions may be relaxed by special agreement; please Xcontact me for details. X X X -- Rahul Dhesi 1988/08/25 X UUCP: iuvax!bsu-cs!dhesi or X pur-ee!bsu-cs!dhesi X GEnie: DHESI X Plink: OLS806 X Phone: +1 317 285 8641 daytime EST X US mail: 720 W. Centennial Ave #15, X Muncie, Indiana 47303 END_OF_FILE if test 3768 -ne `wc -c <'Copyright'`; then echo shar: \"'Copyright'\" unpacked with wrong size! fi # end of 'Copyright' fi if test -f 'addfname.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'addfname.c'\" else echo shar: Extracting \"'addfname.c'\" \(3539 characters\) sed "s/^X//" >'addfname.c' <<'END_OF_FILE' X#ifndef LINT Xstatic char sccsid[]="@(#) addfname.c 2.11 88/02/06 20:17:17"; X#endif /* LINT */ X X/* XCopyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved X(C) Copyright 1988 Rahul Dhesi -- All rights reserved X*/ X#include "options.h" X X/* Adds a filename to global list. (This global list will eventually Xbe searched by the inlist() function.) The second and subsequent Xparameters suppplied are stored with the name of the file and Xreturned by inlist. */ X X#include "zooio.h" X#include "various.h" X#include "zoo.h" X#include "zoofns.h" X#include "zoomem.h" /* to get LIST_SIZE */ X Xstatic struct item *fentry[LIST_SIZE]; Xstatic int lastname = 0; /* index of last name */ X Xstruct item { /* global filename list entry */ X char *fname; X long position; X unsigned int date; X unsigned int time; X unsigned vflag; X unsigned version_no; X}; X Xvoid addfname(fname, position, date, time, vflag, version_no) Xchar *fname; Xlong position; Xunsigned int date, time; Xunsigned vflag; Xunsigned version_no; X{ X if (lastname == 0) X fentry[lastname] = (struct item *) emalloc (sizeof(struct item)); X X /* keep a few empty spaces at end to avoid off by one errors */ X if (lastname >= LIST_SIZE - 3) X memerr(); X X fentry[lastname]->fname = strdup(fname); X fentry[lastname]->position = position; X fentry[lastname]->date = date; X fentry[lastname]->time = time; X fentry[lastname]->vflag = vflag; X fentry[lastname]->version_no = version_no; X lastname++; X /* allocate memory for empty entry at end */ X fentry[lastname] = (struct item *) emalloc (sizeof(struct item)); X} /* addfname */ X X/* inlist() */ X/* Examines global list built by addfname() to see if supplied filename Xis in the list. X XIf found, returns the file's position within the archive as the function Xvalue and the date, time, version flag, and version number as parameters. XIf not found, returns -1. Also returns the highest version no. seen Xfor this filename and the vflag associated with that version. X XA simple sequential search is done. X XIf justname is nonzero, then the search is for the filename only Xwithout the directory prefix; else it is for the full Xpathname. X*/ X Xlong inlist (fname, date, time, this_version_no, high_vflag, X high_version_no, high_pos, justname) Xchar *fname; Xunsigned int *date, *time; Xunsigned *high_vflag; Xunsigned *this_version_no; Xunsigned *high_version_no; Xlong *high_pos; Xint justname; X{ X register int i = 0; X X *high_version_no = 0; X if (justname) X fname = nameptr (fname); /* if directory wanted */ X fentry[lastname]->fname = fname; /* sentinel */ X fentry[lastname]->version_no = 0; X X#ifdef IGNORECASE X#define COMPARE strcmpi X#else X#define COMPARE strcmp X#endif X X while (COMPARE(fname, X (justname ? nameptr (fentry[i]->fname) : fentry[i]->fname)) != 0) { X i++; X } X X if (i == lastname) X return (-1L); X else { X int j; X *date = fentry[i]->date; X *time = fentry[i]->time; X *high_pos = fentry[i]->position; X *high_vflag = fentry[i]->vflag; X for (j = i; j < lastname; j++) { /* find highest version no. for file */ X if (COMPARE(fname, X (justname ? nameptr (fentry[j]->fname) : fentry[j]->fname)) == 0) { X if (*high_version_no < fentry[j]->version_no) { X *high_version_no = fentry[j]->version_no; X *high_vflag = fentry[j]->vflag; X *high_pos = fentry[j]->position; X *date = fentry[j]->date; X *time = fentry[j]->time; X } X } X } X *this_version_no = fentry[i]->version_no; X return (fentry[i]->position); X } X} /* inlist() */ END_OF_FILE if test 3539 -ne `wc -c <'addfname.c'`; then echo shar: \"'addfname.c'\" unpacked with wrong size! fi # end of 'addfname.c' fi if test -f 'basename.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'basename.c'\" else echo shar: Extracting \"'basename.c'\" \(3229 characters\) sed "s/^X//" >'basename.c' <<'END_OF_FILE' X#ifndef LINT X/* @(#) basename.c 2.2 87/12/27 13:42:40 */ Xstatic char sccsid[]="@(#) basename.c 2.2 87/12/27 13:42:40"; X#endif /* LINT */ X X/* XCopyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved X*/ X X#include "options.h" X#include "zooio.h" X#include "zoo.h" X#include "parse.h" X#include "various.h" X#include "zoofns.h" X#include "debug.h" X#include "assert.h" X X/* This function strips device/directory information from Xa pathname and returns just the plain filename */ Xvoid basename (pathname, fname) Xchar *pathname; Xchar fname[]; X{ X strcpy (fname, nameptr (pathname)); X} X X/* Set of legal MSDOS filename characters. The working of cvtchr() depends Xon the order of the first few characters here. In particular, '_' is Xpositioned so '.' gets converted to it. */ Xstatic char legal[] = X"tabcdefghijklmnopqrs_uvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ@^`{}~!#$%&'()-"; X X/**************** Xcvtchr() converts a character to a lowercase alphabetic character in Xa somewhat random way. X*/ X#define cvtchr(ch) legal[(ch & 0xff) % 26] X X/*************** Xcleanup() cleans up a string so it contains only legal MSDOS filename Xcharacters. Any other characters are converted to an underscore. XIf the filename is null or if it begins with a dot, it is fixed. XAll dots are also converted. X*/ X X#ifdef LINT_ARGS Xvoid cleanup (char *); X#endif X Xvoid cleanup (p) Xchar *p; X{ X assert(p != NULL); X if (*p == '\0') X strcpy (p, "X"); X if (*p == '.') X *p = '_'; X while (*p != '\0') { X if (strchr (legal, *p) == NULL) { /* if invalid character */ X *p = cvtchr(*p); X } X p++; X } X} X/* This function strips device/directory information from a pathname, Xforces the remaining filename to MSDOS format, and returns it. Any Xillegal characters are fixed. X*/ Xvoid dosname (pathname, fname) Xchar *pathname; Xchar fname[]; X{ X struct path_st path_st; X parse (&path_st, pathname); X strcpy (fname, path_st.fname); X cleanup (fname); X X#ifdef VER_CH /* remove any trailing extension field */ X if (path_st.ext[0] != '\0') X strip_ver (path_st.ext); X#endif X X /* extension could have been nulled, so we test again */ X if (path_st.ext[0] != '\0') { X cleanup (path_st.ext); X strcat (fname, "."); X strcat (fname, path_st.ext); X } X X#ifdef SPECMOD X specfname (fname); X#endif X} X X/* rootname() */ X/* Accepts a pathname. Returns the root filename, i.e., with both the Xdirectory path and the extension stripped. */ X Xvoid rootname (path, root) Xchar *path, *root; X{ X char *p; X static char dot[] = {EXT_CH, '\0'}; X strcpy(root, nameptr(path)); /* copy all but path prefix */ X p = findlast(root, dot); /* find last dot */ X if (p != NULL) /* if found ... */ X *p = '\0'; /* ... null it out */ X} X X/* nameptr() */ X/* Accepts a pathname. Returns a pointer to the filename within Xthat pathname. X*/ X Xchar *nameptr (path) Xchar *path; X{ X char *t; X t = findlast (path, PATH_SEP); /* last char separating device/directory */ X debug ((printf ("nameptr: findlast returned ptr to string [%s].\n",t))) X if (t == NULL) /* no separator */ X return (path); X else { X return (t+1); X } X} END_OF_FILE if test 3229 -ne `wc -c <'basename.c'`; then echo shar: \"'basename.c'\" unpacked with wrong size! fi # end of 'basename.c' fi if test -f 'fiz.1' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fiz.1'\" else echo shar: Extracting \"'fiz.1'\" \(3849 characters\) sed "s/^X//" >'fiz.1' <<'END_OF_FILE' X.\" @(#) fiz.1 1.2 88/01/31 23:22:04 X.\" X.\" For formatting with nroff: X.\" nroff -man fiz.1 X.\" X.TH FIZ 1 "Jan 31, 1988" X.SH NAME Xfiz \- analyze damaged zoo archive for data revovery X.SH SYNOPSIS X.I fiz X.RB archive[ .zoo ] X.SH DESCRIPTION X.I Fiz Xis used to analyze damaged X.I zoo Xarchives and locate directory entries and file data in them. XThe current version of X.I fiz Xis 2.0 and it is meant to be used in conjunction with X.I zoo Xversion 2.0. X.I Fiz Xmakes no assumptions about archive structure. Instead, it simply Xsearches the entire subject archive for tag values Xthat mark the locations of directory entries and file data. XIn a X.I zoo Xarchive, a X.I directory entry Xcontains information about a stored file such as its name, whether Xcompressed or not, and its timestamp. The X.I file data Xare the actual data for the archived file, and may be Xeither the original data, or the result of compressing the file. X.PP XFor each directory entry found, X.I fiz Xprints where in the archive it is located, the directory path and Xfilename(s) found in it, whether the directory entry appears Xto be corrupted (indicated by [*CRC Error*]), and the value of Xthe pointer to the file data that is found in the directory entry. XFor each block of file data found in the archive, X.I fiz Xprints where in the archive the block begins. In the case of Xan undamaged archive, the pointer to file data found in Xa directory entry will correspond to where X.I fiz Xactually locates the data. Here is some sample output from X.I fiz: X.PP X.nf X**************** X 2526: DIR [changes] ==> 95 X 2587: DATA X**************** X 3909: DIR [copyrite] ==> 1478 X 3970: DATA X 4769: DATA X**************** X.fi X.sp 1 XIn such output, X.B DIR Xindicates where X.I fiz Xfound a directory entry in the archive, and X.B DATA Xindicates where X.I fiz Xfound file data in the archive. Filenames located by X.I fiz Xare enclosed in square brackets, and the notation X"==> 95" indicates that the directory entry found by X.I fiz Xat position 2526 has a file data pointer to Xposition 95. In actuality, X.I fiz Xfound file data at positions 2587, 3970, and X4769. Since X.I fiz Xfound only two directory entries, and each directory entry corresponds Xto one file, one of the file data positions is an artifact. X.PP XOnce the locations of directory entries and file data are found, the X.B @ Xmodifier to X.I "zoo's" Xarchive list and extract commands can be used and Xthe archive contents selectively listed or extracted, Xskipping the damaged portion. This is further described Xin the documentation for X.I zoo(1). X.PP XIn the above case, commands to try giving to X.I zoo Xmight be X.B x@2526,2587 X(extract beginning at position 2526, and get file data Xfrom position 2587), X.B x@3090,3970 X(extract at 3090, get data from 3970) Xand X.B x@3909,4769 X(extract at 3909, get data from 4769). Once a correctly-matched Xdirectory entry/file data pair is found, X.I zoo Xwill in most cases synchronize with and correctly extract all files Xsubsequently found in the archive. Trial and error should allow Xall undamaged files to be extracted. XAlso note that self-extracting archives created using X.I sez X(the Self-Extracting X.I Zoo Xutility for MS-DOS), which are normally executed on an MS-DOS Xsystem for extraction, can Xbe extracted on non-MSDOS systems in a similar way. X.PP X.SH "SEE ALSO" Xzoo(1) X.SH BUGS XRandom byte patterns can occasionally be incorrectly recognized Xas tag values. This occurs very rarely, however, and trial Xand error will usually permit all undamaged data to be Xextracted. X.SH DIAGNOSTICS X.I Fiz Xalways exits with a status code of 0. X.SH "FUTURE DIRECTIONS" XAutomation of data recovery from a damaged archive is potentially Xachievable. However, since damaged archives occur only rarely, X.I fiz Xas it currently stands is unlikely to change much in the Xnear future. X.SH AUTHOR XRahul Dhesi END_OF_FILE if test 3849 -ne `wc -c <'fiz.1'`; then echo shar: \"'fiz.1'\" unpacked with wrong size! fi # end of 'fiz.1' fi if test -f 'fiz.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fiz.man'\" else echo shar: Extracting \"'fiz.man'\" \(4227 characters\) sed "s/^X//" >'fiz.man' <<'END_OF_FILE' X X X XFIZ(1) **IX Programmer's Manual FIZ(1) X X X XNAME X fiz - analyze damaged zoo archive for data revovery X XSYNOPSIS X fiz archive[.zoo] X XDESCRIPTION X Fiz is used to analyze damaged zoo archives and locate X directory entries and file data in them. The current ver- X sion of fiz is 2.0 and it is meant to be used in conjunction X with zoo version 2.0. Fiz makes no assumptions about X archive structure. Instead, it simply searches the entire X subject archive for tag values that mark the locations of X directory entries and file data. In a zoo archive, a direc- X tory entry contains information about a stored file such as X its name, whether compressed or not, and its timestamp. The X file data are the actual data for the archived file, and may X be either the original data, or the result of compressing X the file. X X For each directory entry found, fiz prints where in the X archive it is located, the directory path and filename(s) X found in it, whether the directory entry appears to be cor- X rupted (indicated by [*CRC Error*]), and the value of the X pointer to the file data that is found in the directory X entry. For each block of file data found in the archive, X fiz prints where in the archive the block begins. In the X case of an undamaged archive, the pointer to file data found X in a directory entry will correspond to where fiz actually X locates the data. Here is some sample output from fiz: X X **************** X 2526: DIR [changes] ==> 95 X 2587: DATA X **************** X 3909: DIR [copyrite] ==> 1478 X 3970: DATA X 4769: DATA X **************** X X In such output, DIR indicates where fiz found a directory X entry in the archive, and DATA indicates where fiz found X file data in the archive. Filenames located by fiz are X enclosed in square brackets, and the notation "==> 95" X indicates that the directory entry found by fiz at position X 2526 has a file data pointer to position 95. In actuality, X fiz found file data at positions 2587, 3970, and 4769. X Since fiz found only two directory entries, and each direc- X tory entry corresponds to one file, one of the file data X positions is an artifact. X X X X X XPrinted 2/7/88 Jan 31, 1988 1 X X X X X X XFIZ(1) **IX Programmer's Manual FIZ(1) X X X X Once the locations of directory entries and file data are X found, the @ modifier to zoo's archive list and extract com- X mands can be used and the archive contents selectively X listed or extracted, skipping the damaged portion. This is X further described in the documentation for zoo(1). X X In the above case, commands to try giving to zoo might be X x@2526,2587 (extract beginning at position 2526, and get X file data from position 2587), x@3090,3970 (extract at 3090, X get data from 3970) and x@3909,4769 (extract at 3909, get X data from 4769). Once a correctly-matched directory X entry/file data pair is found, zoo will in most cases syn- X chronize with and correctly extract all files subsequently X found in the archive. Trial and error should allow all X undamaged files to be extracted. Also note that self- X extracting archives created using sez (the Self-Extracting X Zoo utility for MS-DOS), which are normally executed on an X MS-DOS system for extraction, can be extracted on non-MSDOS X systems in a similar way. X XSEE ALSO X zoo(1) X XBUGS X Random byte patterns can occasionally be incorrectly recog- X nized as tag values. This occurs very rarely, however, and X trial and error will usually permit all undamaged data to be X extracted. X XDIAGNOSTICS X Fiz always exits with a status code of 0. X XFUTURE DIRECTIONS X Automation of data recovery from a damaged archive is poten- X tially achievable. However, since damaged archives occur X only rarely, fiz as it currently stands is unlikely to X change much in the near future. X XAUTHOR X Rahul Dhesi X X X X X X X X X X X X X X X XPrinted 2/7/88 Jan 31, 1988 2 X X X END_OF_FILE if test 4227 -ne `wc -c <'fiz.man'`; then echo shar: \"'fiz.man'\" unpacked with wrong size! fi # end of 'fiz.man' fi if test -f 'generic.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'generic.c'\" else echo shar: Extracting \"'generic.c'\" \(3350 characters\) sed "s/^X//" >'generic.c' <<'END_OF_FILE' X#ifndef LINT Xstatic char genericid[]="@(#) generic.c 2.2 88/01/24 12:44:03"; X#endif /* LINT */ X X/* XGeneric template for machine-dependent functions. X XThe contents of this file are hereby released to the public domain X X -- Rahul Dhesi 1988/01/24 X XFunctions in this file have not yet been revised to work with zoo Xversion 2.0. To port zoo to a new system, look in files sysv.c and bsd.c Xto see which system-dependent functions may be needed. X*/ X X/**************** Xfunction trunc() truncates a file. X*/ X Xint trunc (handle) Xint handle; X{ X /* code to truncate file goes here -- may be left empty */ X} X X/***************** XFunction gettime() or getutime() gets the date and time of the file handle Xor filename supplied. Date and time is in MSDOS format. X*/ X#ifdef GETUTIME Xgetutime (fname, date, time) Xchar *fname; X#else Xgettime (handle,date,time) Xint handle; X#endif Xunsigned *date, *time; X{ X *date = *time = 0; /* not yet implemented */ X} X X/***************** XFunction settime() or setutime() sets the date and time of the file handle Xor filename supplied. Date and time is in MSDOS format. X*/ X#ifdef NIXTIME Xint setutime(path,date,time) Xchar *path; X#else Xint settime(handle, date, time) Xint handle; X#endif Xunsigned int date, time; X{ X /* not yet implemented */ X} X X/***************** XFunction mktemp() accepts a template of the form `baseXXXXXX' where Xbase is an arbitrary string, and returns a unique temporary filename. XIf template is not correct, it is returned unchanged. X*/ Xchar *mktemp(template) Xchar *template; X{ X#ifndef NDEBUG X if (instr(template, "XXXXXX") == -1) X prterror ('w', "Incorrect template [%s] supplied to mktemp().\n", X template); X#endif X X strcpy(&template[instr(template, "XXXXXX")],"z.@@@"); X return (template); X} X X/***************** XFunction isadir() or isuadir() returns 1 if supplied handle or Xfilename is a directory or other special file that should not be Xarchived, else it returns 0. X*/ X X#ifdef CHEKDIR Xint isadir(han) Xint han; X{ X return (0); /* by default assume never a directory */ X} X#endif X X#ifdef CHEKUDIR Xint isuadir(path) Xchar *path; X{ X return (0); /* by default assume never a directory */ X} X#endif X X/**************** XFunction fixfname() converts the supplied filename to a syntax Xlegal for the host system. It is used during extraction to make sure Xthat a file can be extracted even if a badly-implemented archiver Xstored it with an illegal filename. X*/ X Xchar *fixfname(fname) Xchar *fname; X{ X return (fname); /* default is no-op */ X} X X/***************** XFunction nextfile() is effectively a no-op. Any wildcard expansion Xmust have been done before Zoo receives the arguments. X*/ X X#define FMAX 1 Xchar *nextfile (what, filespec, fileset) Xint what; /* whether to initialize or match */ Xregister char *filespec; /* filespec to match if initializing */ Xregister int fileset; /* which set of files */ X{ X static int first_time [FMAX+1]; X static char saved_fspec [FMAX+1][PATHSIZE]; /* our own copy of filespec */ X X if (what == 0) { X strcpy (saved_fspec[fileset], filespec); /* save the filespec */ X first_time[fileset] = 1; X return (NULL); X } X X if (first_time[fileset]) { X first_time[fileset] = 0; X return (saved_fspec[fileset]); X } else { X return (NULL); X } X} END_OF_FILE if test 3350 -ne `wc -c <'generic.c'`; then echo shar: \"'generic.c'\" unpacked with wrong size! fi # end of 'generic.c' fi if test -f 'getfile.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'getfile.c'\" else echo shar: Extracting \"'getfile.c'\" \(4549 characters\) sed "s/^X//" >'getfile.c' <<'END_OF_FILE' X#ifndef LINT Xstatic char sccsid[]="@(#) getfile.c 2.7 88/01/24 12:44:23"; X#endif /* LINT */ X X/* XCopyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved X(C) Copyright 1988 Rahul Dhesi -- All rights reserved X*/ X X#include "options.h" X/* XThis function copies n characters from the source file to the destination X XInput: out_f: destination file X in_f: source file X count: count of characters to copy X docrc: 0 if crc not wanted X XIf count is -1, copying is done until eof is encountered. X XThe source file is transferred to the current file pointer position in the Xdestination file, using the handles provided. Function return value is 0 Xif no error, 2 if write error, and 3 if read error. X XIf docrc is not 0, the global variable crccode is updated via addbfcrc(). XThis is done even if the output is to the null device. X XIf UNBUF_IO is defined, and if more than UNBUF_LIMIT bytes are Xbeing transferred or copying is to end of file, the data transfer Xis done using low-level read() and write() functions, which must Xbe defined elsewhere. File descriptors are obtained for this Xpurpose using the fileno() macro, which must be provided elsewhere Xtoo. This is meant to provide greater efficiency on some systems. XThe files of type ZOOFILE are synchronized with their file Xdescriptors by doing a reasonable number of seeks and other Xmiscellaneous operations before and after the transfer. Such Xsimultaneous use of buffered and unbuffered files is not Xportable and should not be used without extensive testing. X*/ X X#ifdef UNBUF_IO Xint read PARMS ((int, VOIDPTR, unsigned)); Xint write PARMS ((int, VOIDPTR, unsigned)); Xlong lseek PARMS ((int, long, int)); Xlong tell PARMS ((int)); X#endif /* UNBUF_IO */ X X#include "zoo.h" /* satisfy declarations in zooio.h */ X#include "zooio.h" X#include "various.h" X#include "zoofns.h" X#include "zoomem.h" X Xint getfile (in_f, out_f, count, docrc) XZOOFILE in_f, out_f; Xlong count; Xint docrc; X{ X register int how_much; X#ifdef UNBUF_IO X int in_d, out_d; /* file descriptors for unbuffered I/O */ X#endif /* UNBUF_IO */ X X#ifdef UNBUF_IO X if (out_f != NULLFILE && (count == -1 || count > UNBUF_LIMIT)) { X in_d = fileno (in_f); /* get .. */ X out_d = fileno (out_f); /* ... file descriptors */ X X /* Synchronize buffered and unbuffered files */ X zooseek (in_f, zootell (in_f), 0); X zooseek (out_f, zootell (out_f), 0); X X#if 0 X lseek (in_d, zootell (in_f), 0); X lseek (out_d, zootell (out_f), 0); X#endif X X if (count == -1) { X while ((how_much = read (in_d, out_buf_adr, MEM_BLOCK_SIZE)) > 0) { X if (how_much == -1 || X write (out_d, out_buf_adr, how_much) != how_much) X return (2); X if (docrc) X addbfcrc (out_buf_adr,how_much); X } X zooseek (in_f, tell (in_d), 0); /* resynch */ X zooseek (out_f, tell (out_d), 0); /* resynch */ X X#ifndef NDEBUG X if (ftell (in_f) != tell (in_d) || ftell (out_f) != tell (out_d)) { X prterror ('w', "seek mismatch in copy to EOF\n"); X printf ("in_f =%6ld, in_d =%6ld\n", ftell (in_f), tell (in_d)); X printf ("out_f=%6ld, out_d=%6ld\n", ftell (out_f), tell (out_d)); X } X#endif /* NDEBUG */ X X return (0); X } X X while (count > 0) { X if (count > MEM_BLOCK_SIZE) X how_much = MEM_BLOCK_SIZE; X else X how_much = (int) count; X count -= how_much; X if (read (in_d, out_buf_adr, how_much) != how_much) X return (3); X if (docrc) X addbfcrc (out_buf_adr, how_much); X if (write (out_d, out_buf_adr, how_much) != how_much) X return (2); X } X zooseek (in_f, tell (in_d), 0); /* resynch */ X zooseek (out_f, tell (out_d), 0); /* resynch */ X#ifndef NDEBUG X if (ftell (in_f) != tell (in_d) || ftell (out_f) != tell (out_d)) X prterror ('w', "seek mismatch in fixed length copy\n"); X#endif /* NDEBUG */ X return (0); X } X#endif /* UNBUF_IO */ X X if (count == -1) { X while ((how_much = zooread (in_f, out_buf_adr, MEM_BLOCK_SIZE)) > 0) { X if (how_much == -1 || X zoowrite (out_f, out_buf_adr, how_much) != how_much) X return (2); X if (docrc) X addbfcrc (out_buf_adr,how_much); X } X return (0); X } X X while (count > 0) { X if (count > MEM_BLOCK_SIZE) X how_much = MEM_BLOCK_SIZE; X else X how_much = (int) count; X count -= how_much; X if (zooread (in_f, out_buf_adr, how_much) != how_much) X return (3); X if (docrc) X addbfcrc (out_buf_adr, how_much); X if (zoowrite (out_f, out_buf_adr, how_much) != how_much) X return (2); X } X return (0); X} END_OF_FILE if test 4549 -ne `wc -c <'getfile.c'`; then echo shar: \"'getfile.c'\" unpacked with wrong size! fi # end of 'getfile.c' fi if test -f 'makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'makefile'\" else echo shar: Extracting \"'makefile'\" \(2601 characters\) sed "s/^X//" >'makefile' <<'END_OF_FILE' X# @(#) makefile 2.2 88/01/27 19:37:59 X#Make Zoo X# X#The contents of this makefile are hereby released to the public domain. X# -- Rahul Dhesi 1986/12/31 X# X#This makefile should not be invoked directly, because different X#targets require different compilation switches. The standard make X#utility does not allow different switches to be specified for each target X#(except through recursive invocation, which takes more memory than X#some systems have). Invoke this makefile through one of the several X#shell scripts supplied. For non *NIX systems, convert the appropriate X#shell script to one accepted by your system. X# X#This makefile expects two macro names, `cswitch' and `extra', to hold X#all the switches to be supplied to the C compiler. It also expects X#a macro `ldswitch' to hold the switch for the loader when invoked. X# X#There is no target for installation. Just copy the executables X#(zoo and fiz) to the appropriate destination directory. X# X#"make lint" will probably not work. X XCC = cc Xcswitch = Xextra = -DBIG_MEM -DNDEBUG X X#List of all object files created for Zoo XZOOOBJS = addbfcrc.o addfname.o basename.o comment.o crcdefs.o \ X getfile.o lzc.o lzd.o machine.o makelist.o misc.o misc2.o \ X nextfile.o needed.o options.o parse.o portable.o prterror.o \ X version.o zoo.o zooadd.o zooadd2.o zoodel.o zooext.o zoofilt.o \ X zoolist.o zoopack.o X XFIZOBJS = fiz.o addbfcrc.o portable.o crcdefs.o X X.c.o : X $(CC) $(cswitch) $(extra) $*.c X Xall : ERROR X X#doesn't work Xlint: $(ZOOOBJS) X lint $(ZOOOBJS) X Xzoo: $(ZOOOBJS) X $(CC) $(ldswitch) $(ZOOOBJS) X Xfiz: $(FIZOBJS) X $(CC) $(ldswitch) $(FIZOBJS) X Xclean : X /bin/rm -f core a.out $(ZOOOBJS) $(FIZOBJS) X Xlzd.o : lzd.c zoomem.h X $(CC) $(cswitch) $(extra) $*.c X Xlzc.o : lzc.c zoomem.h X $(CC) $(cswitch) $(extra) $*.c X Xaddbfcrc.o : addbfcrc.c X Xaddfname.o : addfname.c X Xbasename.o : basename.c X Xcomment.c : zooio.h X Xcrcdefs.o : crcdefs.c X Xgetfile.o : getfile.c zoomem.h X $(CC) $(cswitch) $(extra) $*.c X Xmachine.o : machine.c nixtime.i X $(CC) $(cswitch) $(extra) $*.c X Xmakelist.o : makelist.c X Xmisc.c : zooio.h X Xmisc2.o : misc2.c zoomem.h X $(CC) $(cswitch) $(extra) $*.c X Xoptions.o : options.c X Xnextfile.o : nextfile.c X Xneeded.o : needed.c X Xparse.o : parse.c X Xportable.o : portable.c X Xprterror.o : prterror.c X Xzoo.o : zoo.c zoomem.h errors.i X $(CC) $(cswitch) $(extra) $*.c X Xzooadd.c : zooio.h X Xzooadd2.c : zooio.h X Xzoodel.c : zooio.h X Xzooext.o : zooext.c errors.i zooio.h X $(CC) $(cswitch) $(extra) $*.c X Xzoofilt.o : zoofilt.c zooio.h X $(CC) $(cswitch) $(extra) $*.c X Xzoolist.c : zooio.h X Xzoopack.c : zooio.h END_OF_FILE if test 2601 -ne `wc -c <'makefile'`; then echo shar: \"'makefile'\" unpacked with wrong size! fi # end of 'makefile' fi if test -f 'mstime.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mstime.i'\" else echo shar: Extracting \"'mstime.i'\" \(2860 characters\) sed "s/^X//" >'mstime.i' <<'END_OF_FILE' X#ifndef LINT Xstatic char mstimeid[]="@(#) mstime.i 2.2 88/01/24 12:47:58"; X#endif /* LINT */ X X/* X(C) Copyright 1987 Rahul Dhesi -- All rights reserved X*/ X X#define BASEYEAR 1970 X X/**************** XFunction mstime() converts time in seconds since January 1 of BASEYEAR Xto MS-DOS format date and time. X*/ Xmstime(longtime, date, time) Xlong longtime; /* input: seconds since Jan 1, BASEYEAR */ Xint *date, *time; /* output: MS-DOS format date and time */ X X{ X static int daysinmo[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; X#define FEBRUARY 1 X int year, month, day, hour, min, sec; X long secsinhour, secsinday, secsinyear, secsinleapyear; X X int leapyear; /* is this a leap year? */ X int done; /* control variable */ X X secsinhour = (long) (60 * 60); /* seconds in an hour */ X secsinday = 24 * secsinhour; /* seconds in a day */ X secsinyear = 365 * secsinday; /* seconds in a year */ X secsinleapyear = secsinyear + secsinday; /* seconds in a leap year */ X X#ifdef DEBUG Xprintf("mstime: input longtime = %ld\n", longtime); X#endif X X /* We can't handle dates before 1970 so force longtime positive */ X if (longtime < 0) X longtime = 0; X X /* X Step through years from BASEYEAR onwards, subtracting number of X seconds in each, stopping just before longtime would become negative. X */ X year = BASEYEAR; X done = 0; X while (!done) { X long yearlength; X leapyear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); X if (leapyear) X yearlength = secsinleapyear; X else X yearlength = secsinyear; X X if (longtime >= yearlength) { X longtime -= yearlength; X year++; X } else X done++; X } X X /* Now `year' contains year and longtime contains remaining seconds */ X daysinmo[FEBRUARY] = leapyear ? 29 : 28; X X month = 0; /* range is 0:11 */ X while (longtime > daysinmo[month] * secsinday) { X longtime = longtime - daysinmo[month] * secsinday; X month++; X } X month++; /* range now 1:12 */ X X day = longtime / secsinday; /* day of month, range 0:30 */ X longtime = longtime % secsinday; X day++; /* day of month, range 1:31 */ X X hour = longtime / secsinhour; /* hours, range 0:23 */ X longtime = longtime % secsinhour; X X min = longtime / 60L; /* minutes, range 0:59 */ X longtime = longtime % 60L; X X sec = longtime; /* seconds, range 0:59 */ X X#ifdef DEBUG Xprintf("mstime: date = %4d/%02d/%02d time = %02d:%02d:%02d\n", X year, month, day, hour, min, sec); Xif (leapyear) X printf("(leap year)\n"); X#endif X X if (year < 1980) X year = 1980; X *date = day + (month << 5) + ((year - 1980) << 9); X *time = (sec / 2) + (min << 5) + (hour << 11); X} END_OF_FILE if test 2860 -ne `wc -c <'mstime.i'`; then echo shar: \"'mstime.i'\" unpacked with wrong size! fi # end of 'mstime.i' fi if test -f 'nixtime.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'nixtime.i'\" else echo shar: Extracting \"'nixtime.i'\" \(3434 characters\) sed "s/^X//" >'nixtime.i' <<'END_OF_FILE' X#ifndef LINT Xstatic char nixtimeid[]="@(#) nixtime.i 2.3 88/01/24 12:49:28"; X#endif /* LINT */ X X/* XTime handling routines for UNIX systems. These are included by the file Xmachine.c as needed. X XThe contents of this file are hereby released to the public domain. X X -- Rahul Dhesi 1986/12/31 X*/ X Xstruct tm *localtime(); X X/***************** XFunction gettime() gets the date and time of the file handle supplied. XDate and time is in MSDOS format. X*/ Xint gettime (file, date, time) XZOOFILE file; Xunsigned *date, *time; X{ X struct stat buf; /* buffer to hold file information */ X struct tm *tm; /* will hold year/month/day etc. */ X int handle; X handle = fileno(file); X if (fstat (handle, &buf) == -1) { X prterror ('w', "Could not get file time\n"); X *date = *time = 0; X } else { X tm = localtime (&buf.st_mtime); /* get info about file mod time */ X *date = tm->tm_mday + ((tm->tm_mon + 1) << 5) + X ((tm->tm_year - 80) << 9); X *time = tm->tm_sec / 2 + (tm->tm_min << 5) + X (tm->tm_hour << 11); X } X X} X X/***************** XFunction setutime() sets the date and time of the filename supplied. XDate and time is in MSDOS format. It assumes the existence of a function Xmstonix() that accepts MSDOS format time and returns **IX format time, Xand a function gettz() that returns the difference (localtime - gmt) Xin seconds, taking daylight savings time into account. X*/ Xint setutime(path,date,time) Xchar *path; Xunsigned int date, time; X{ X long mstonix(); X long gettz(); X long utimbuf[2]; X utimbuf[0] = utimbuf[1] = gettz() + mstonix (date, time); X return (utime (path, utimbuf)); X} X X/**************** XFunction mstonix() accepts an MSDOS format date and time and returns Xa **IX format time. No adjustment is done for timezone. X*/ X Xlong mstonix (date, time) Xunsigned int date, time; X{ X int year, month, day, hour, min, sec, daycount; X long longtime; X /* no. of days to beginning of month for each month */ X static int dsboy[12] = { 0, 31, 59, 90, 120, 151, 181, 212, X 243, 273, 304, 334}; X X if (date == 0 && time == 0) /* special case! */ X return (0L); X X /* part of following code is common to zoolist.c */ X year = (((unsigned int) date >> 9) & 0x7f) + 1980; X month = ((unsigned int) date >> 5) & 0x0f; X day = date & 0x1f; X X hour = ((unsigned int) time >> 11)& 0x1f; X min = ((unsigned int) time >> 5) & 0x3f; X sec = ((unsigned int) time & 0x1f) * 2; X X/* XDEBUG and leap year fixes thanks to Mark Alexander X<uunet!amdahl!drivax!alexande> X*/ X#ifdef DEBUG X printf ("mstonix: year=%d month=%d day=%d hour=%d min=%d sec=%d\n", X year, month, day, hour, min, sec); X#endif X X /* Calculate days since 1970/01/01 */ X daycount = 365 * (year - 1970) + /* days due to whole years */ X (year - 1969) / 4 + /* days due to leap years */ X dsboy[month-1] + /* days since beginning of this year */ X day-1; /* days since beginning of month */ X X if (year % 4 == 0 && X year % 400 != 0 && month >= 3) /* if this is a leap year and month */ X daycount++; /* is March or later, add a day */ X X /* Knowing the days, we can find seconds */ X longtime = daycount * 24L * 60L * 60L + X hour * 60L * 60L + min * 60 + sec; X return (longtime); X} END_OF_FILE if test 3434 -ne `wc -c <'nixtime.i'`; then echo shar: \"'nixtime.i'\" unpacked with wrong size! fi # end of 'nixtime.i' fi if test -f 'options.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'options.h'\" else echo shar: Extracting \"'options.h'\" \(5008 characters\) sed "s/^X//" >'options.h' <<'END_OF_FILE' X/* @(#) options.h 2.22 88/08/24 15:27:36 */ X X/* XThe contents of this file are hereby released to the public domain. X X -- Rahul Dhesi 1986/11/14 X XFor documentation about this file, see options.doc. X*/ X X X/* ZOO is always defined currently */ X#define ZOO X X/* Compilation without ZOOCOMMENT has not been tested */ X#define ZOOCOMMENT X X#ifdef SYS_V X#define FILTER X#define VER_DISPLAY ";" X#define VER_INPUT ":;" X#define IO_MACROS X#define EXISTS(f) (access(f, 00) == 0) X#define MEMSET X#define FNLIMIT 14 X#define CHEKDIR X#define NIXTIME X#define NIXFNAME X#define NEEDCTYP X#define NOENUM X#define PORTABLE X#define REN_LINK X#define SETBUF X#define GETTZ X#define FATTR X#endif X X#ifdef TURBOC X#define VER_DISPLAY ";" X#define VER_INPUT ":;" X#define USE_ASCII X#define SPECINIT X#define SPECEXIT X#define PURIFY X#define DISK_CH ':' X#define IGNORECASE X#define WILDCARD "*.*" X#define FOLD X#define FORCESLASH X#define FNLIMIT 12 X#define CUR_DIR "." X#define PATH_CH "/" X#define PATH_SEP ":/\\" X#define EXT_CH '.' X#define EXT_SEP ":/\\." X#define EXT_DFLT ".zoo" X#define SETMODE X/* 0x8000 and 0x4000 taken from <fcntl.h> for Turbo C */ X#define MODE_BIN(f) setmode(fileno(f), 0x8000) X#define MODE_TEXT(f) setmode(fileno(f), 0x4000) X#define LINT_ARGS X#define MORE ... X#define NOTHING void X#define VOIDPTR void * X#define REN_REV X#define UNBUF_IO X#define UNBUF_LIMIT 512 X#ifdef PORTABLE X#define SPECNEXT X#define NIXTIME X#undef WILDCARD X#endif X X#endif /* TURBOC */ X X#ifdef MSC X#define VER_DISPLAY ";" X#define VER_INPUT ":;" X#define ALWAYS_INT X#define USE_ASCII X#define SPECINIT X#define SPECEXIT X#define PURIFY X#define DISK_CH ':' X#define IGNORECASE X#define WILDCARD "*.*" X#define FOLD X#define FORCESLASH X#define FNLIMIT 12 X#define CUR_DIR "." X#define PATH_CH "/" X#define PATH_SEP ":/\\" X#define EXT_CH '.' X#define EXT_SEP ":/\\." X#define EXT_DFLT ".zoo" X#define SETMODE X/* 0x8000 and 0x4000 taken from <fcntl.h> for Microsoft C */ X#define MODE_BIN(f) setmode(fileno(f), 0x8000) X#define MODE_TEXT(f) setmode(fileno(f), 0x4000) X#define LINT_ARGS X#define MORE X#define NOTHING X#define VOIDPTR char * X#define REN_NORM X X#define UNBUF_IO X#define UNBUF_LIMIT 512 X X#ifdef PORTABLE X#define SPECNEXT X#define NIXTIME X#undef WILDCARD X#endif X X#endif /* MSC */ X X#ifdef BSD4_3 X#define NOSTRCHR /* not really needed for 4.3BSD */ X#define FILTER X#define VER_DISPLAY ";" X#define VER_INPUT ":;" X#define IO_MACROS X#define EXISTS(f) (access(f, 00) == 0) X#define FNLIMIT 1023 X#define CHEKDIR X#define NIXTIME X#define NIXFNAME X#define NEEDCTYP X#define PORTABLE X#define NOENUM X#define REN_REV X#define SETBUF X#define GETTZ X#define FATTR X#endif X X X X#ifdef VMS X X/* XSelect VMS pre-4.6 or 4.6 next line. Pre-4.6 library does not have Xrename() and memset() so zoo defines its own; 4.6 has these, so we Xmust use them, else VMS library functions will conflict with our Xown. X*/ X# if 1 /* VMS version 4.6 */ X# define VMS_RENAME /* this symbol used only in file vms.c */ X# define REN_REV X# define MEMSET X# else /* VMS pre-version 4.5 */ X# define REN_NORM X# endif X X#define VER_DISPLAY ";" X#define VER_INPUT ":;" X X#define IO_MACROS X#define SPEC_WILD X#define EXT_ANYWAY X#define VER_CH ';' X#define SPECEXIT X#define CHEKUDIR X#define FNLIMIT 78 X#define DIR_SEP '.' /* separates dir fields */ X#define DISK_CH ':' X#define DIR_LBRACK "[" /* left bracketing symbol dir dir name */ X#define PATH_CH "]" X#define PATH_SEP ":]" X#define EXT_CH '.' X#define EXT_SEP ":]." X#define EXT_DFLT ".zoo" X#define CUR_DIR "." X#define NIXTIME X#define NEEDCTYP X#define NOENUM X#define PORTABLE X#define DUMB_ASS X#define IGNORECASE X#define SPECMOD X#define SPECNEXT X#define WILDCARD "*.*" X#define FOLD X#endif X X#ifdef MCH_AMIGA X#define VER_DISPLAY ";" X#define VER_INPUT ":;" X#define PURIFY X#define DISK_CH ':' X#define SPECNEXT X#define WILDCARD "*" X#define IGNORECASE X#define FNLIMIT 30 X#define NEEDCTYP X#define CUR_DIR "." X#define PATH_CH "/" X#define PATH_SEP ":/" X#define EXT_CH '.' X#define EXT_SEP ":/." X#define EXT_DFLT ".zoo" X#define PORTABLE X#define NOSIGNAL X#define REN_REV X#define NOENUM X#define SETBUF X#define CHEKUDIR X#define GETUTIME X#define NIXTIME X#endif X X#ifdef NIXFNAME X#define CUR_DIR "." X#define PATH_CH "/" X#define PATH_SEP "/" X#define EXT_CH '.' X#define EXT_SEP "/." X#define EXT_DFLT ".zoo" X#endif X X#ifdef GENERIC X/* #define SPECNEXT */ X#define IGNORECASE X#define FNLIMIT 11 X#define NEEDCTYP X#define CUR_DIR "." X#define PATH_CH "/" X#define PATH_SEP ":/" X#define EXT_CH '.' X#define EXT_SEP ":/." X#define EXT_DFLT ".zoo" X#define PORTABLE X#define NOSIGNAL X/* REN_LINK is UNIX-specific. Can't find a generic rename() function */ X#define REN_LINK X/* #define FLAT */ X#define NOENUM X#define SETBUF X#define CHEKUDIR X#define GETUTIME X#define NIXTIME X#endif X X/* ANSI compatibility in declarations -- see zoofns.h for usage */ X#ifndef PARMS X#ifdef LINT_ARGS X#define PARMS(x) x X#else X#define PARMS(x) () X#endif X#endif X X/* Compensate for strchr/index differences */ X#ifdef NOSTRCHR X#define strchr index X#define strrchr rindex X#endif END_OF_FILE if test 5008 -ne `wc -c <'options.h'`; then echo shar: \"'options.h'\" unpacked with wrong size! fi # end of 'options.h' fi if test -f 'zoofns.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'zoofns.h'\" else echo shar: Extracting \"'zoofns.h'\" \(3138 characters\) sed "s/^X//" >'zoofns.h' <<'END_OF_FILE' X/* @(#) zoofns.h 2.5 88/01/16 19:03:13 */ X/* @(#) zoofns.h 2.7 88/01/27 19:39:18 */ X X/* XThe contents of this file are hereby released to the public domain. X X -- Rahul Dhesi 1986/11/14 X*/ X X/* Defines function declarations for all Zoo functions */ X X#ifndef PARMS X#ifdef LINT_ARGS X#define PARMS(x) x X#else X#define PARMS(x) () X#endif X#endif X X/* X:.,$s/(PARMS\(.*\));/PARMS\1;/ X*/ Xlong calc_ofs PARMS ((char *)); Xchar *addext PARMS ((char *, char *)); Xchar *combine PARMS ((char[], char *, char *)); Xchar *emalloc PARMS ((unsigned int)); Xchar *erealloc PARMS ((char *, unsigned int)); Xchar *findlast PARMS ((char *, char *)); Xchar *fixfname PARMS ((char *)); Xchar *getstdin PARMS ((NOTHING)); Xchar *lastptr PARMS ((char *)); Xchar *nameptr PARMS ((char *)); Xchar *newcat PARMS ((char *, char *)); Xchar *memset PARMS ((char *, int, unsigned)); Xchar *nextfile PARMS ((int, char *, int)); Xint cfactor PARMS ((long, long)); Xint chname PARMS ((char *, char *)); Xint cmpnum PARMS ((unsigned int, unsigned int, unsigned int, unsigned int)); Xint ctrl_c PARMS ((NOTHING)); Xint exists PARMS ((char *)); Xint getfile PARMS ((ZOOFILE, ZOOFILE, long, int)); Xint getutime PARMS ((char *, unsigned *, unsigned *)); Xint gettime PARMS ((ZOOFILE, unsigned *, unsigned *)); Xint handle_break PARMS ((NOTHING)); X X#ifdef USE_ASCII Xint isupper PARMS ((char)); Xint isdigit PARMS ((char)); X#endif /* USE_ASCII */ X Xint kill_files PARMS ((char *[], int)); X#ifdef UNBUF_IO Xint lzc PARMS ((int, int)); Xint lzd PARMS ((int, int)); X#else Xint lzc PARMS ((ZOOFILE, ZOOFILE)); Xint lzd PARMS ((ZOOFILE, ZOOFILE)); X#endif Xint match_half PARMS ((char *, char *)); Xint samefile PARMS ((char *, char *)); Xint settime PARMS ((ZOOFILE, unsigned, unsigned)); Xint setutime PARMS ((char *, unsigned, unsigned)); Xint strcmpi PARMS ((char *, char *)); X X#ifdef USE_ASCII Xint tolower PARMS ((char)); Xint toascii PARMS ((char)); X#endif /* USE_ASCII */ X Xint zooexit PARMS ((int)); Xlong inlist PARMS ((char *, unsigned int *, unsigned int *, unsigned *, X unsigned *, unsigned *, long *, int)); Xunsigned long space PARMS ((int, int *)); Xvoid addbfcrc PARMS ((char *, int)); Xvoid addfname PARMS ((char *, long, unsigned int, unsigned int, X unsigned, unsigned)); Xvoid add_version PARMS ((char *, struct direntry *)); Xvoid basename PARMS ((char *, char [])); Xvoid break_off PARMS ((NOTHING)); Xvoid close_file PARMS ((ZOOFILE)); Xvoid comment PARMS ((char *, char *)); Xvoid extension PARMS ((char *, char [])); Xvoid exit PARMS ((int)); Xvoid fixslash PARMS ((char *)); Xvoid makelist PARMS ((int, char *[], char *[], int, char *, char *, char *, int *)); Xvoid memerr PARMS ((NOTHING)); Xvoid prterror PARMS ((int, char *, MORE)); Xvoid rootname PARMS ((char *, char *)); Xvoid skip_files PARMS ((ZOOFILE, unsigned int *, unsigned int *, int *, X char [], long *)); Xvoid writenull PARMS ((ZOOFILE, int)); Xvoid zooadd PARMS ((char *, int, char **, char *)); Xvoid zoodel PARMS ((char *, char *, int)); Xvoid zoofilt PARMS ((char *)); Xvoid zooext PARMS ((char *, char *)); Xvoid zoolist PARMS ((char **, char *, int)); Xvoid zoopack PARMS ((char *, char *)); END_OF_FILE if test 3138 -ne `wc -c <'zoofns.h'`; then echo shar: \"'zoofns.h'\" unpacked with wrong size! fi # end of 'zoofns.h' fi echo shar: End of archive 2 \(of 10\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 10 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.