Annotation of coherent/d/usr/bin/pax/public/part01.sh, revision 1.1

1.1     ! root        1: # This is a shell archive.  Remove anything before this line, then unpack
        !             2: # it by saving it into a file and typing "sh file".  To overwrite existing
        !             3: # files, type "sh file -c".  You can also feed this as standard input via
        !             4: # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
        !             5: # will see the following message at the end:
        !             6: #              "End of archive 1 (of 6)."
        !             7: # Contents:  PATCHLEVEL README append.c config.h cpio.c limits.h mem.c
        !             8: #   pass.c pathname.c paxdir.h port.c port.h regexp.h tar.1 wildmat.c
        !             9: # Wrapped by mark@jhereg on Tue Dec 27 19:37:30 1988
        !            10: PATH=/bin:/usr/bin:/usr/ucb ; export PATH
        !            11: if test -f PATCHLEVEL -a "${1}" != "-c" ; then 
        !            12:   echo shar: Will not over-write existing file \"PATCHLEVEL\"
        !            13: else
        !            14: echo shar: Extracting \"PATCHLEVEL\" \(64 characters\)
        !            15: sed "s/^X//" >PATCHLEVEL <<'END_OF_PATCHLEVEL'
        !            16: XPatchlevel 0
        !            17: X$Id: PATCHLEVEL,v 1.1 88/12/23 18:02:43 mark Rel $
        !            18: END_OF_PATCHLEVEL
        !            19: if test 64 -ne `wc -c <PATCHLEVEL`; then
        !            20:     echo shar: \"PATCHLEVEL\" unpacked with wrong size!
        !            21: fi
        !            22: # end of overwriting check
        !            23: fi
        !            24: if test -f README -a "${1}" != "-c" ; then 
        !            25:   echo shar: Will not over-write existing file \"README\"
        !            26: else
        !            27: echo shar: Extracting \"README\" \(4822 characters\)
        !            28: sed "s/^X//" >README <<'END_OF_README'
        !            29: XPAX - Portable Archive Interchange
        !            30: X
        !            31: XCopyright (C) 1989 Mark H. Colburn
        !            32: XAll Rights Reserved.
        !            33: X
        !            34: X
        !            35: XIntroduction
        !            36: X
        !            37: X    This is version 1.1 of Pax, a public domain archiving utility.  
        !            38: X    
        !            39: X    Pax is an archiving utility that reads and writes tar and cpio formats, 
        !            40: X    both the traditional ones and the extended formats specified in IEEE 
        !            41: X    1003.1.  It handles multi-volume archives and automatically determines 
        !            42: X    the format of an archive while reading it.  Three user interfaces are 
        !            43: X    supported: tar, cpio, and pax.  The pax interface was designed by IEEE 
        !            44: X    1003.2 as a compromise in the chronic controversy over which of tar or 
        !            45: X    cpio is best.
        !            46: X
        !            47: X    The USENIX Association provided some support for this implementation 
        !            48: X    project.  As a result, the Pax utility is being distributed free of 
        !            49: X    charge and may be redistributed by others in either source or binary 
        !            50: X    form.  (See the liscensing section for restrictions)
        !            51: X
        !            52: X    The source for Pax is being posted to comp.sources.unix on USENET and 
        !            53: X    will also be available by anonymous FTP on the Internet from uunet.uu.net,
        !            54: X    moon.honeywell.com and from one of the Berkeley machines.  The source
        !            55: X    to Pax will be available via anonymous UUCP from jhereg.mn.org, the 
        !            56: X    author's home machine and possibly other sites.
        !            57: X
        !            58: X    The source for Pax will continue to change as long as the definition of 
        !            59: X    the utility is modified by the 1003.2 working group.  (For example, 
        !            60: X    there are a number of changes in Draft 8 which will be incorporated as 
        !            61: X    soon as Draft 8 is available).  Additional modifications will be made 
        !            62: X    based on user input, such as request for support of additional archive 
        !            63: X    formats, etc.  Patches and new releases will be made as new functionality 
        !            64: X    is added or problems are diagnosed and fixed.
        !            65: X
        !            66: X
        !            67: XInstallation
        !            68: X
        !            69: X    In order to install Pax, you must first edit the Makefile and the 
        !            70: X    config.h file according to the directions in each of the files.  
        !            71: X    These two files provide the configuration information for most 
        !            72: X    commonly available machines.  Please be sure to read through all 
        !            73: X    the directions in each of these files before attempting to compile
        !            74: X    Pax.
        !            75: X
        !            76: X
        !            77: XPortability
        !            78: X
        !            79: X    Pax is intended to run on as many systems as possible.  If you have
        !            80: X    problems getting Pax to compile or run on your system, please let me 
        !            81: X    know so that the source or the installation procedure can be modified.
        !            82: X
        !            83: X    Pax has been tested and appears to run correctly on the following 
        !            84: X    machines:
        !            85: X
        !            86: X        Machine                 Operating System/Release
        !            87: X      -------------------------------------------------------
        !            88: X      Altos 586               System III (2.3)
        !            89: X      AT&T UNIX PC            System V.2 (Release 3.51)
        !            90: X      Cray 2                  UNICOS
        !            91: X      HP 9000                 HP/UX 6.0.1
        !            92: X      Mac II                  A/UX 1.0
        !            93: X      NCR Tower               System V.2
        !            94: X      Pyramid                 AT&T and Berkeley universe
        !            95: X      Sequent Symetry         Dynix 3.0
        !            96: X      SGI Iris 4D/60G         UNIX 3.0
        !            97: X      SGI Iris 4D/70G         UNIX 3.0
        !            98: X      Sun 2                   SunOS 3.4
        !            99: X      Sun 2                   SunOS 3.5
        !           100: X      Sun 3                   SunOS 3.4
        !           101: X      Sun 3                   SunOS 3.5
        !           102: X      Sun 3                   SunOS 4.0
        !           103: X      Sun 4                   SunOS 4.0
        !           104: X      VAX 8750                BSD 4.3 (Mt. Xinu)
        !           105: X      VAX 8650                BSD 4.3 (Mt. Xinu)
        !           106: X      VAX 780                 BSD 4.3 (Berkeley)
        !           107: X      -------------------------------------------------------
        !           108: X
        !           109: X    In future releases, the source will be moving toward ANSI C and POSIX 
        !           110: X    compatibility.  This should allow for portability over any system 
        !           111: X    supporting both ANSI and POSIX.  In addition, POSIX/ANSI portability 
        !           112: X    library routines will be developed which will allow the code to run on 
        !           113: X    the standard machines available now.
        !           114: X
        !           115: X
        !           116: XCredit Where Credit is Due
        !           117: X
        !           118: X    Parts of the code which makes up Pax were gleaned from a number of 
        !           119: X    different sources: the directory access routines in paxdir.h are 
        !           120: X    modified copies of Doug Gwyn's dirent library; the regular expression 
        !           121: X    matching routines in regexp.c are from Henry Spencer, some of the tar 
        !           122: X    archive routines were initially written by John Gilmore for his PDTAR; 
        !           123: X    and finally afio, written by Mark Brukhartz at Lachman Associates, was 
        !           124: X    the basis for the buffering schemes used in pax.
        !           125: X
        !           126: X
        !           127: XLicensing
        !           128: X
        !           129: X    Copyright (c) 1989 Mark H. Colburn.  
        !           130: X    All rights reserved.
        !           131: X
        !           132: X    Redistribution and use in source and binary forms are permitted
        !           133: X    provided that the above copyright notice is duplicated in all such 
        !           134: X    forms and that any documentation, advertising materials, and other 
        !           135: X    materials related to such distribution and use acknowledge that the 
        !           136: X    software was developed by Mark H. Colburn and sponsored by The 
        !           137: X    USENIX Association. 
        !           138: X
        !           139: X    THE SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           140: X    IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           141: X    WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           142: X
        !           143: XPlease report any bug or problems to:
        !           144: X
        !           145: XMark Colburn
        !           146: XNAPS International
        !           147: X117 Mackubin St., Suite 1
        !           148: XSt. Paul MN   55102
        !           149: X(612) 224-9108
        !           150: [email protected]
        !           151: END_OF_README
        !           152: if test 4822 -ne `wc -c <README`; then
        !           153:     echo shar: \"README\" unpacked with wrong size!
        !           154: fi
        !           155: # end of overwriting check
        !           156: fi
        !           157: if test -f append.c -a "${1}" != "-c" ; then 
        !           158:   echo shar: Will not over-write existing file \"append.c\"
        !           159: else
        !           160: echo shar: Extracting \"append.c\" \(2298 characters\)
        !           161: sed "s/^X//" >append.c <<'END_OF_append.c'
        !           162: X/* $Source: /u/mark/src/pax/RCS/append.c,v $
        !           163: X *
        !           164: X * $Revision: 1.1 $
        !           165: X *
        !           166: X * append.c - append to a tape archive. 
        !           167: X *
        !           168: X * DESCRIPTION
        !           169: X *
        !           170: X *    Routines to allow appending of archives
        !           171: X *
        !           172: X * AUTHORS
        !           173: X *
        !           174: X *            Mark H. Colburn, NAPS International ([email protected])
        !           175: X *
        !           176: X *
        !           177: X * Sponsored by The USENIX Association for public distribution. 
        !           178: X *
        !           179: X * Copyright (c) 1989 Mark H. Colburn.
        !           180: X * All rights reserved.
        !           181: X *
        !           182: X * Redistribution and use in source and binary forms are permitted
        !           183: X * provided that the above copyright notice is duplicated in all such 
        !           184: X * forms and that any documentation, advertising materials, and other 
        !           185: X * materials related to such distribution and use acknowledge that the 
        !           186: X * software was developed * by Mark H. Colburn and sponsored by The 
        !           187: X * USENIX Association. 
        !           188: X *
        !           189: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           190: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           191: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           192: X *
        !           193: X * $Log:      append.c,v $
        !           194: X * Revision 1.1  88/12/23  18:02:00  mark
        !           195: X * Initial revision
        !           196: X * 
        !           197: X */
        !           198: X
        !           199: X#ifndef lint
        !           200: Xstatic char *ident = "$Id: append.c,v 1.1 88/12/23 18:02:00 mark Rel $";
        !           201: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !           202: X#endif /* ! lint */
        !           203: X
        !           204: X
        !           205: X/* Headers */
        !           206: X
        !           207: X#include "pax.h"
        !           208: X
        !           209: X
        !           210: X/* append_archive - main loop for appending to a tar archive
        !           211: X *
        !           212: X * DESCRIPTION
        !           213: X *
        !           214: X *    Append_archive reads an archive until the end of the archive is
        !           215: X *    reached once the archive is reached, the buffers are reset and the
        !           216: X *    create_archive function is called to handle the actual writing of
        !           217: X *    the appended archive data.  This is quite similar to the
        !           218: X *    read_archive function, however, it does not do all the processing.
        !           219: X */
        !           220: X
        !           221: X#ifdef __STDC__
        !           222: X
        !           223: Xvoid append_archive(void)
        !           224: X
        !           225: X#else
        !           226: X
        !           227: Xvoid append_archive()
        !           228: X
        !           229: X#endif
        !           230: X{
        !           231: X    Stat            sb;
        !           232: X    char            name[PATH_MAX + 1];
        !           233: X
        !           234: X    name[0] = '\0';
        !           235: X    while (get_header(name, &sb) == 0) {
        !           236: X      if (((ar_format == TAR)
        !           237: X           ? buf_skip(ROUNDUP((OFFSET) sb.sb_size, BLOCKSIZE))
        !           238: X           : buf_skip((OFFSET) sb.sb_size)) < 0) {
        !           239: X          warn(name, "File data is corrupt");
        !           240: X      }
        !           241: X    }
        !           242: X    /* we have now gotten to the end of the archive... */
        !           243: X
        !           244: X    /* reset the buffer now that we have read the entire archive */
        !           245: X    bufend = bufidx = bufstart;
        !           246: X    create_archive();
        !           247: X}
        !           248: END_OF_append.c
        !           249: if test 2298 -ne `wc -c <append.c`; then
        !           250:     echo shar: \"append.c\" unpacked with wrong size!
        !           251: fi
        !           252: # end of overwriting check
        !           253: fi
        !           254: if test -f config.h -a "${1}" != "-c" ; then 
        !           255:   echo shar: Will not over-write existing file \"config.h\"
        !           256: else
        !           257: echo shar: Extracting \"config.h\" \(4505 characters\)
        !           258: sed "s/^X//" >config.h <<'END_OF_config.h'
        !           259: X/* $Source: /u/mark/src/pax/RCS/config.h,v $
        !           260: X *
        !           261: X * $Revision: 1.1 $
        !           262: X *
        !           263: X * config.h - configuration options for PAX
        !           264: X *
        !           265: X * DESCRIPTION
        !           266: X *
        !           267: X *    This file contains a number of configurable parameters for the
        !           268: X *    PAX software.  This files should be edited prior to makeing the
        !           269: X *    package.
        !           270: X *
        !           271: X * AUTHOR
        !           272: X *
        !           273: X *    Mark H. Colburn, NAPS International ([email protected])
        !           274: X *
        !           275: X * Sponsored by The USENIX Association for public distribution. 
        !           276: X *
        !           277: X * Copyright (c) 1989 Mark H. Colburn.
        !           278: X * All rights reserved.
        !           279: X *
        !           280: X * Redistribution and use in source and binary forms are permitted
        !           281: X * provided that the above copyright notice and this paragraph are
        !           282: X * duplicated in all such forms and that any documentation,
        !           283: X * advertising materials, and other materials related to such
        !           284: X * distribution and use acknowledge that the software was developed
        !           285: X * by Mark H. Colburn and sponsored by The USENIX Association. 
        !           286: X *
        !           287: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           288: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           289: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           290: X */
        !           291: X
        !           292: X#ifndef _PAX_CONFIG_H
        !           293: X#define _PAX_CONFIG_H
        !           294: X
        !           295: X/* Defines */
        !           296: X
        !           297: X/*
        !           298: X * USG - USG (Unix System V) specific modifications
        !           299: X *
        !           300: X * Define USG if you are running Unix System V or some similar variant
        !           301: X */
        !           302: X#define USG   /* Running on a USG System */
        !           303: X
        !           304: X/*
        !           305: X * BSD - BSD (Berkely) specific modifications
        !           306: X *
        !           307: X * Define BSD if you are running some version of BSD Unix
        !           308: X */
        !           309: X#define BSD   /* Running on a BSD System */
        !           310: X
        !           311: X/*
        !           312: X * DEF_AR_FILE - tar only (required)
        !           313: X *
        !           314: X * DEF_AR_FILE should contain the full pathname of your favorite archive
        !           315: X * device.  Normally this would be a tape drive, but it may be a disk drive
        !           316: X * on those systems that don't have tape drives.
        !           317: X */
        !           318: X#define DEF_AR_FILE   "-"     /* The default archive on your system */
        !           319: X
        !           320: X/*
        !           321: X * TTY - device which interactive queries should be directed to (required)
        !           322: X *
        !           323: X * This is the device to which interactive queries will be sent to and
        !           324: X * received from.  On most unix systems, this should be /dev/tty, however, on
        !           325: X * some systems, such as MS-DOS, it my need to be different (e.g. "con:").
        !           326: X */
        !           327: X#define       TTY     "/dev/tty"      /* for most versions of UNIX */
        !           328: X/* #define    TTY     "con:"          /* For MS-DOS */
        !           329: X
        !           330: X/*
        !           331: X * PAXDIR - if you do not have directory access routines
        !           332: X *
        !           333: X * Define PAXDIR if you do not have Doug Gwyn's dirent package installed
        !           334: X * as a system library or you wish to use the version supplied with PAX.  
        !           335: X *
        !           336: X * NOTE: DO NOT DEFINE THIS IF YOU HAVE BERKELEY DIRECTORY ACCESS ROUTINES.
        !           337: X */
        !           338: X/* #define PAXDIR             /* use paxdir.h paxdir.c */
        !           339: X
        !           340: X/*
        !           341: X * DIRENT - directory access routines (required)
        !           342: X *
        !           343: X * If you have Doug Gwyn's dirent package installed, either as a system
        !           344: X * library, or are using the paxdir.c and paxdir.h routines which come with 
        !           345: X * PAX, then define dirent. 
        !           346: X *
        !           347: X * NOTE: DO NOT DEFINE THIS IF YOU HAVE BERKELEY DIRECTORY ACCESS ROUTINES.
        !           348: X */
        !           349: X/* #define DIRENT             /* use POSIX compatible directory routines */
        !           350: X
        !           351: X/*
        !           352: X * OFFSET - compiler dependent offset type
        !           353: X * 
        !           354: X * OFFSET is the type which is returned by lseek().  It is different on
        !           355: X * some systems.  Most define it to be off_t, but some define it to be long.
        !           356: X */
        !           357: X#define OFFSET        off_t   /* for most BSD, USG and other systems */
        !           358: X/* #define OFFSET     long    /* for most of the rest of them... */
        !           359: X
        !           360: X/*
        !           361: X * VOID - compiler support for VOID types
        !           362: X *
        !           363: X * If your system does not support void, then this should be defined to
        !           364: X * int, otherwise, it should be left undefined.
        !           365: X *
        !           366: X * For ANSI Systems this should always be blank.
        !           367: X */
        !           368: X#ifndef __STDC__
        !           369: X/* #define void       int     /* for system which do support void */
        !           370: X#endif
        !           371: X
        !           372: X/*
        !           373: X * SIG_T - return type for the signal routine
        !           374: X *
        !           375: X * Some systems have signal defines to return an int *, other return a
        !           376: X * void *.  Please choose the correct value for your system.
        !           377: X */
        !           378: X/* #define SIG_T      void    /* signal defined as "void (*signal)()" */
        !           379: X#define SIG_T int     /* signal defined as "int (*signal)()" */
        !           380: X
        !           381: X/*
        !           382: X * STRCSPN - use the strcspn function included with pax
        !           383: X *
        !           384: X * Some systems do not have the strcspn() function in their C libraries.
        !           385: X * For those system define STRCSPN and the one provided in regexp.c will 
        !           386: X * be used.
        !           387: X */
        !           388: X/* #define STRCSPN    /* implementation does not have strcspn() */
        !           389: X
        !           390: X/*
        !           391: X * END OF CONFIGURATION SECTION
        !           392: X *
        !           393: X * Nothing beyond this point should need to be changed
        !           394: X */
        !           395: X
        !           396: X#ifdef BSD
        !           397: X#ifdef USG
        !           398: X#include "You must first edit config.h and Makefile to configure pax."
        !           399: X#endif
        !           400: X#endif
        !           401: X/*
        !           402: X * Do a little sanity checking
        !           403: X */
        !           404: X#ifdef PAXDIR
        !           405: X#  ifndef DIRENT
        !           406: X#    define DIRENT
        !           407: X#  endif
        !           408: X#endif
        !           409: X
        !           410: X#endif /* _PAX_CONFIG_H */
        !           411: END_OF_config.h
        !           412: if test 4505 -ne `wc -c <config.h`; then
        !           413:     echo shar: \"config.h\" unpacked with wrong size!
        !           414: fi
        !           415: # end of overwriting check
        !           416: fi
        !           417: if test -f cpio.c -a "${1}" != "-c" ; then 
        !           418:   echo shar: Will not over-write existing file \"cpio.c\"
        !           419: else
        !           420: echo shar: Extracting \"cpio.c\" \(4492 characters\)
        !           421: sed "s/^X//" >cpio.c <<'END_OF_cpio.c'
        !           422: X/* $Source: /u/mark/src/pax/RCS/cpio.c,v $
        !           423: X *
        !           424: X * $Revision: 1.1 $
        !           425: X *
        !           426: X * cpio.c - Cpio specific functions for archive handling
        !           427: X *
        !           428: X * DESCRIPTION
        !           429: X *
        !           430: X *    These function provide a cpio conformant interface to the pax
        !           431: X *    program.
        !           432: X *
        !           433: X * AUTHOR
        !           434: X *
        !           435: X *     Mark H. Colburn, NAPS International ([email protected])
        !           436: X *
        !           437: X * Sponsored by The USENIX Association for public distribution. 
        !           438: X *
        !           439: X * Copyright (c) 1989 Mark H. Colburn.
        !           440: X * All rights reserved.
        !           441: X *
        !           442: X * Redistribution and use in source and binary forms are permitted
        !           443: X * provided that the above copyright notice is duplicated in all such 
        !           444: X * forms and that any documentation, advertising materials, and other 
        !           445: X * materials related to such distribution and use acknowledge that the 
        !           446: X * software was developed * by Mark H. Colburn and sponsored by The 
        !           447: X * USENIX Association. 
        !           448: X *
        !           449: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           450: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           451: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           452: X *
        !           453: X * $Log:      cpio.c,v $
        !           454: X * Revision 1.1  88/12/23  18:02:05  mark
        !           455: X * Initial revision
        !           456: X * 
        !           457: X */
        !           458: X
        !           459: X#ifndef lint
        !           460: Xstatic char *ident = "$Id: cpio.c,v 1.1 88/12/23 18:02:05 mark Rel $";
        !           461: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !           462: X#endif /* ! lint */
        !           463: X
        !           464: X
        !           465: X/* Headers */
        !           466: X
        !           467: X#include "pax.h"
        !           468: X
        !           469: X
        !           470: X/* Function Prototypes */
        !           471: X
        !           472: X#ifdef __STDC__
        !           473: Xstatic void   usage(void);
        !           474: X#else /* !__STDC__ */
        !           475: Xstatic void   usage();
        !           476: X#endif /* __STDC__ */
        !           477: X
        !           478: X
        !           479: X/* do_cpio - handle cpio format archives
        !           480: X *
        !           481: X * DESCRIPTION
        !           482: X *
        !           483: X *    Do_cpio provides a standard CPIO interface to the PAX program.  All
        !           484: X *    of the standard cpio flags are available, and the behavior of the
        !           485: X *    program mimics traditonal cpio.
        !           486: X *
        !           487: X * PARAMETERS
        !           488: X *
        !           489: X *    int     argc    - command line argument count
        !           490: X *    char    **argv  - pointer to command line arguments
        !           491: X *
        !           492: X * RETURNS
        !           493: X *
        !           494: X *    Nothing.
        !           495: X */
        !           496: X
        !           497: X#ifdef __STDC__
        !           498: X
        !           499: Xint do_cpio(int argc, char **argv)
        !           500: X
        !           501: X#else
        !           502: X
        !           503: Xint do_cpio(argc, argv)
        !           504: Xint             argc;
        !           505: Xchar          **argv;
        !           506: X
        !           507: X#endif
        !           508: X{
        !           509: X    int             c;
        !           510: X    char           *dirname;
        !           511: X    Stat            st;
        !           512: X
        !           513: X    /* default input/output file for CPIO is STDIN/STDOUT */
        !           514: X    ar_file = "-";
        !           515: X    names_from_stdin = 1;
        !           516: X
        !           517: X    /* set up the flags to reflect the default CPIO inteface. */
        !           518: X    blocksize = BLOCKSIZE;
        !           519: X    ar_interface = CPIO;
        !           520: X    ar_format = CPIO;
        !           521: X    msgfile=stderr;
        !           522: X
        !           523: X    while ((c = getopt(argc, argv, "D:Bacdfilmoprtuv")) != EOF) {
        !           524: X      switch (c) {
        !           525: X      case 'i':
        !           526: X          f_extract = 1;
        !           527: X          break;
        !           528: X      case 'o':
        !           529: X          f_create = 1;
        !           530: X          break;
        !           531: X      case 'p':
        !           532: X          f_pass = 1;
        !           533: X          dirname = argv[--argc];
        !           534: X
        !           535: X          /* check to make sure that the argument is a directory */
        !           536: X          if (LSTAT(dirname, &st) < 0) {
        !           537: X              fatal(syserr());
        !           538: X          }
        !           539: X          if ((st.sb_mode & S_IFMT) != S_IFDIR) {
        !           540: X              fatal("Not a directory");
        !           541: X          }
        !           542: X          break;
        !           543: X      case 'B':
        !           544: X          blocksize = BLOCK;
        !           545: X          break;
        !           546: X      case 'a':
        !           547: X          f_access_time = 1;
        !           548: X          break;
        !           549: X      case 'c':
        !           550: X          break;
        !           551: X      case 'D':
        !           552: X          ar_file = optarg;
        !           553: X          break;
        !           554: X      case 'd':
        !           555: X          f_create_dirs = 1;
        !           556: X          break;
        !           557: X      case 'f':
        !           558: X          f_reverse_match = 1;
        !           559: X          break;
        !           560: X      case 'l':
        !           561: X          f_link = 1;
        !           562: X          break;
        !           563: X      case 'm':
        !           564: X          f_modification_time = 1;
        !           565: X          break;
        !           566: X      case 'r':
        !           567: X          f_interactive = 1;
        !           568: X          break;
        !           569: X      case 't':
        !           570: X          f_list = 1;
        !           571: X          break;
        !           572: X      case 'u':
        !           573: X          f_unconditional = 1;
        !           574: X          break;
        !           575: X      case 'v':
        !           576: X          f_verbose = 1;
        !           577: X          break;
        !           578: X      default:
        !           579: X          usage();
        !           580: X      }
        !           581: X    }
        !           582: X
        !           583: X    if (f_create + f_pass + f_extract != 1) {
        !           584: X      usage();
        !           585: X    }
        !           586: X    if (!f_pass) {
        !           587: X      buf_allocate((OFFSET) blocksize);
        !           588: X    }
        !           589: X    if (f_extract) {
        !           590: X      open_archive(AR_READ);  /* Open for reading */
        !           591: X      read_archive();
        !           592: X    } else if (f_create) {
        !           593: X      open_archive(AR_WRITE);
        !           594: X      create_archive();
        !           595: X    } else if (f_pass) {
        !           596: X      pass(dirname);
        !           597: X    }
        !           598: X
        !           599: X    /* print out the total block count transfered */
        !           600: X    fprintf(stderr, "%d Blocks\n", ROUNDUP(total, BLOCKSIZE) / BLOCKSIZE);
        !           601: X    
        !           602: X    exit(0);
        !           603: X    /* NOTREACHED */
        !           604: X}
        !           605: X
        !           606: X
        !           607: X/* usage - print a helpful message and exit
        !           608: X *
        !           609: X * DESCRIPTION
        !           610: X *
        !           611: X *    Usage prints out the usage message for the CPIO interface and then
        !           612: X *    exits with a non-zero termination status.  This is used when a user
        !           613: X *    has provided non-existant or incompatible command line arguments.
        !           614: X *
        !           615: X * RETURNS
        !           616: X *
        !           617: X *    Returns an exit status of 1 to the parent process.
        !           618: X *
        !           619: X */
        !           620: X
        !           621: X#ifdef __STDC__
        !           622: X
        !           623: Xstatic void usage(void)
        !           624: X
        !           625: X#else
        !           626: X
        !           627: Xstatic void usage()
        !           628: X
        !           629: X#endif
        !           630: X{
        !           631: X    fprintf(stderr, "\
        !           632: XUsage: %s -o[Bacv]\n", myname);
        !           633: X    fprintf(stderr, "\
        !           634: X       %s -i[Bcdmrtuvf] [pattern...]\n", myname);
        !           635: X    fprintf(stderr, "\
        !           636: X       %s -p[adlmruv] directory\n", myname);
        !           637: X    exit(1);
        !           638: X}
        !           639: END_OF_cpio.c
        !           640: if test 4492 -ne `wc -c <cpio.c`; then
        !           641:     echo shar: \"cpio.c\" unpacked with wrong size!
        !           642: fi
        !           643: # end of overwriting check
        !           644: fi
        !           645: if test -f limits.h -a "${1}" != "-c" ; then 
        !           646:   echo shar: Will not over-write existing file \"limits.h\"
        !           647: else
        !           648: echo shar: Extracting \"limits.h\" \(2765 characters\)
        !           649: sed "s/^X//" >limits.h <<'END_OF_limits.h'
        !           650: X/* $Source: /u/mark/src/pax/RCS/limits.h,v $
        !           651: X *
        !           652: X * $Revision: 1.1 $
        !           653: X *
        !           654: X *    limits.h - POSIX compatible defnitions for some of <limits.h>
        !           655: X *
        !           656: X * DESCRIPTION
        !           657: X *
        !           658: X *    We need to include <limits.h> if this system is being compiled with an 
        !           659: X *    ANSI standard C compiler, or if we are running on a POSIX confomrming 
        !           660: X *    system.  If the manifest constant _POSIX_SOURCE is not defined when 
        !           661: X *    <limits.h> is included, then none of the POSIX constants are defined 
        !           662: X *    and we need to define them here.  It's a bit wierd, but it works.
        !           663: X *
        !           664: X *    These values where taken from the IEEE P1003.1 standard, draft 12.
        !           665: X *    All of the values below are the MINIMUM values allowed by the standard.
        !           666: X *    Not all values are used by the PAX program, but they are included for
        !           667: X *    completeness, and for support of future enhancements.  Please see
        !           668: X *    section 2.9 of the draft standard for more information on the following
        !           669: X *    constants.
        !           670: X *
        !           671: X * AUTHOR
        !           672: X *
        !           673: X *     Mark H. Colburn, NAPS International ([email protected])
        !           674: X *
        !           675: X * Sponsored by The USENIX Association for public distribution. 
        !           676: X *
        !           677: X * Copyright (c) 1989 Mark H. Colburn.
        !           678: X * All rights reserved.
        !           679: X *
        !           680: X * Redistribution and use in source and binary forms are permitted
        !           681: X * provided that the above copyright notice and this paragraph are
        !           682: X * duplicated in all such forms and that any documentation,
        !           683: X * advertising materials, and other materials related to such
        !           684: X * distribution and use acknowledge that the software was developed
        !           685: X * by Mark H. Colburn and sponsored by The USENIX Association. 
        !           686: X *
        !           687: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           688: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           689: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           690: X */
        !           691: X
        !           692: X#ifndef _PAX_LIMITS_H
        !           693: X#define _PAX_LIMITS_H
        !           694: X
        !           695: X/* Headers */
        !           696: X
        !           697: X#if defined(__STDC__) || defined(_POSIX_SOURCE)
        !           698: X#   include <limits.h>
        !           699: X#endif
        !           700: X
        !           701: X
        !           702: X/* Defines */
        !           703: X
        !           704: X#ifndef _POSIX_SOURCE
        !           705: X
        !           706: X#define MAX_INPUT     256     /* Max numbef of bytes in terminal input */
        !           707: X#define NGROUPS_MAX   1       /* Max number of suplemental group id's */
        !           708: X#define PASS_MAX      8       /* Max number of bytes in a password */
        !           709: X#define PID_MAX               30000   /* Max value for a process ID */
        !           710: X#define UID_MAX               32000   /* Max value for a user or group ID */
        !           711: X#define ARG_MAX               4096    /* Nax number of bytes passed to exec */
        !           712: X#define CHILD_MAX     6       /* Max number of simultaneous processes */
        !           713: X#define MAX_CANON     256     /* Max numbef of bytes in a cononical queue */
        !           714: X#define OPEN_MAX      16      /* Nax number of open files per process */
        !           715: X#define NAME_MAX      14      /* Max number of bytes in a file name */
        !           716: X#define PATH_MAX      255     /* Max number of bytes in pathname */
        !           717: X#define LINK_MAX      8       /* Max value of a file's link count */
        !           718: X#define PIPE_BUF      512     /* Max number of bytes for pipe reads */
        !           719: X
        !           720: X#endif /* _POSIX_SOURCE */
        !           721: X#endif /* _PAX_LIMITS_H */
        !           722: END_OF_limits.h
        !           723: if test 2765 -ne `wc -c <limits.h`; then
        !           724:     echo shar: \"limits.h\" unpacked with wrong size!
        !           725: fi
        !           726: # end of overwriting check
        !           727: fi
        !           728: if test -f mem.c -a "${1}" != "-c" ; then 
        !           729:   echo shar: Will not over-write existing file \"mem.c\"
        !           730: else
        !           731: echo shar: Extracting \"mem.c\" \(3204 characters\)
        !           732: sed "s/^X//" >mem.c <<'END_OF_mem.c'
        !           733: X/* $Source: /u/mark/src/pax/RCS/mem.c,v $
        !           734: X *
        !           735: X * $Revision: 1.1 $
        !           736: X *
        !           737: X * mem.c - memory allocation and manipulation functions
        !           738: X *
        !           739: X * DESCRIPTION
        !           740: X *
        !           741: X *    These routines are provided for higher level handling of the UNIX
        !           742: X *    memory allocation functions.
        !           743: X *
        !           744: X * AUTHOR
        !           745: X *
        !           746: X *     Mark H. Colburn, NAPS International ([email protected])
        !           747: X *
        !           748: X *
        !           749: X * Sponsored by The USENIX Association for public distribution. 
        !           750: X *
        !           751: X * Copyright (c) 1989 Mark H. Colburn.
        !           752: X * All rights reserved.
        !           753: X *
        !           754: X * Redistribution and use in source and binary forms are permitted
        !           755: X * provided that the above copyright notice is duplicated in all such 
        !           756: X * forms and that any documentation, advertising materials, and other 
        !           757: X * materials related to such distribution and use acknowledge that the 
        !           758: X * software was developed * by Mark H. Colburn and sponsored by The 
        !           759: X * USENIX Association. 
        !           760: X *
        !           761: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           762: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           763: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           764: X *
        !           765: X * $Log:      mem.c,v $
        !           766: X * Revision 1.1  88/12/23  18:02:17  mark
        !           767: X * Initial revision
        !           768: X * 
        !           769: X */
        !           770: X
        !           771: X#ifndef lint
        !           772: Xstatic char *ident = "$Id: mem.c,v 1.1 88/12/23 18:02:17 mark Rel $";
        !           773: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !           774: X#endif /* ! lint */
        !           775: X
        !           776: X
        !           777: X/* Headers */
        !           778: X
        !           779: X#include "pax.h"
        !           780: X
        !           781: X
        !           782: X/* mem_get - allocate memory
        !           783: X *
        !           784: X * DESCRIPTION
        !           785: X *
        !           786: X *    Mem_get attempts to allocate a block of memory using the malloc
        !           787: X *    function call.  In the event that the memory is not available, 
        !           788: X *    mem_get will display an "Out of memory" message for the user
        !           789: X *    the first time it encounters the an out of memory situation.
        !           790: X *    Subsequent calls to mem_get may fail, but no message will be
        !           791: X *    printed.
        !           792: X *
        !           793: X * PARAMETERS
        !           794: X *
        !           795: X *    uint len        - The amount of memory to allocate
        !           796: X *
        !           797: X * RETURNS
        !           798: X *
        !           799: X *    Normally returns the pointer to the newly allocated memory.  If
        !           800: X *    an error occurss, NULL is returned, and an error message is
        !           801: X *    printed.
        !           802: X *
        !           803: X * ERRORS
        !           804: X *
        !           805: X *    ENOMEM  No memory is available 
        !           806: X */
        !           807: X
        !           808: X#ifdef __STDC__
        !           809: X
        !           810: Xchar *mem_get(uint len)
        !           811: X
        !           812: X#else
        !           813: X
        !           814: Xchar *mem_get(len)
        !           815: Xuint            len;          /* amount of memory to get */
        !           816: X
        !           817: X#endif
        !           818: X{
        !           819: X    char           *mem;
        !           820: X    static short    outofmem = 0;
        !           821: X
        !           822: X    if ((mem = (char *)malloc(len)) == NULL && !outofmem) {
        !           823: X      outofmem++;
        !           824: X      warn("mem_get()", "Out of memory");
        !           825: X    }
        !           826: X    return (mem);
        !           827: X}
        !           828: X
        !           829: X
        !           830: X/* mem_str - duplicate a string into dynamic memory
        !           831: X *
        !           832: X * DESCRIPTION
        !           833: X *
        !           834: X *    Mem_str attempts to make a copy of string.  It allocates space for
        !           835: X *    the string, and if the allocation was successfull, copies the old
        !           836: X *    string into the newly allocated space.
        !           837: X *
        !           838: X * PARAMETERS
        !           839: X *
        !           840: X *    char *str       - string to make a copy of 
        !           841: X *
        !           842: X * RETURNS
        !           843: X *
        !           844: X *    Normally returns a pointer to a new string at least as large
        !           845: X *    as strlen(str) + 1, which contains a copy of the the data 
        !           846: X *    passed in str, plus a null terminator.  Returns (char *)NULL 
        !           847: X *    if enough memory to make a copy of str is not available.
        !           848: X */
        !           849: X
        !           850: X#ifdef __STDC__
        !           851: X
        !           852: Xchar *mem_str(char *str)
        !           853: X
        !           854: X#else
        !           855: X
        !           856: Xchar *mem_str(str)
        !           857: Xchar           *str;          /* string to make a copy of */
        !           858: X
        !           859: X#endif
        !           860: X{
        !           861: X    char           *mem;
        !           862: X
        !           863: X    if (mem = mem_get((uint) strlen(str) + 1)) {
        !           864: X      strcpy(mem, str);
        !           865: X    }
        !           866: X    return (mem);
        !           867: X}
        !           868: END_OF_mem.c
        !           869: if test 3204 -ne `wc -c <mem.c`; then
        !           870:     echo shar: \"mem.c\" unpacked with wrong size!
        !           871: fi
        !           872: # end of overwriting check
        !           873: fi
        !           874: if test -f pass.c -a "${1}" != "-c" ; then 
        !           875:   echo shar: Will not over-write existing file \"pass.c\"
        !           876: else
        !           877: echo shar: Extracting \"pass.c\" \(3492 characters\)
        !           878: sed "s/^X//" >pass.c <<'END_OF_pass.c'
        !           879: X/* $Source: /u/mark/src/pax/RCS/pass.c,v $
        !           880: X *
        !           881: X * $Revision: 1.1 $
        !           882: X *
        !           883: X * pass.c - handle the pass option of cpio
        !           884: X *
        !           885: X * DESCRIPTION
        !           886: X *
        !           887: X *    These functions implement the pass options in PAX.  The pass option
        !           888: X *    copies files from one directory hierarchy to another.
        !           889: X * 
        !           890: X * AUTHOR
        !           891: X *
        !           892: X *    Mark H. Colburn, NAPS International ([email protected])
        !           893: X *
        !           894: X * Sponsored by The USENIX Association for public distribution. 
        !           895: X *
        !           896: X * Copyright (c) 1989 Mark H. Colburn.
        !           897: X * All rights reserved.
        !           898: X *
        !           899: X * Redistribution and use in source and binary forms are permitted
        !           900: X * provided that the above copyright notice is duplicated in all such 
        !           901: X * forms and that any documentation, advertising materials, and other 
        !           902: X * materials related to such distribution and use acknowledge that the 
        !           903: X * software was developed * by Mark H. Colburn and sponsored by The 
        !           904: X * USENIX Association. 
        !           905: X *
        !           906: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !           907: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !           908: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !           909: X *
        !           910: X * $Log:      pass.c,v $
        !           911: X * Revision 1.1  88/12/23  18:02:20  mark
        !           912: X * Initial revision
        !           913: X * 
        !           914: X */
        !           915: X
        !           916: X#ifndef lint
        !           917: Xstatic char *ident = "$Id: pass.c,v 1.1 88/12/23 18:02:20 mark Rel $";
        !           918: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !           919: X#endif /* ! lint */
        !           920: X
        !           921: X
        !           922: X/* Headers */
        !           923: X
        !           924: X#include "pax.h"
        !           925: X
        !           926: X
        !           927: X/* pass - copy within the filesystem
        !           928: X *
        !           929: X * DESCRIPTION
        !           930: X *
        !           931: X *    Pass copies the named files from the current directory hierarchy to
        !           932: X *    the directory pointed to by dirname.
        !           933: X *
        !           934: X * PARAMETERS
        !           935: X *
        !           936: X *    char    *dirname        - name of directory to copy named files to.
        !           937: X *
        !           938: X */
        !           939: X
        !           940: X#ifdef __STDC__
        !           941: X    
        !           942: Xint pass(char *dirname)
        !           943: X
        !           944: X#else
        !           945: X    
        !           946: Xint pass(dirname)
        !           947: Xchar  *dirname;
        !           948: X
        !           949: X#endif
        !           950: X{
        !           951: X    char            name[PATH_MAX + 1];
        !           952: X    int             fd;
        !           953: X    Stat            sb;
        !           954: X
        !           955: X    while (name_next(name, &sb) >= 0 && (fd = openi(name, &sb)) >= 0) {
        !           956: X
        !           957: X      if (rplhead != NULL) {
        !           958: X          rpl_name(name);
        !           959: X      }
        !           960: X      if (get_disposition("pass", name) || get_newname(name, sizeof(name))) {
        !           961: X          /* skip file... */
        !           962: X          if (fd) {
        !           963: X              close(fd);
        !           964: X          }
        !           965: X          continue;
        !           966: X      } 
        !           967: X
        !           968: X      if (passitem(name, &sb, fd, dirname)) {
        !           969: X          close(fd);
        !           970: X      }
        !           971: X      if (f_verbose) {
        !           972: X          fprintf(stderr, "%s/%s\n", dirname, name);
        !           973: X      }
        !           974: X    }
        !           975: X}
        !           976: X
        !           977: X
        !           978: X/* passitem - copy one file
        !           979: X *
        !           980: X * DESCRIPTION
        !           981: X *
        !           982: X *    Passitem copies a specific file to the named directory
        !           983: X *
        !           984: X * PARAMETERS
        !           985: X *
        !           986: X *    char   *from    - the name of the file to open
        !           987: X *    Stat   *asb     - the stat block associated with the file to copy
        !           988: X *    int     ifd     - the input file descriptor for the file to copy
        !           989: X *    char   *dir     - the directory to copy it to
        !           990: X *
        !           991: X * RETURNS
        !           992: X *
        !           993: X *    Returns given input file descriptor or -1 if an error occurs.
        !           994: X *
        !           995: X * ERRORS
        !           996: X */
        !           997: X
        !           998: X#ifdef __STDC__
        !           999: X
        !          1000: Xint passitem(char *from, Stat *asb, int ifd, char *dir)
        !          1001: X
        !          1002: X#else
        !          1003: X    
        !          1004: Xint passitem(from, asb, ifd, dir)
        !          1005: Xchar           *from;
        !          1006: XStat           *asb;
        !          1007: Xint             ifd;
        !          1008: Xchar           *dir;
        !          1009: X
        !          1010: X#endif
        !          1011: X{
        !          1012: X    int             ofd;
        !          1013: X    time_t          tstamp[2];
        !          1014: X    char            to[PATH_MAX + 1];
        !          1015: X
        !          1016: X    if (nameopt(strcat(strcat(strcpy(to, dir), "/"), from)) < 0) {
        !          1017: X      return (-1);
        !          1018: X    }
        !          1019: X    if (asb->sb_nlink > 1) {
        !          1020: X      if (f_link && islink(from, asb) == (Link *) NULL) {
        !          1021: X          linkto(from, asb);
        !          1022: X      }
        !          1023: X      linkto(to, asb);
        !          1024: X    }
        !          1025: X    if ((ofd = openo(to, asb, islink(to, asb), 1)) < 0) {
        !          1026: X      return (-1);
        !          1027: X    }
        !          1028: X    if (ofd > 0) {
        !          1029: X      passdata(from, ifd, to, ofd);
        !          1030: X    }
        !          1031: X    tstamp[0] = asb->sb_atime;
        !          1032: X    tstamp[1] = f_modification_time ? asb->sb_mtime : time((time_t *) 0);
        !          1033: X    utime(to, tstamp);
        !          1034: X    return (ifd);
        !          1035: X}
        !          1036: END_OF_pass.c
        !          1037: if test 3492 -ne `wc -c <pass.c`; then
        !          1038:     echo shar: \"pass.c\" unpacked with wrong size!
        !          1039: fi
        !          1040: # end of overwriting check
        !          1041: fi
        !          1042: if test -f pathname.c -a "${1}" != "-c" ; then 
        !          1043:   echo shar: Will not over-write existing file \"pathname.c\"
        !          1044: else
        !          1045: echo shar: Extracting \"pathname.c\" \(4973 characters\)
        !          1046: sed "s/^X//" >pathname.c <<'END_OF_pathname.c'
        !          1047: X/* $Source: /u/mark/src/pax/RCS/pathname.c,v $
        !          1048: X *
        !          1049: X * $Revision: 1.1 $
        !          1050: X *
        !          1051: X * pathname.c - directory/pathname support functions 
        !          1052: X *
        !          1053: X * DESCRIPTION
        !          1054: X *
        !          1055: X *    These functions provide directory/pathname support for PAX
        !          1056: X *
        !          1057: X * AUTHOR
        !          1058: X *
        !          1059: X *    Mark H. Colburn, NAPS International ([email protected])
        !          1060: X *
        !          1061: X * Sponsored by The USENIX Association for public distribution. 
        !          1062: X *
        !          1063: X * Copyright (c) 1989 Mark H. Colburn.
        !          1064: X * All rights reserved.
        !          1065: X *
        !          1066: X * Redistribution and use in source and binary forms are permitted
        !          1067: X * provided that the above copyright notice is duplicated in all such 
        !          1068: X * forms and that any documentation, advertising materials, and other 
        !          1069: X * materials related to such distribution and use acknowledge that the 
        !          1070: X * software was developed * by Mark H. Colburn and sponsored by The 
        !          1071: X * USENIX Association. 
        !          1072: X *
        !          1073: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !          1074: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !          1075: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !          1076: X *
        !          1077: X * $Log:      pathname.c,v $
        !          1078: X * Revision 1.1  88/12/23  18:02:21  mark
        !          1079: X * Initial revision
        !          1080: X * 
        !          1081: X */
        !          1082: X
        !          1083: X#ifndef lint
        !          1084: Xstatic char *ident = "$Id: pathname.c,v 1.1 88/12/23 18:02:21 mark Rel $";
        !          1085: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !          1086: X#endif /* ! lint */
        !          1087: X
        !          1088: X
        !          1089: X/* Headers */
        !          1090: X
        !          1091: X#include "pax.h"
        !          1092: X
        !          1093: X
        !          1094: X/* dirneed  - checks for the existance of directories and possibly create
        !          1095: X *
        !          1096: X * DESCRIPTION
        !          1097: X *
        !          1098: X *    Dirneed checks to see if a directory of the name pointed to by name
        !          1099: X *    exists.  If the directory does exist, then dirneed returns 0.  If
        !          1100: X *    the directory does not exist and the f_create_dirs flag is set,
        !          1101: X *    then dirneed will create the needed directory, recursively creating
        !          1102: X *    any needed intermediate directory.
        !          1103: X *
        !          1104: X *    If f_create_dirs is not set, then no directories will be created
        !          1105: X *    and a value of -1 will be returned if the directory does not
        !          1106: X *    exist.
        !          1107: X *
        !          1108: X * PARAMETERS
        !          1109: X *
        !          1110: X *    name            - name of the directory to create
        !          1111: X *
        !          1112: X * RETURNS
        !          1113: X *
        !          1114: X *    Returns a 0 if the creation of the directory succeeded or if the
        !          1115: X *    directory already existed.  If the f_create_dirs flag was not set
        !          1116: X *    and the named directory does not exist, or the directory creation 
        !          1117: X *    failed, a -1 will be returned to the calling routine.
        !          1118: X */
        !          1119: X
        !          1120: X#ifdef __STDC__
        !          1121: X
        !          1122: Xint dirneed(char *name)
        !          1123: X
        !          1124: X#else
        !          1125: X
        !          1126: Xint dirneed(name)
        !          1127: Xchar           *name;
        !          1128: X
        !          1129: X#endif
        !          1130: X{
        !          1131: X    char           *cp;
        !          1132: X    char           *last;
        !          1133: X    int             ok;
        !          1134: X    static Stat     sb;
        !          1135: X
        !          1136: X    last = NULL;
        !          1137: X    for (cp = name; *cp;) {
        !          1138: X      if (*cp++ == '/') {
        !          1139: X          last = cp;
        !          1140: X      }
        !          1141: X    }
        !          1142: X    if (last == NULL) {
        !          1143: X      return (STAT(".", &sb));
        !          1144: X    }
        !          1145: X    *--last = '\0';
        !          1146: X    ok = STAT(*name ? name : ".", &sb) == 0
        !          1147: X      ? ((sb.sb_mode & S_IFMT) == S_IFDIR)
        !          1148: X      : (f_create_dirs && dirneed(name) == 0 && dirmake(name, &sb) == 0);
        !          1149: X    *last = '/';
        !          1150: X    return (ok ? 0 : -1);
        !          1151: X}
        !          1152: X
        !          1153: X
        !          1154: X/* nameopt - optimize a pathname
        !          1155: X *
        !          1156: X * DESCRIPTION
        !          1157: X *
        !          1158: X *    Confused by "<symlink>/.." twistiness. Returns the number of final 
        !          1159: X *    pathname elements (zero for "/" or ".") or -1 if unsuccessful. 
        !          1160: X *
        !          1161: X * PARAMETERS
        !          1162: X *
        !          1163: X *    char    *begin  - name of the path to optimize
        !          1164: X *
        !          1165: X * RETURNS
        !          1166: X *
        !          1167: X *    Returns 0 if successful, non-zero otherwise.
        !          1168: X *
        !          1169: X */
        !          1170: X
        !          1171: X#ifdef __STDC__
        !          1172: X
        !          1173: Xint nameopt(char *begin)
        !          1174: X
        !          1175: X#else
        !          1176: X
        !          1177: Xint nameopt(begin)
        !          1178: Xchar           *begin;
        !          1179: X
        !          1180: X#endif
        !          1181: X{
        !          1182: X    char           *name;
        !          1183: X    char           *item;
        !          1184: X    int             idx;
        !          1185: X    int             absolute;
        !          1186: X    char           *element[PATHELEM];
        !          1187: X
        !          1188: X    absolute = (*(name = begin) == '/');
        !          1189: X    idx = 0;
        !          1190: X    for (;;) {
        !          1191: X      if (idx == PATHELEM) {
        !          1192: X          warn(begin, "Too many elements");
        !          1193: X          return (-1);
        !          1194: X      }
        !          1195: X      while (*name == '/') {
        !          1196: X          ++name;
        !          1197: X      }
        !          1198: X      if (*name == '\0') {
        !          1199: X          break;
        !          1200: X      }
        !          1201: X      element[idx] = item = name;
        !          1202: X      while (*name && *name != '/') {
        !          1203: X          ++name;
        !          1204: X      }
        !          1205: X      if (*name) {
        !          1206: X          *name++ = '\0';
        !          1207: X      }
        !          1208: X      if (strcmp(item, "..") == 0) {
        !          1209: X          if (idx == 0) {
        !          1210: X              if (!absolute) {
        !          1211: X                  ++idx;
        !          1212: X              }
        !          1213: X          } else if (strcmp(element[idx - 1], "..") == 0) {
        !          1214: X              ++idx;
        !          1215: X          } else {
        !          1216: X              --idx;
        !          1217: X          }
        !          1218: X      } else if (strcmp(item, ".") != 0) {
        !          1219: X          ++idx;
        !          1220: X      }
        !          1221: X    }
        !          1222: X    if (idx == 0) {
        !          1223: X      element[idx++] = absolute ? "" : "."; 
        !          1224: X    }
        !          1225: X    element[idx] = NULL;
        !          1226: X    name = begin;
        !          1227: X    if (absolute) {
        !          1228: X      *name++ = '/';
        !          1229: X    }
        !          1230: X    for (idx = 0; item = element[idx]; ++idx, *name++ = '/') {
        !          1231: X      while (*item) {
        !          1232: X          *name++ = *item++;
        !          1233: X      }
        !          1234: X    }
        !          1235: X    *--name = '\0';
        !          1236: X    return (idx);
        !          1237: X}
        !          1238: X
        !          1239: X
        !          1240: X/* dirmake - make a directory  
        !          1241: X *
        !          1242: X * DESCRIPTION
        !          1243: X *
        !          1244: X *    Dirmake makes a directory with the appropritate permissions.
        !          1245: X *
        !          1246: X * PARAMETERS
        !          1247: X *
        !          1248: X *    char    *name   - Name of directory make
        !          1249: X *    Stat    *asb    - Stat structure of directory to make
        !          1250: X *
        !          1251: X * RETURNS
        !          1252: X *
        !          1253: X *    Returns zero if successful, -1 otherwise. 
        !          1254: X *
        !          1255: X */
        !          1256: X
        !          1257: X#ifdef __STDC__
        !          1258: X
        !          1259: Xint dirmake(char *name, Stat *asb)
        !          1260: X
        !          1261: X#else
        !          1262: X
        !          1263: Xint dirmake(name, asb)
        !          1264: Xchar           *name;
        !          1265: XStat           *asb;
        !          1266: X
        !          1267: X#endif
        !          1268: X{
        !          1269: X    if (mkdir(name, (int) (asb->sb_mode & S_IPOPN)) < 0) {
        !          1270: X      return (-1);
        !          1271: X    }
        !          1272: X    if (asb->sb_mode & S_IPEXE) {
        !          1273: X      chmod(name, (int) (asb->sb_mode & S_IPERM));
        !          1274: X    }
        !          1275: X    if (f_owner) {
        !          1276: X      chown(name, (int) asb->sb_uid, (int) asb->sb_gid);
        !          1277: X    }
        !          1278: X    return (0);
        !          1279: X}
        !          1280: END_OF_pathname.c
        !          1281: if test 4973 -ne `wc -c <pathname.c`; then
        !          1282:     echo shar: \"pathname.c\" unpacked with wrong size!
        !          1283: fi
        !          1284: # end of overwriting check
        !          1285: fi
        !          1286: if test -f paxdir.h -a "${1}" != "-c" ; then 
        !          1287:   echo shar: Will not over-write existing file \"paxdir.h\"
        !          1288: else
        !          1289: echo shar: Extracting \"paxdir.h\" \(1562 characters\)
        !          1290: sed "s/^X//" >paxdir.h <<'END_OF_paxdir.h'
        !          1291: X/*
        !          1292: X      <dirent.h> -- definitions for SVR3 directory access routines
        !          1293: X
        !          1294: X      last edit:      25-Apr-1987     D A Gwyn
        !          1295: X
        !          1296: X      Prerequisite:   <sys/types.h>
        !          1297: X*/
        !          1298: X
        !          1299: X#ifndef _PAX_DIRENT_H
        !          1300: X#define _PAX_DIRENT_H
        !          1301: X
        !          1302: X#include "config.h"
        !          1303: X#ifdef USG
        !          1304: X#define UFS
        !          1305: X#else
        !          1306: X#ifdef BSD
        !          1307: X#define BFS
        !          1308: X#endif
        !          1309: X#endif
        !          1310: X
        !          1311: Xstruct dirent {                       /* data from getdents()/readdir() */
        !          1312: X    long              d_ino;          /* inode number of entry */
        !          1313: X    off_t             d_off;          /* offset of disk directory entry */
        !          1314: X    unsigned short    d_reclen;       /* length of this record */
        !          1315: X    char              d_name[1];      /* name of file (non-POSIX) */
        !          1316: X};
        !          1317: X
        !          1318: Xtypedef struct {
        !          1319: X    int               dd_fd;                  /* file descriptor */
        !          1320: X    int               dd_loc;                 /* offset in block */
        !          1321: X    int               dd_size;                /* amount of valid data */
        !          1322: X    char      *dd_buf;                /* -> directory block */
        !          1323: X} DIR;                                        /* stream data from opendir() */
        !          1324: X
        !          1325: X
        !          1326: X/* 
        !          1327: X * The following nonportable ugliness could have been avoided by defining
        !          1328: X * DIRENTSIZ and DIRENTBASESIZ to also have (struct dirent *) arguments. 
        !          1329: X */
        !          1330: X#define       DIRENTBASESIZ           (((struct dirent *)0)->d_name \
        !          1331: X                              - (char *)&((struct dirent *)0)->d_ino)
        !          1332: X#define       DIRENTSIZ( namlen )     ((DIRENTBASESIZ + sizeof(long) + (namlen)) \
        !          1333: X                              / sizeof(long) * sizeof(long))
        !          1334: X
        !          1335: X#define       MAXNAMLEN 512                   /* maximum filename length */
        !          1336: X
        !          1337: X#ifndef NAME_MAX
        !          1338: X#define       NAME_MAX (MAXNAMLEN - 1)        /* DAG -- added for POSIX */
        !          1339: X#endif
        !          1340: X
        !          1341: X#define       DIRBUF   8192                   /* buffer size for fs-indep. dirs */
        !          1342: X              /* must in general be larger than the filesystem buffer size */
        !          1343: X
        !          1344: Xextern DIR            *opendir();
        !          1345: Xextern struct dirent  *readdir();
        !          1346: Xextern OFFSET         telldir();
        !          1347: Xextern void           seekdir();
        !          1348: Xextern int            closedir();
        !          1349: X
        !          1350: X#endif /* _PAX_DIRENT_H */
        !          1351: END_OF_paxdir.h
        !          1352: if test 1562 -ne `wc -c <paxdir.h`; then
        !          1353:     echo shar: \"paxdir.h\" unpacked with wrong size!
        !          1354: fi
        !          1355: # end of overwriting check
        !          1356: fi
        !          1357: if test -f port.c -a "${1}" != "-c" ; then 
        !          1358:   echo shar: Will not over-write existing file \"port.c\"
        !          1359: else
        !          1360: echo shar: Extracting \"port.c\" \(4782 characters\)
        !          1361: sed "s/^X//" >port.c <<'END_OF_port.c'
        !          1362: X/* $Source: /u/mark/src/pax/RCS/port.c,v $
        !          1363: X *
        !          1364: X * $Revision: 1.1 $
        !          1365: X *
        !          1366: X * port.c - These are routines not available in all environments. 
        !          1367: X *
        !          1368: X * DESCRIPTION
        !          1369: X *
        !          1370: X *    The routines contained in this file are provided for portability to
        !          1371: X *    other versions of UNIX or other operating systems (e.g. MSDOS).
        !          1372: X *    Not all systems have the same functions or the same semantics,
        !          1373: X *    these routines attempt to bridge the gap as much as possible.
        !          1374: X *
        !          1375: X * AUTHOR
        !          1376: X *
        !          1377: X *    Mark H. Colburn, NAPS International ([email protected])
        !          1378: X *    John Gilmore (gnu@hoptoad)
        !          1379: X *
        !          1380: X * Sponsored by The USENIX Association for public distribution. 
        !          1381: X *
        !          1382: X * Copyright (c) 1989 Mark H. Colburn.
        !          1383: X * All rights reserved.
        !          1384: X *
        !          1385: X * Redistribution and use in source and binary forms are permitted
        !          1386: X * provided that the above copyright notice is duplicated in all such 
        !          1387: X * forms and that any documentation, advertising materials, and other 
        !          1388: X * materials related to such distribution and use acknowledge that the 
        !          1389: X * software was developed * by Mark H. Colburn and sponsored by The 
        !          1390: X * USENIX Association. 
        !          1391: X *
        !          1392: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !          1393: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !          1394: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !          1395: X *
        !          1396: X * $Log:      port.c,v $
        !          1397: X * Revision 1.1  88/12/23  18:02:29  mark
        !          1398: X * Initial revision
        !          1399: X * 
        !          1400: X */
        !          1401: X
        !          1402: X#ifndef lint
        !          1403: Xstatic char *ident = "$Id: port.c,v 1.1 88/12/23 18:02:29 mark Rel $";
        !          1404: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !          1405: X#endif /* ! lint */
        !          1406: X
        !          1407: X
        !          1408: X/* Headers */
        !          1409: X
        !          1410: X#include "pax.h"
        !          1411: X
        !          1412: X
        !          1413: X/*
        !          1414: X * Some computers are not so crass as to align themselves into the BSD or USG
        !          1415: X * camps.  If a system supplies all of the routines we fake here, add it to
        !          1416: X * the list in the #if !defined()'s below and it'll all be skipped. 
        !          1417: X */
        !          1418: X
        !          1419: X#if !defined(mc300) && !defined(mc500) && !defined(mc700) && \
        !          1420: X    !defined(BSD)
        !          1421: X
        !          1422: X/* mkdir - make a directory
        !          1423: X *
        !          1424: X * DESCRIPTION
        !          1425: X *
        !          1426: X *    Mkdir will make a directory of the name "dpath" with a mode of
        !          1427: X *    "dmode".  This is consistent with the BSD mkdir() function and the
        !          1428: X *    P1003.1 definitions of MKDIR.
        !          1429: X *
        !          1430: X * PARAMETERS
        !          1431: X *
        !          1432: X *    dpath           - name of directory to create
        !          1433: X *    dmode           - mode of the directory
        !          1434: X *
        !          1435: X * RETURNS
        !          1436: X *
        !          1437: X *    Returns 0 if the directory was successfully created, otherwise a
        !          1438: X *    non-zero return value will be passed back to the calling function
        !          1439: X *    and the value of errno should reflect the error.
        !          1440: X */
        !          1441: X
        !          1442: X#ifdef __STDC__
        !          1443: X
        !          1444: Xint mkdir(char *dpath, int dmode)
        !          1445: X
        !          1446: X#else
        !          1447: X    
        !          1448: Xint mkdir(dpath, dmode)
        !          1449: Xchar           *dpath;
        !          1450: Xint             dmode;
        !          1451: X
        !          1452: X#endif
        !          1453: X{
        !          1454: X    int             cpid, status;
        !          1455: X    Stat            statbuf;
        !          1456: X    extern int      errno;
        !          1457: X
        !          1458: X    if (STAT(dpath, &statbuf) == 0) {
        !          1459: X      errno = EEXIST;         /* Stat worked, so it already exists */
        !          1460: X      return (-1);
        !          1461: X    }
        !          1462: X    /* If stat fails for a reason other than non-existence, return error */
        !          1463: X    if (errno != ENOENT)
        !          1464: X      return (-1);
        !          1465: X
        !          1466: X    switch (cpid = fork()) {
        !          1467: X
        !          1468: X    case -1:                  /* Error in fork() */
        !          1469: X      return (-1);            /* Errno is set already */
        !          1470: X
        !          1471: X    case 0:                   /* Child process */
        !          1472: X
        !          1473: X      status = umask(0);      /* Get current umask */
        !          1474: X      status = umask(status | (0777 & ~dmode));       /* Set for mkdir */
        !          1475: X      execl("/bin/mkdir", "mkdir", dpath, (char *) 0);
        !          1476: X      _exit(-1);              /* Can't exec /bin/mkdir */
        !          1477: X
        !          1478: X    default:                  /* Parent process */
        !          1479: X      while (cpid != wait(&status)) {
        !          1480: X          /* Wait for child to finish */
        !          1481: X      }
        !          1482: X    }
        !          1483: X
        !          1484: X    if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) {
        !          1485: X      errno = EIO;            /* We don't know why, but */
        !          1486: X      return (-1);            /* /bin/mkdir failed */
        !          1487: X    }
        !          1488: X    return (0);
        !          1489: X}
        !          1490: X
        !          1491: X
        !          1492: X/* rmdir - remove a directory
        !          1493: X *
        !          1494: X * DESCRIPTION
        !          1495: X *
        !          1496: X *    Rmdir will remove the directory specified by "dpath".  It is
        !          1497: X *    consistent with the BSD and POSIX rmdir functions.
        !          1498: X *
        !          1499: X * PARAMETERS
        !          1500: X *
        !          1501: X *    dpath           - name of directory to remove
        !          1502: X *
        !          1503: X * RETURNS
        !          1504: X *
        !          1505: X *    Returns 0 if the directory was successfully deleted, otherwise a
        !          1506: X *    non-zero return value will be passed back to the calling function
        !          1507: X *    and the value of errno should reflect the error.
        !          1508: X */
        !          1509: X
        !          1510: X#ifdef __STDC__
        !          1511: X
        !          1512: Xint rmdir(char *dpath)
        !          1513: X
        !          1514: X#else
        !          1515: X    
        !          1516: Xint rmdir(dpath)
        !          1517: Xchar           *dpath;
        !          1518: X
        !          1519: X#endif
        !          1520: X{
        !          1521: X    int             cpid, status;
        !          1522: X    Stat            statbuf;
        !          1523: X    extern int      errno;
        !          1524: X
        !          1525: X    /* check to see if it exists */
        !          1526: X    if (STAT(dpath, &statbuf) == -1) {
        !          1527: X      return (-1);
        !          1528: X    }
        !          1529: X    switch (cpid = fork()) {
        !          1530: X
        !          1531: X    case -1:                  /* Error in fork() */
        !          1532: X      return (-1);            /* Errno is set already */
        !          1533: X
        !          1534: X    case 0:                   /* Child process */
        !          1535: X      execl("/bin/rmdir", "rmdir", dpath, (char *) 0);
        !          1536: X      _exit(-1);              /* Can't exec /bin/rmdir */
        !          1537: X
        !          1538: X    default:                  /* Parent process */
        !          1539: X      while (cpid != wait(&status)) {
        !          1540: X          /* Wait for child to finish */
        !          1541: X      }
        !          1542: X    }
        !          1543: X
        !          1544: X    if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) {
        !          1545: X      errno = EIO;            /* We don't know why, but */
        !          1546: X      return (-1);            /* /bin/rmdir failed */
        !          1547: X    }
        !          1548: X    return (0);
        !          1549: X}
        !          1550: X
        !          1551: X#endif /* MASSCOMP, BSD */
        !          1552: END_OF_port.c
        !          1553: if test 4782 -ne `wc -c <port.c`; then
        !          1554:     echo shar: \"port.c\" unpacked with wrong size!
        !          1555: fi
        !          1556: # end of overwriting check
        !          1557: fi
        !          1558: if test -f port.h -a "${1}" != "-c" ; then 
        !          1559:   echo shar: Will not over-write existing file \"port.h\"
        !          1560: else
        !          1561: echo shar: Extracting \"port.h\" \(2833 characters\)
        !          1562: sed "s/^X//" >port.h <<'END_OF_port.h'
        !          1563: X/* $Source: /u/mark/src/pax/RCS/port.h,v $
        !          1564: X *
        !          1565: X * $Revision: 1.1 $
        !          1566: X *
        !          1567: X * port.h - defnitions for portability library
        !          1568: X *
        !          1569: X * DESCRIPTION
        !          1570: X *
        !          1571: X *    Header for maintaing portablilty across operating system and
        !          1572: X *    version boundries.  For the most part, this file contains
        !          1573: X *    definitions which map functions which have the same functionality
        !          1574: X *    but different names on different systems, to have the same name.
        !          1575: X *
        !          1576: X * AUTHORS
        !          1577: X *
        !          1578: X *    Mark H. Colburn, NAPS International ([email protected])
        !          1579: X *    John Gilmore (gnu@hoptoad)
        !          1580: X *
        !          1581: X * Sponsored by The USENIX Association for public distribution. 
        !          1582: X *
        !          1583: X * Copyright (c) 1989 Mark H. Colburn.
        !          1584: X * All rights reserved.
        !          1585: X *
        !          1586: X * Redistribution and use in source and binary forms are permitted
        !          1587: X * provided that the above copyright notice and this paragraph are
        !          1588: X * duplicated in all such forms and that any documentation,
        !          1589: X * advertising materials, and other materials related to such
        !          1590: X * distribution and use acknowledge that the software was developed
        !          1591: X * by Mark H. Colburn and sponsored by The USENIX Association. 
        !          1592: X *
        !          1593: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !          1594: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !          1595: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !          1596: X */
        !          1597: X
        !          1598: X#ifndef _PAX_PORT_H
        !          1599: X#define _PAX_PORT_H
        !          1600: X
        !          1601: X/*
        !          1602: X * Everybody does wait() differently.  There seem to be no definitions for
        !          1603: X * this in V7 (e.g. you are supposed to shift and mask things out using
        !          1604: X * constant shifts and masks.)  In order to provide the functionality, here
        !          1605: X * are some non standard but portable macros.  Don't change to a "union wait" 
        !          1606: X * based approach -- the ordering of the elements of the struct depends on the 
        !          1607: X * byte-sex of the machine. 
        !          1608: X */
        !          1609: X
        !          1610: X#define       TERM_SIGNAL(status)     ((status) & 0x7F)
        !          1611: X#define TERM_COREDUMP(status) (((status) & 0x80) != 0)
        !          1612: X#define TERM_VALUE(status)    ((status) >> 8)
        !          1613: X
        !          1614: X/*
        !          1615: X * String library emulation definitions for the different variants of UNIX
        !          1616: X */
        !          1617: X
        !          1618: X#if defined(USG) 
        !          1619: X
        !          1620: X#   include <string.h>
        !          1621: X#   include <memory.h>
        !          1622: X
        !          1623: X#else /* USG */
        !          1624: X
        !          1625: X/*
        !          1626: X * The following functions are defined here since func.h has no idea which
        !          1627: X * of the functions will actually be used.
        !          1628: X */
        !          1629: X#  ifdef __STDC__
        !          1630: Xextern char *rindex(char *, char);
        !          1631: Xextern char *index(char *, char);
        !          1632: Xextern char *bcopy(char *, char *, unsigned int);
        !          1633: Xextern char *bzero(char *, unsigned int);
        !          1634: Xextern char *strcat(char *, char *);
        !          1635: Xextern char *strcpy(char *, char *);
        !          1636: X#  else /* !__STDC__ */
        !          1637: Xextern char *rindex();
        !          1638: Xextern char *index();
        !          1639: Xextern char *bcopy();
        !          1640: Xextern char *bzero();
        !          1641: Xextern char *strcat();
        !          1642: Xextern char *strcpy();
        !          1643: X#  endif /* __STDC__ */
        !          1644: X
        !          1645: X/*
        !          1646: X * Map ANSI C compatible functions to V7 functions
        !          1647: X */
        !          1648: X
        !          1649: X#   define memcpy(a,b,n)      bcopy((b),(a),(n))
        !          1650: X#   define memset(a,b,n)      bzero((a),(n))
        !          1651: X#   define strrchr(s,c)               rindex(s,c)
        !          1652: X#   define strchr(s,c)                index(s,c)
        !          1653: X
        !          1654: X#endif /* USG */
        !          1655: X#endif /* _PAX_PORT_H */
        !          1656: END_OF_port.h
        !          1657: if test 2833 -ne `wc -c <port.h`; then
        !          1658:     echo shar: \"port.h\" unpacked with wrong size!
        !          1659: fi
        !          1660: # end of overwriting check
        !          1661: fi
        !          1662: if test -f regexp.h -a "${1}" != "-c" ; then 
        !          1663:   echo shar: Will not over-write existing file \"regexp.h\"
        !          1664: else
        !          1665: echo shar: Extracting \"regexp.h\" \(803 characters\)
        !          1666: sed "s/^X//" >regexp.h <<'END_OF_regexp.h'
        !          1667: X/*
        !          1668: X * Definitions etc. for regexp(3) routines.
        !          1669: X *
        !          1670: X * Caveat:  this is V8 regexp(3) [actually, a reimplementation thereof],
        !          1671: X * not the System V one.
        !          1672: X */
        !          1673: X
        !          1674: X#ifndef _PAX_REGEXP_H
        !          1675: X#define _PAX_REGEXP_H
        !          1676: X
        !          1677: X#define NSUBEXP  10
        !          1678: Xtypedef struct regexp {
        !          1679: X      char *startp[NSUBEXP];
        !          1680: X      char *endp[NSUBEXP];
        !          1681: X      char regstart;          /* Internal use only. */
        !          1682: X      char reganch;           /* Internal use only. */
        !          1683: X      char *regmust;          /* Internal use only. */
        !          1684: X      int regmlen;            /* Internal use only. */
        !          1685: X      char program[1];        /* Unwarranted chumminess with compiler. */
        !          1686: X} regexp;
        !          1687: X
        !          1688: X
        !          1689: X/*
        !          1690: X * The first byte of the regexp internal "program" is actually this magic
        !          1691: X * number; the start node begins in the second byte.
        !          1692: X */
        !          1693: X#define       MAGIC   0234
        !          1694: X
        !          1695: Xextern regexp *regcomp();
        !          1696: Xextern int regexec();
        !          1697: Xextern void regsub();
        !          1698: Xextern void regerror();
        !          1699: X
        !          1700: X#endif /* _PAX_REGEXP_H */
        !          1701: END_OF_regexp.h
        !          1702: if test 803 -ne `wc -c <regexp.h`; then
        !          1703:     echo shar: \"regexp.h\" unpacked with wrong size!
        !          1704: fi
        !          1705: # end of overwriting check
        !          1706: fi
        !          1707: if test -f tar.1 -a "${1}" != "-c" ; then 
        !          1708:   echo shar: Will not over-write existing file \"tar.1\"
        !          1709: else
        !          1710: echo shar: Extracting \"tar.1\" \(4671 characters\)
        !          1711: sed "s/^X//" >tar.1 <<'END_OF_tar.1'
        !          1712: X.\" $Id: tar.1,v 1.1 88/12/23 18:02:37 mark Rel $
        !          1713: X.TH TAR 1 "USENIX Association" ""
        !          1714: X.SH NAME
        !          1715: Xtar \- process tape archives
        !          1716: X.SH SYNOPSIS
        !          1717: X.B tar
        !          1718: X.BR \-c [ bfvw ]
        !          1719: X.I device
        !          1720: X.I block
        !          1721: X.I filename...
        !          1722: X.br
        !          1723: X.B tar
        !          1724: X.BR \-r [ bvw ]
        !          1725: X.I device
        !          1726: X.I block
        !          1727: X.RI [ filename... ]
        !          1728: X.br
        !          1729: X.B tar
        !          1730: X.BR \-t [ fv ]
        !          1731: X.I device
        !          1732: X.br
        !          1733: X.B tar
        !          1734: X.BR \-u [ bvw ]
        !          1735: X.I device
        !          1736: X.I block
        !          1737: X.br
        !          1738: X.B tar
        !          1739: X.BR \-x [ flmovw ]
        !          1740: X.I device
        !          1741: X.RI [ filename... ]
        !          1742: X.SH DESCRIPTION
        !          1743: X.I Tar
        !          1744: Xreads and writes archive files which conform to the
        !          1745: X.B "Archive/Interchange File Format"
        !          1746: Xspecified in
        !          1747: X.IR "IEEE Std. 1003.1-1988" .
        !          1748: X.SS Options
        !          1749: XThe following options are available:
        !          1750: X.TP 1i
        !          1751: X.B \-c
        !          1752: XCreates a new archive; writing begins at the beginning of the archive,
        !          1753: Xinstead of after the last file.
        !          1754: X.TP 1i
        !          1755: X.B \-r
        !          1756: XWrites names files to the end of the archive.
        !          1757: X.TP 1i
        !          1758: X.B \-t
        !          1759: XLists the names of all of the files in the archive.
        !          1760: X.TP 1i
        !          1761: X.B \-u
        !          1762: XCauses named files to be
        !          1763: Xadded to the archive if they are not already there, or have been
        !          1764: Xmodified since last written into the archive.
        !          1765: XThis implies the
        !          1766: X.B \-r
        !          1767: Xoption.
        !          1768: X.TP 1i
        !          1769: X.B \-x
        !          1770: XExtracts named files
        !          1771: Xfrom the archive.
        !          1772: XIf a named file matches a directory whose contents had been written onto
        !          1773: Xthe archive, that directory is recursively extracted.
        !          1774: XIf a named file in the archive does not exist on the system, the file is
        !          1775: Xcreate with the same mode as the one in the archive, except that the
        !          1776: Xset-user-id and get-group-id modes are not set unless the user has
        !          1777: Xappropriate privileges.
        !          1778: X.PP
        !          1779: XIf the files exist, their modes are not changed except as described above.
        !          1780: XThe owner, group and modification time are restored if possible.
        !          1781: XIf no
        !          1782: X.I filename
        !          1783: Xargument is given, the entire contents of the archive is extracted.
        !          1784: XNote that if several files with the same name are in the archive,
        !          1785: Xthe last one will overwrite all earlier ones.
        !          1786: X.TP 1i
        !          1787: X.B \-b
        !          1788: XCauses
        !          1789: X.I tar
        !          1790: Xto use the next argument on the command line as the blocking factor for
        !          1791: Xtape records.
        !          1792: XThe default is 1; the maximum is 20.
        !          1793: XThis option should only be used with raw magnetic tape archives.
        !          1794: XNormally, the block size is determined automatically when reading tapes.
        !          1795: X.TP 1i
        !          1796: X.B \-f
        !          1797: XCauses
        !          1798: X.I tar
        !          1799: Xto use the next argument on the command line as the name of the archive
        !          1800: Xinstead of the default, which is usually a tape drive.
        !          1801: XIf
        !          1802: X.B -
        !          1803: Xis specified as a filename
        !          1804: X.I tar
        !          1805: Xwrites to the standard output or reads from the standard input, whichever
        !          1806: Xis appropriate for the options given.
        !          1807: XThus,
        !          1808: X.I tar
        !          1809: Xcan be used as the head or tail of a pipeline.
        !          1810: X.TP 1i
        !          1811: X.B \-l
        !          1812: XTells
        !          1813: X.I tar
        !          1814: Xto report if it cannot resolve all of the links to the files being
        !          1815: Xarchived.
        !          1816: XIf
        !          1817: X.B \-l
        !          1818: Xis not specified, no error messages are written to the standard output.
        !          1819: XThis modifier is only valid with the
        !          1820: X.BR \-c ,
        !          1821: X.B \-r
        !          1822: Xand
        !          1823: X.BR \-u
        !          1824: Xoptions.
        !          1825: X.TP 1i
        !          1826: X.B \-m
        !          1827: XTells
        !          1828: X.I tar
        !          1829: Xnot to restore the modification times.
        !          1830: XThe modification time of the file will be the time of extraction.
        !          1831: XThis modifier is invalid with th
        !          1832: X.B \-t
        !          1833: Xoption.
        !          1834: X.TP 1i
        !          1835: X.B \-o
        !          1836: XCauses extracted files to take on the user and group identifier of the user
        !          1837: Xrunning the program rather than those on the archive.
        !          1838: XThis modifier is only valid with the
        !          1839: X.B \-x
        !          1840: Xoption.
        !          1841: X.TP 1i
        !          1842: X.B \-v
        !          1843: XCauses
        !          1844: X.I tar
        !          1845: Xto operate verbosely.  Usually,
        !          1846: X.I tar
        !          1847: Xdoes its work silently, but
        !          1848: Xthe
        !          1849: X.B v
        !          1850: Xmodifier causes it to print the name of each file it processes,
        !          1851: Xpreceded by the option letter.
        !          1852: XWith the
        !          1853: X.B \-t
        !          1854: Xoption,
        !          1855: X.B v
        !          1856: Xgives more information about the archive entries than just the name.
        !          1857: X.TP 1i
        !          1858: X.B \-w
        !          1859: XCauses
        !          1860: X.I tar
        !          1861: Xto print the action to be taken, followed by the name of the file, and then
        !          1862: Xwait for the user's confirmation.
        !          1863: XIf a word beginning with
        !          1864: X.B y
        !          1865: Xis given, the action is performed.
        !          1866: XAny other input means "no".
        !          1867: XThis modifier is invalid with the
        !          1868: X.B \-t
        !          1869: Xoption.
        !          1870: X.SH FILES
        !          1871: X.TP 1i
        !          1872: X/dev/tty
        !          1873: Xused to prompt the user for information when the
        !          1874: X.BR \-i " or " \-y
        !          1875: Xoptions are specified.
        !          1876: X.SH "SEE ALSO"
        !          1877: Xcpio(1), dd(1), find(1), pax(1), cpio(5), tar(5)
        !          1878: X.SH COPYRIGHT
        !          1879: XCopyright (c) 1989 Mark H. Colburn.  
        !          1880: X.br
        !          1881: XAll rights reserved.
        !          1882: X.PP
        !          1883: XRedistribution and use in source and binary forms are permitted
        !          1884: Xprovided that the above copyright notice is duplicated in all such 
        !          1885: Xforms and that any documentation, advertising materials, and other 
        !          1886: Xmaterials related to such distribution and use acknowledge that the 
        !          1887: Xsoftware was developed by Mark H. Colburn and sponsored by The 
        !          1888: XUSENIX Association. 
        !          1889: X.PP
        !          1890: XTHE SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !          1891: XIMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !          1892: XWARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !          1893: X.SH AUTHOR
        !          1894: XMark H. Colburn
        !          1895: X.br
        !          1896: XNAPS International
        !          1897: X.br
        !          1898: X117 Mackubin Street, Suite 1
        !          1899: X.br
        !          1900: XSt. Paul, MN 55102
        !          1901: X.br
        !          1902: [email protected]
        !          1903: X.sp 2
        !          1904: XSponsored by
        !          1905: X.B "The USENIX Association"
        !          1906: Xfor public distribution.
        !          1907: END_OF_tar.1
        !          1908: if test 4671 -ne `wc -c <tar.1`; then
        !          1909:     echo shar: \"tar.1\" unpacked with wrong size!
        !          1910: fi
        !          1911: # end of overwriting check
        !          1912: fi
        !          1913: if test -f wildmat.c -a "${1}" != "-c" ; then 
        !          1914:   echo shar: Will not over-write existing file \"wildmat.c\"
        !          1915: else
        !          1916: echo shar: Extracting \"wildmat.c\" \(4958 characters\)
        !          1917: sed "s/^X//" >wildmat.c <<'END_OF_wildmat.c'
        !          1918: X/* $Source: /u/mark/src/pax/RCS/wildmat.c,v $
        !          1919: X *
        !          1920: X * $Revision: 1.1 $
        !          1921: X *
        !          1922: X * wildmat.c - simple regular expression pattern matching routines 
        !          1923: X *
        !          1924: X * DESCRIPTION 
        !          1925: X *
        !          1926: X *    These routines provide simple UNIX style regular expression matching.  
        !          1927: X *    They were originally written by Rich Salz, the comp.sources.unix 
        !          1928: X *    moderator for inclusion in some of his software.  These routines 
        !          1929: X *    were released into the public domain and used by John Gilmore in 
        !          1930: X *    USTAR. 
        !          1931: X *
        !          1932: X * AUTHORS 
        !          1933: X *
        !          1934: X *    Mark H. Colburn, NAPS International ([email protected]        !          1935: X *    John Gilmore (gnu@hoptoad) 
        !          1936: X *    Rich Salz ([email protected]        !          1937: X *
        !          1938: X *
        !          1939: X * Sponsored by The USENIX Association for public distribution. 
        !          1940: X *
        !          1941: X * Copyright (c) 1989 Mark H. Colburn.
        !          1942: X * All rights reserved.
        !          1943: X *
        !          1944: X * Redistribution and use in source and binary forms are permitted
        !          1945: X * provided that the above copyright notice is duplicated in all such 
        !          1946: X * forms and that any documentation, advertising materials, and other 
        !          1947: X * materials related to such distribution and use acknowledge that the 
        !          1948: X * software was developed * by Mark H. Colburn and sponsored by The 
        !          1949: X * USENIX Association. 
        !          1950: X *
        !          1951: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !          1952: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !          1953: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !          1954: X *
        !          1955: X * $Log:      wildmat.c,v $
        !          1956: X * Revision 1.1  88/12/23  18:02:41  mark
        !          1957: X * Initial revision
        !          1958: X * 
        !          1959: X */
        !          1960: X
        !          1961: X#ifndef lint
        !          1962: Xstatic char *ident = "$Id: wildmat.c,v 1.1 88/12/23 18:02:41 mark Rel $";
        !          1963: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
        !          1964: X#endif /* ! lint */
        !          1965: X
        !          1966: X
        !          1967: X/* Headers */
        !          1968: X
        !          1969: X#include "pax.h"
        !          1970: X
        !          1971: X
        !          1972: X/* Function Prototypes */
        !          1973: X
        !          1974: X#ifdef __STDC__
        !          1975: Xstatic int star(char *, char *);
        !          1976: X#else  /* !__STDC__ */
        !          1977: Xstatic int      star();
        !          1978: X#endif /* __STDC__ */
        !          1979: X
        !          1980: X
        !          1981: X/*
        !          1982: X * star - handle trailing * in a regular expression 
        !          1983: X *
        !          1984: X * DESCRIPTION
        !          1985: X *
        !          1986: X *    Star is used to match filename expansions containing a trailing
        !          1987: X *    asterisk ('*').  Star call wildmat() to determine if the substring
        !          1988: X *    passed to it is matches the regular expression.
        !          1989: X *
        !          1990: X * PARAMETERS 
        !          1991: X *
        !          1992: X *    char *source    - The source string which is to be compared to the 
        !          1993: X *                      regular expression pattern. 
        !          1994: X *    char *pattern   - The regular expression which we are supposed to 
        !          1995: X *                      match to. 
        !          1996: X *
        !          1997: X * RETURNS 
        !          1998: X *
        !          1999: X *    Returns non-zero if the entire source string is completely matched by 
        !          2000: X *    the regular expression pattern, returns 0 otherwise. This is used to 
        !          2001: X *    see if *'s in a pattern matched the entire source string. 
        !          2002: X *
        !          2003: X */
        !          2004: X
        !          2005: X#ifdef __STDC__
        !          2006: X
        !          2007: Xstatic int star(char *source, char *pattern)
        !          2008: X
        !          2009: X#else
        !          2010: X
        !          2011: Xstatic int star(source, pattern)
        !          2012: Xchar           *source;               /* source operand */
        !          2013: Xchar           *pattern;      /* regular expression to match */
        !          2014: X
        !          2015: X#endif
        !          2016: X{
        !          2017: X    while (!wildmat(source, pattern)) {
        !          2018: X      if (*++source == '\0') {
        !          2019: X          return (0);
        !          2020: X      }
        !          2021: X    }
        !          2022: X    return (1);
        !          2023: X}
        !          2024: X
        !          2025: X
        !          2026: X/*
        !          2027: X * wildmat - match a regular expression 
        !          2028: X *
        !          2029: X * DESCRIPTION
        !          2030: X *
        !          2031: X *    Wildmat attempts to match the string pointed to by source to the 
        !          2032: X *    regular expression pointed to by pattern.  The subset of regular 
        !          2033: X *    expression syntax which is supported is defined by POSIX P1003.2 
        !          2034: X *    FILENAME EXPANSION rules.
        !          2035: X *
        !          2036: X * PARAMETERS 
        !          2037: X *
        !          2038: X *    char *source    - The source string which is to be compared to the 
        !          2039: X *                      regular expression pattern. 
        !          2040: X *    char *pattern   - The regular expression which we are supposed to 
        !          2041: X *                      match to. 
        !          2042: X *
        !          2043: X * RETURNS 
        !          2044: X *
        !          2045: X *    Returns non-zero if the source string matches the regular expression 
        !          2046: X *    pattern specified, returns 0 otherwise. 
        !          2047: X *
        !          2048: X */
        !          2049: X
        !          2050: X#ifdef __STDC__
        !          2051: X
        !          2052: Xint wildmat(char *pattern, char *source)
        !          2053: X
        !          2054: X#else
        !          2055: X
        !          2056: Xint wildmat(pattern, source)
        !          2057: Xchar           *pattern;      /* regular expression to match */
        !          2058: Xchar           *source;               /* source operand */
        !          2059: X
        !          2060: X#endif
        !          2061: X{
        !          2062: X    int             last;     /* last character matched */
        !          2063: X    int             matched;  /* !0 if a match occurred */
        !          2064: X    int             reverse;  /* !0 if sense of match is reversed */
        !          2065: X
        !          2066: X    for (; *pattern; source++, pattern++) {
        !          2067: X      switch (*pattern) {
        !          2068: X      case '\\':
        !          2069: X          /* Literal match with following character */
        !          2070: X          pattern++;
        !          2071: X          /* FALLTHRU */
        !          2072: X      default:
        !          2073: X          if (*source != *pattern) {
        !          2074: X              return (0);
        !          2075: X          }
        !          2076: X          continue;
        !          2077: X      case '?':
        !          2078: X          /* Match anything. */
        !          2079: X          if (*source == '\0') {
        !          2080: X              return (0);
        !          2081: X          }
        !          2082: X          continue;
        !          2083: X      case '*':
        !          2084: X          /* Trailing star matches everything. */
        !          2085: X          return (*++pattern ? star(source, pattern) : 1);
        !          2086: X      case '[':
        !          2087: X          /* [^....] means inverse character class. */
        !          2088: X          if (reverse = pattern[1] == '^') {
        !          2089: X              pattern++;
        !          2090: X          }
        !          2091: X          for (last = 0400, matched = 0;
        !          2092: X               *++pattern && *pattern != ']'; last = *pattern) {
        !          2093: X              /* This next line requires a good C compiler. */
        !          2094: X              if (*pattern == '-'
        !          2095: X                  ? *source <= *++pattern && *source >= last
        !          2096: X                  : *source == *pattern) {
        !          2097: X                  matched = 1;
        !          2098: X              }
        !          2099: X          }
        !          2100: X          if (matched == reverse) {
        !          2101: X              return (0);
        !          2102: X          }
        !          2103: X          continue;
        !          2104: X      }
        !          2105: X    }
        !          2106: X
        !          2107: X    /*
        !          2108: X     * For "tar" use, matches that end at a slash also work. --hoptoad!gnu 
        !          2109: X     */
        !          2110: X    return (*source == '\0' || *source == '/');
        !          2111: X}
        !          2112: END_OF_wildmat.c
        !          2113: if test 4958 -ne `wc -c <wildmat.c`; then
        !          2114:     echo shar: \"wildmat.c\" unpacked with wrong size!
        !          2115: fi
        !          2116: # end of overwriting check
        !          2117: fi
        !          2118: echo shar: End of archive 1 \(of 6\).
        !          2119: cp /dev/null ark1isdone
        !          2120: MISSING=""
        !          2121: for I in 1 2 3 4 5 6 ; do
        !          2122:     if test ! -f ark${I}isdone ; then
        !          2123:        MISSING="${MISSING} ${I}"
        !          2124:     fi
        !          2125: done
        !          2126: if test "${MISSING}" = "" ; then
        !          2127:     echo You have unpacked all 6 archives.
        !          2128:     rm -f ark[1-9]isdone
        !          2129: else
        !          2130:     echo You still need to unpack the following archives:
        !          2131:     echo "        " ${MISSING}
        !          2132: fi
        !          2133: ##  End of shell archive.
        !          2134: exit 0
        !          2135: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.