Annotation of coherent/d/usr/bin/pax/public/part04.sh, revision 1.1.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 4 (of 6)."
                      7: # Contents:  extract.c list.c pax.1
                      8: # Wrapped by mark@jhereg on Tue Dec 27 19:37:53 1988
                      9: PATH=/bin:/usr/bin:/usr/ucb ; export PATH
                     10: if test -f extract.c -a "${1}" != "-c" ; then 
                     11:   echo shar: Will not over-write existing file \"extract.c\"
                     12: else
                     13: echo shar: Extracting \"extract.c\" \(14327 characters\)
                     14: sed "s/^X//" >extract.c <<'END_OF_extract.c'
                     15: X/* $Source: /u/mark/src/pax/RCS/extract.c,v $
                     16: X *
                     17: X * $Revision: 1.1 $
                     18: X *
                     19: X * extract.c - Extract files from a tar archive. 
                     20: X *
                     21: X * DESCRIPTION
                     22: X *
                     23: X * AUTHOR
                     24: X *
                     25: X *    Mark H. Colburn, NAPS International ([email protected])
                     26: X *
                     27: X * Sponsored by The USENIX Association for public distribution. 
                     28: X *
                     29: X * Copyright (c) 1989 Mark H. Colburn.
                     30: X * All rights reserved.
                     31: X *
                     32: X * Redistribution and use in source and binary forms are permitted
                     33: X * provided that the above copyright notice is duplicated in all such 
                     34: X * forms and that any documentation, advertising materials, and other 
                     35: X * materials related to such distribution and use acknowledge that the 
                     36: X * software was developed * by Mark H. Colburn and sponsored by The 
                     37: X * USENIX Association. 
                     38: X *
                     39: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     40: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     41: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     42: X *
                     43: X * $Log:      extract.c,v $
                     44: X * Revision 1.1  88/12/23  18:02:07  mark
                     45: X * Initial revision
                     46: X * 
                     47: X */
                     48: X
                     49: X#ifndef lint
                     50: Xstatic char *ident = "$Id: extract.c,v 1.1 88/12/23 18:02:07 mark Rel $";
                     51: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
                     52: X#endif /* ! lint */
                     53: X
                     54: X
                     55: X/* Headers */
                     56: X
                     57: X#include "pax.h"
                     58: X
                     59: X
                     60: X/* Defines */
                     61: X
                     62: X/*
                     63: X * Swap bytes. 
                     64: X */
                     65: X#define       SWAB(n) ((((ushort)(n) >> 8) & 0xff) | (((ushort)(n) & 0xff00)) << 8)
                     66: X
                     67: X
                     68: X/* Function Prototypes */
                     69: X
                     70: X#ifdef __STDC__
                     71: X
                     72: Xstatic int inbinary(char *, char *, Stat *);
                     73: Xstatic int inascii(char *, char *, Stat *);
                     74: Xstatic int inswab(char *, char *, Stat *);
                     75: Xstatic int readtar(char *, Stat *);
                     76: Xstatic int readcpio(char *, Stat *);
                     77: X
                     78: X#else /* !__STDC__ */
                     79: X
                     80: Xstatic int inbinary();
                     81: Xstatic int inascii();
                     82: Xstatic int inswab();
                     83: Xstatic int readtar();
                     84: Xstatic int readcpio();
                     85: X
                     86: X#endif /* __STDC__ */
                     87: X
                     88: X
                     89: X/* read_archive - read in an archive
                     90: X *
                     91: X * DESCRIPTION
                     92: X *
                     93: X *    Read_archive is the central entry point for reading archives.
                     94: X *    Read_archive determines the proper archive functions to call
                     95: X *    based upon the archive type being processed.
                     96: X *
                     97: X * RETURNS
                     98: X *
                     99: X */
                    100: X
                    101: X#ifdef __STDC__
                    102: X
                    103: Xint read_archive(void)
                    104: X
                    105: X#else
                    106: X    
                    107: Xint read_archive()
                    108: X
                    109: X#endif
                    110: X{
                    111: X    Stat            sb;
                    112: X    char            name[PATH_MAX + 1];
                    113: X    int             match;
                    114: X    int                   pad;
                    115: X
                    116: X    name_gather();            /* get names from command line */
                    117: X    name[0] = '\0';
                    118: X    while (get_header(name, &sb) == 0) {
                    119: X      match = name_match(name) ^ f_reverse_match;
                    120: X      if (f_list) {           /* only wanted a table of contents */
                    121: X          if (match) {
                    122: X              print_entry(name, &sb);
                    123: X          }
                    124: X          if (((ar_format == TAR) 
                    125: X              ? buf_skip(ROUNDUP((OFFSET) sb.sb_size, BLOCKSIZE)) 
                    126: X              : buf_skip((OFFSET) sb.sb_size)) < 0) {
                    127: X              warn(name, "File data is corrupt");
                    128: X          }
                    129: X      } else if (match) {
                    130: X          if (rplhead != NULL) {
                    131: X              rpl_name(name);
                    132: X              if (strlen(name) == 0) {
                    133: X                  continue;
                    134: X              }
                    135: X          }
                    136: X          if (get_disposition("extract", name) || 
                    137: X                get_newname(name, sizeof(name))) {
                    138: X              /* skip file... */
                    139: X              if (((ar_format == TAR) 
                    140: X                  ? buf_skip(ROUNDUP((OFFSET) sb.sb_size, BLOCKSIZE)) 
                    141: X                  : buf_skip((OFFSET) sb.sb_size)) < 0) {
                    142: X                  warn(name, "File data is corrupt");
                    143: X              }
                    144: X              continue;
                    145: X          } 
                    146: X          if (inentry(name, &sb) < 0) {
                    147: X              warn(name, "File data is corrupt");
                    148: X          }
                    149: X          if (f_verbose) {
                    150: X              print_entry(name, &sb);
                    151: X          }
                    152: X          if (ar_format == TAR && sb.sb_nlink > 1) {
                    153: X              /*
                    154: X               * This kludge makes sure that the link table is cleared
                    155: X               * before attempting to process any other links.
                    156: X               */
                    157: X              if (sb.sb_nlink > 1) {
                    158: X                  linkfrom(name, &sb);
                    159: X              }
                    160: X          }
                    161: X          if (ar_format == TAR && (pad = sb.sb_size % BLOCKSIZE) != 0) {
                    162: X              pad = BLOCKSIZE - pad;
                    163: X              buf_skip((OFFSET) pad);
                    164: X          }
                    165: X      } else {
                    166: X          if (((ar_format == TAR) 
                    167: X              ? buf_skip(ROUNDUP((OFFSET) sb.sb_size, BLOCKSIZE)) 
                    168: X              : buf_skip((OFFSET) sb.sb_size)) < 0) {
                    169: X              warn(name, "File data is corrupt");
                    170: X          }
                    171: X      }
                    172: X    }
                    173: X
                    174: X    close_archive();
                    175: X}
                    176: X
                    177: X
                    178: X
                    179: X/* get_header - figures which type of header needs to be read.
                    180: X *
                    181: X * DESCRIPTION
                    182: X *
                    183: X *    This is merely a single entry point for the two types of archive
                    184: X *    headers which are supported.  The correct header is selected
                    185: X *    depending on the archive type.
                    186: X *
                    187: X * PARAMETERS
                    188: X *
                    189: X *    char    *name   - name of the file (passed to header routine)
                    190: X *    Stat    *asb    - Stat block for the file (passed to header routine)
                    191: X *
                    192: X * RETURNS
                    193: X *
                    194: X *    Returns the value which was returned by the proper header
                    195: X *    function.
                    196: X */
                    197: X
                    198: X#ifdef __STDC__
                    199: X
                    200: Xint get_header(char *name, Stat *asb)
                    201: X
                    202: X#else
                    203: X    
                    204: Xint get_header(name, asb)
                    205: Xchar *name;
                    206: XStat *asb;
                    207: X
                    208: X#endif
                    209: X{
                    210: X    if (ar_format == TAR) {
                    211: X      return(readtar(name, asb));
                    212: X    } else {
                    213: X      return(readcpio(name, asb));
                    214: X    }
                    215: X}
                    216: X
                    217: X
                    218: X/* readtar - read a tar header
                    219: X *
                    220: X * DESCRIPTION
                    221: X *
                    222: X *    Tar_head read a tar format header from the archive.  The name
                    223: X *    and asb parameters are modified as appropriate for the file listed
                    224: X *    in the header.   Name is assumed to be a pointer to an array of
                    225: X *    at least PATH_MAX bytes.
                    226: X *
                    227: X * PARAMETERS
                    228: X *
                    229: X *    char    *name   - name of the file for which the header is
                    230: X *                      for.  This is modified and passed back to
                    231: X *                      the caller.
                    232: X *    Stat    *asb    - Stat block for the file for which the header
                    233: X *                      is for.  The fields of the stat structure are
                    234: X *                      extracted from the archive header.  This is
                    235: X *                      also passed back to the caller.
                    236: X *
                    237: X * RETURNS
                    238: X *
                    239: X *    Returns 0 if a valid header was found, or -1 if EOF is
                    240: X *    encountered.
                    241: X */
                    242: X
                    243: X#ifdef __STDC__
                    244: X
                    245: Xstatic int readtar(char *name, Stat *asb)
                    246: X
                    247: X#else
                    248: X    
                    249: Xstatic int readtar(name, asb)
                    250: Xchar  *name;
                    251: XStat    *asb;
                    252: X
                    253: X#endif
                    254: X{
                    255: X    int             status = 3;       /* Initial status at start of archive */
                    256: X    static int      prev_status;
                    257: X
                    258: X    for (;;) {
                    259: X      prev_status = status;
                    260: X      status = read_header(name, asb);
                    261: X      switch (status) {
                    262: X      case 1:         /* Valid header */
                    263: X              return(0);
                    264: X      case 0:         /* Invalid header */
                    265: X          switch (prev_status) {
                    266: X          case 3:             /* Error on first record */
                    267: X              warn(ar_file, "This doesn't look like a tar archive");
                    268: X              /* FALLTHRU */
                    269: X          case 2:             /* Error after record of zeroes */
                    270: X          case 1:             /* Error after header rec */
                    271: X              warn(ar_file, "Skipping to next file...");
                    272: X              /* FALLTHRU */
                    273: X          default:
                    274: X          case 0:             /* Error after error */
                    275: X              break;
                    276: X          }
                    277: X          break;
                    278: X
                    279: X      case 2:                 /* Record of zeroes */
                    280: X      case EOF:               /* End of archive */
                    281: X      default:
                    282: X          return(-1);
                    283: X      }
                    284: X    }
                    285: X}
                    286: X
                    287: X
                    288: X/* readcpio - read a CPIO header 
                    289: X *
                    290: X * DESCRIPTION
                    291: X *
                    292: X *    Read in a cpio header.  Understands how to determine and read ASCII, 
                    293: X *    binary and byte-swapped binary headers.  Quietly translates 
                    294: X *    old-fashioned binary cpio headers (and arranges to skip the possible 
                    295: X *    alignment byte). Returns zero if successful, -1 upon archive trailer. 
                    296: X *
                    297: X * PARAMETERS
                    298: X *
                    299: X *    char    *name   - name of the file for which the header is
                    300: X *                      for.  This is modified and passed back to
                    301: X *                      the caller.
                    302: X *    Stat    *asb    - Stat block for the file for which the header
                    303: X *                      is for.  The fields of the stat structure are
                    304: X *                      extracted from the archive header.  This is
                    305: X *                      also passed back to the caller.
                    306: X *
                    307: X * RETURNS
                    308: X *
                    309: X *    Returns 0 if a valid header was found, or -1 if EOF is
                    310: X *    encountered.
                    311: X */
                    312: X
                    313: X#ifdef __STDC__
                    314: X
                    315: Xstatic int readcpio(char *name, Stat *asb)
                    316: X
                    317: X#else
                    318: X    
                    319: Xstatic int readcpio(name, asb)
                    320: Xchar           *name;
                    321: XStat           *asb;
                    322: X
                    323: X#endif
                    324: X{
                    325: X    OFFSET          skipped;
                    326: X    char            magic[M_STRLEN];
                    327: X    static int      align;
                    328: X
                    329: X    if (align > 0) {
                    330: X      buf_skip((OFFSET) align);
                    331: X    }
                    332: X    align = 0;
                    333: X    for (;;) {
                    334: X      buf_read(magic, M_STRLEN);
                    335: X      skipped = 0;
                    336: X      while ((align = inascii(magic, name, asb)) < 0
                    337: X             && (align = inbinary(magic, name, asb)) < 0
                    338: X             && (align = inswab(magic, name, asb)) < 0) {
                    339: X          if (++skipped == 1) {
                    340: X              if (total - sizeof(magic) == 0) {
                    341: X                  fatal("Unrecognizable archive");
                    342: X              }
                    343: X              warnarch("Bad magic number", (OFFSET) sizeof(magic));
                    344: X              if (name[0]) {
                    345: X                  warn(name, "May be corrupt");
                    346: X              }
                    347: X          }
                    348: X          memcpy(magic, magic + 1, sizeof(magic) - 1);
                    349: X          buf_read(magic + sizeof(magic) - 1, 1);
                    350: X      }
                    351: X      if (skipped) {
                    352: X          warnarch("Apparently resynchronized", (OFFSET) sizeof(magic));
                    353: X          warn(name, "Continuing");
                    354: X      }
                    355: X      if (strcmp(name, TRAILER) == 0) {
                    356: X          return (-1);
                    357: X      }
                    358: X      if (nameopt(name) >= 0) {
                    359: X          break;
                    360: X      }
                    361: X      buf_skip((OFFSET) asb->sb_size + align);
                    362: X    }
                    363: X#ifdef        S_IFLNK
                    364: X    if ((asb->sb_mode & S_IFMT) == S_IFLNK) {
                    365: X      if (buf_read(asb->sb_link, (uint) asb->sb_size) < 0) {
                    366: X          warn(name, "Corrupt symbolic link");
                    367: X          return (readcpio(name, asb));
                    368: X      }
                    369: X      asb->sb_link[asb->sb_size] = '\0';
                    370: X      asb->sb_size = 0;
                    371: X    }
                    372: X#endif                                /* S_IFLNK */
                    373: X
                    374: X    /* destroy absolute pathnames for security reasons */
                    375: X    if (name[0] == '/') {
                    376: X      if (name[1]) {
                    377: X          while (name[0] = name[1]) {
                    378: X              ++name;
                    379: X          }
                    380: X      } else {
                    381: X          name[0] = '.';
                    382: X      }
                    383: X    }
                    384: X    asb->sb_atime = asb->sb_ctime = asb->sb_mtime;
                    385: X    if (asb->sb_nlink > 1) {
                    386: X      linkto(name, asb);
                    387: X    }
                    388: X    return (0);
                    389: X}
                    390: X
                    391: X
                    392: X/* inswab - read a reversed by order binary header
                    393: X *
                    394: X * DESCRIPTIONS
                    395: X *
                    396: X *    Reads a byte-swapped CPIO binary archive header
                    397: X *
                    398: X * PARMAMETERS
                    399: X *
                    400: X *    char    *magic  - magic number to match
                    401: X *    char    *name   - name of the file which is stored in the header.
                    402: X *                      (modified and passed back to caller).
                    403: X *    Stat    *asb    - stat block for the file (modified and passed back
                    404: X *                      to the caller).
                    405: X *
                    406: X *
                    407: X * RETURNS
                    408: X *
                    409: X *    Returns the number of trailing alignment bytes to skip; -1 if 
                    410: X *    unsuccessful. 
                    411: X *
                    412: X */
                    413: X
                    414: X#ifdef __STDC__
                    415: X
                    416: Xstatic int inswab(char *magic, char *name, Stat *asb)
                    417: X
                    418: X#else
                    419: X    
                    420: Xstatic int inswab(magic, name, asb)
                    421: Xchar           *magic;
                    422: Xchar           *name;
                    423: XStat           *asb;
                    424: X
                    425: X#endif
                    426: X{
                    427: X    ushort          namesize;
                    428: X    uint            namefull;
                    429: X    Binary          binary;
                    430: X
                    431: X    if (*((ushort *) magic) != SWAB(M_BINARY)) {
                    432: X      return (-1);
                    433: X    }
                    434: X    memcpy((char *) &binary,
                    435: X                magic + sizeof(ushort),
                    436: X                M_STRLEN - sizeof(ushort));
                    437: X    if (buf_read((char *) &binary + M_STRLEN - sizeof(ushort),
                    438: X               sizeof(binary) - (M_STRLEN - sizeof(ushort))) < 0) {
                    439: X      warnarch("Corrupt swapped header",
                    440: X               (OFFSET) sizeof(binary) - (M_STRLEN - sizeof(ushort)));
                    441: X      return (-1);
                    442: X    }
                    443: X    asb->sb_dev = (dev_t) SWAB(binary.b_dev);
                    444: X    asb->sb_ino = (ino_t) SWAB(binary.b_ino);
                    445: X    asb->sb_mode = SWAB(binary.b_mode);
                    446: X    asb->sb_uid = SWAB(binary.b_uid);
                    447: X    asb->sb_gid = SWAB(binary.b_gid);
                    448: X    asb->sb_nlink = SWAB(binary.b_nlink);
                    449: X    asb->sb_rdev = (dev_t) SWAB(binary.b_rdev);
                    450: X    asb->sb_mtime = SWAB(binary.b_mtime[0]) | SWAB(binary.b_mtime[1]); << 16
                    451: X    asb->sb_size = SWAB(binary.b_size[0]) | SWAB(binary.b_size[1]); << 16
                    452: X    if ((namesize = SWAB(binary.b_name)) == 0 || namesize >= PATH_MAX) {
                    453: X      warnarch("Bad swapped pathname length",
                    454: X               (OFFSET) sizeof(binary) - (M_STRLEN - sizeof(ushort)));
                    455: X      return (-1);
                    456: X    }
                    457: X    if (buf_read(name, namefull = namesize + namesize % 2) < 0) {
                    458: X      warnarch("Corrupt swapped pathname", (OFFSET) namefull);
                    459: X      return (-1);
                    460: X    }
                    461: X    if (name[namesize - 1] != '\0') {
                    462: X      warnarch("Bad swapped pathname", (OFFSET) namefull);
                    463: X      return (-1);
                    464: X    }
                    465: X    return (asb->sb_size % 2);
                    466: X}
                    467: X
                    468: X
                    469: X/* inascii - read in an ASCII cpio header
                    470: X *
                    471: X * DESCRIPTION
                    472: X *
                    473: X *    Reads an ASCII format cpio header
                    474: X *
                    475: X * PARAMETERS
                    476: X *
                    477: X *    char    *magic  - magic number to match
                    478: X *    char    *name   - name of the file which is stored in the header.
                    479: X *                      (modified and passed back to caller).
                    480: X *    Stat    *asb    - stat block for the file (modified and passed back
                    481: X *                      to the caller).
                    482: X *
                    483: X * RETURNS
                    484: X *
                    485: X *    Returns zero if successful; -1 otherwise. Assumes that  the entire 
                    486: X *    magic number has been read. 
                    487: X */
                    488: X
                    489: X#ifdef __STDC__
                    490: X
                    491: Xstatic int inascii(char *magic, char *name, Stat *asb)
                    492: X
                    493: X#else
                    494: X    
                    495: Xstatic int inascii(magic, name, asb)
                    496: Xchar           *magic;
                    497: Xchar           *name;
                    498: XStat           *asb;
                    499: X
                    500: X#endif
                    501: X{
                    502: X    uint            namelen;
                    503: X    char            header[H_STRLEN + 1];
                    504: X
                    505: X    if (strncmp(magic, M_ASCII, M_STRLEN) != 0) {
                    506: X      return (-1);
                    507: X    }
                    508: X    if (buf_read(header, H_STRLEN) < 0) {
                    509: X      warnarch("Corrupt ASCII header", (OFFSET) H_STRLEN);
                    510: X      return (-1);
                    511: X    }
                    512: X    header[H_STRLEN] = '\0';
                    513: X    if (sscanf(header, H_SCAN, &asb->sb_dev,
                    514: X             &asb->sb_ino, &asb->sb_mode, &asb->sb_uid,
                    515: X             &asb->sb_gid, &asb->sb_nlink, &asb->sb_rdev,
                    516: X             &asb->sb_mtime, &namelen, &asb->sb_size) != H_COUNT) {
                    517: X      warnarch("Bad ASCII header", (OFFSET) H_STRLEN);
                    518: X      return (-1);
                    519: X    }
                    520: X    if (namelen == 0 || namelen >= PATH_MAX) {
                    521: X      warnarch("Bad ASCII pathname length", (OFFSET) H_STRLEN);
                    522: X      return (-1);
                    523: X    }
                    524: X    if (buf_read(name, namelen) < 0) {
                    525: X      warnarch("Corrupt ASCII pathname", (OFFSET) namelen);
                    526: X      return (-1);
                    527: X    }
                    528: X    if (name[namelen - 1] != '\0') {
                    529: X      warnarch("Bad ASCII pathname", (OFFSET) namelen);
                    530: X      return (-1);
                    531: X    }
                    532: X    return (0);
                    533: X}
                    534: X
                    535: X
                    536: X/* inbinary - read a binary header
                    537: X *
                    538: X * DESCRIPTION
                    539: X *
                    540: X *    Reads a CPIO format binary header.
                    541: X *
                    542: X * PARAMETERS
                    543: X *
                    544: X *    char    *magic  - magic number to match
                    545: X *    char    *name   - name of the file which is stored in the header.
                    546: X *                      (modified and passed back to caller).
                    547: X *    Stat    *asb    - stat block for the file (modified and passed back
                    548: X *                      to the caller).
                    549: X *
                    550: X * RETURNS
                    551: X *
                    552: X *    Returns the number of trailing alignment bytes to skip; -1 if 
                    553: X *    unsuccessful. 
                    554: X */
                    555: X
                    556: X#ifdef __STDC__
                    557: X
                    558: Xstatic int inbinary(char *magic, char *name, Stat *asb)
                    559: X
                    560: X#else
                    561: X    
                    562: Xstatic int inbinary(magic, name, asb)
                    563: Xchar           *magic;
                    564: Xchar           *name;
                    565: XStat           *asb;
                    566: X
                    567: X#endif
                    568: X{
                    569: X    uint            namefull;
                    570: X    Binary          binary;
                    571: X
                    572: X    if (*((ushort *) magic) != M_BINARY) {
                    573: X      return (-1);
                    574: X    }
                    575: X    memcpy((char *) &binary,
                    576: X                magic + sizeof(ushort),
                    577: X                M_STRLEN - sizeof(ushort));
                    578: X    if (buf_read((char *) &binary + M_STRLEN - sizeof(ushort),
                    579: X               sizeof(binary) - (M_STRLEN - sizeof(ushort))) < 0) {
                    580: X      warnarch("Corrupt binary header",
                    581: X               (OFFSET) sizeof(binary) - (M_STRLEN - sizeof(ushort)));
                    582: X      return (-1);
                    583: X    }
                    584: X    asb->sb_dev = binary.b_dev;
                    585: X    asb->sb_ino = binary.b_ino;
                    586: X    asb->sb_mode = binary.b_mode;
                    587: X    asb->sb_uid = binary.b_uid;
                    588: X    asb->sb_gid = binary.b_gid;
                    589: X    asb->sb_nlink = binary.b_nlink;
                    590: X    asb->sb_rdev = binary.b_rdev;
                    591: X    asb->sb_mtime = binary.b_mtime[0] | binary.b_mtime[1]; << 16
                    592: X    asb->sb_size = binary.b_size[0] | binary.b_size[1]; << 16
                    593: X    if (binary.b_name == 0 || binary.b_name >= PATH_MAX) {
                    594: X      warnarch("Bad binary pathname length",
                    595: X               (OFFSET) sizeof(binary) - (M_STRLEN - sizeof(ushort)));
                    596: X      return (-1);
                    597: X    }
                    598: X    if (buf_read(name, namefull = binary.b_name + binary.b_name % 2) < 0) {
                    599: X      warnarch("Corrupt binary pathname", (OFFSET) namefull);
                    600: X      return (-1);
                    601: X    }
                    602: X    if (name[binary.b_name - 1] != '\0') {
                    603: X      warnarch("Bad binary pathname", (OFFSET) namefull);
                    604: X      return (-1);
                    605: X    }
                    606: X    return (asb->sb_size % 2);
                    607: X}
                    608: END_OF_extract.c
                    609: if test 14327 -ne `wc -c <extract.c`; then
                    610:     echo shar: \"extract.c\" unpacked with wrong size!
                    611: fi
                    612: # end of overwriting check
                    613: fi
                    614: if test -f list.c -a "${1}" != "-c" ; then 
                    615:   echo shar: Will not over-write existing file \"list.c\"
                    616: else
                    617: echo shar: Extracting \"list.c\" \(16229 characters\)
                    618: sed "s/^X//" >list.c <<'END_OF_list.c'
                    619: X/* $Source: /u/mark/src/pax/RCS/list.c,v $
                    620: X *
                    621: X * $Revision: 1.1 $
                    622: X *
                    623: X * list.c - List all files on an archive
                    624: X *
                    625: X * DESCRIPTION
                    626: X *
                    627: X *    These function are needed to support archive table of contents and
                    628: X *    verbose mode during extraction and creation of achives.
                    629: X *
                    630: X * AUTHOR
                    631: X *
                    632: X *    Mark H. Colburn, NAPS International ([email protected])
                    633: X *
                    634: X * Sponsored by The USENIX Association for public distribution. 
                    635: X *
                    636: X * Copyright (c) 1989 Mark H. Colburn.
                    637: X * All rights reserved.
                    638: X *
                    639: X * Redistribution and use in source and binary forms are permitted
                    640: X * provided that the above copyright notice is duplicated in all such 
                    641: X * forms and that any documentation, advertising materials, and other 
                    642: X * materials related to such distribution and use acknowledge that the 
                    643: X * software was developed * by Mark H. Colburn and sponsored by The 
                    644: X * USENIX Association. 
                    645: X *
                    646: X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                    647: X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                    648: X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                    649: X *
                    650: X * $Log:      list.c,v $
                    651: X * Revision 1.1  88/12/23  18:02:14  mark
                    652: X * Initial revision
                    653: X * 
                    654: X */
                    655: X
                    656: X#ifndef lint
                    657: Xstatic char *ident = "$Id: list.c,v 1.1 88/12/23 18:02:14 mark Rel $";
                    658: Xstatic char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
                    659: X#endif /* ! lint */
                    660: X
                    661: X
                    662: X/* Headers */
                    663: X
                    664: X#include "pax.h"
                    665: X
                    666: X
                    667: X/* Defines */
                    668: X
                    669: X/*
                    670: X * isodigit returns non zero iff argument is an octal digit, zero otherwise
                    671: X */
                    672: X#define       ISODIGIT(c)     (((c) >= '0') && ((c) <= '7'))
                    673: X
                    674: X
                    675: X/* Function Prototypes */
                    676: X
                    677: X#ifdef __STDC__
                    678: X
                    679: Xstatic void cpio_entry(char *, Stat *);
                    680: Xstatic void tar_entry(char *, Stat *);
                    681: Xstatic void pax_entry(char *, Stat *);
                    682: Xstatic void print_mode(ushort);
                    683: Xstatic long from_oct(int digs, char *where);
                    684: X
                    685: X#else /* !__STDC__ */
                    686: X
                    687: Xstatic void cpio_entry();
                    688: Xstatic void tar_entry();
                    689: Xstatic void pax_entry();
                    690: Xstatic void print_mode();
                    691: Xstatic long from_oct();
                    692: X
                    693: X#endif /* __STDC__ */
                    694: X
                    695: X
                    696: X/* Internal Identifiers */
                    697: X
                    698: Xstatic char       *monnames[] = {
                    699: X    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                    700: X    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
                    701: X};
                    702: X
                    703: X
                    704: X/* read_header - read a header record
                    705: X *
                    706: X * DESCRIPTION
                    707: X *
                    708: X *    Read a record that's supposed to be a header record. Return its 
                    709: X *    address in "head", and if it is good, the file's size in 
                    710: X *    asb->sb_size.  Decode things from a file header record into a "Stat". 
                    711: X *    Also set "head_standard" to !=0 or ==0 depending whether header record 
                    712: X *    is "Unix Standard" tar format or regular old tar format. 
                    713: X *
                    714: X * PARAMETERS
                    715: X *
                    716: X *    char   *name            - pointer which will contain name of file
                    717: X *    Stat   *asb             - pointer which will contain stat info
                    718: X *
                    719: X * RETURNS
                    720: X *
                    721: X *    Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a 
                    722: X *    record full of zeros (EOF marker). 
                    723: X */
                    724: X
                    725: X#ifdef __STDC__
                    726: X
                    727: Xint read_header(char *name, Stat *asb)
                    728: X
                    729: X#else
                    730: X    
                    731: Xint read_header(name, asb)
                    732: Xchar           *name;
                    733: XStat           *asb;
                    734: X
                    735: X#endif
                    736: X{
                    737: X    int             i;
                    738: X    long            sum;
                    739: X    long          recsum;
                    740: X    Link           *link;
                    741: X    char           *p;
                    742: X    char            hdrbuf[BLOCKSIZE];
                    743: X
                    744: X    memset((char *)asb, 0, sizeof(Stat));
                    745: X    /* read the header from the buffer */
                    746: X    if (buf_read(hdrbuf, BLOCKSIZE) != 0) {
                    747: X      return (EOF);
                    748: X    }
                    749: X
                    750: X    strcpy(name, hdrbuf);
                    751: X
                    752: X    recsum = from_oct(8, &hdrbuf[148]);
                    753: X    sum = 0;
                    754: X    p = hdrbuf;
                    755: X    for (i = 0 ; i < 500; i++) {
                    756: X
                    757: X      /*
                    758: X       * We can't use unsigned char here because of old compilers, e.g. V7. 
                    759: X       */
                    760: X      sum += 0xFF & *p++;
                    761: X    }
                    762: X
                    763: X    /* Adjust checksum to count the "chksum" field as blanks. */
                    764: X    for (i = 0; i < 8; i++) {
                    765: X      sum -= 0xFF & hdrbuf[148 + i];
                    766: X    }
                    767: X    sum += ' ' * 8;
                    768: X
                    769: X    if (sum == 8 * ' ') {
                    770: X
                    771: X      /*
                    772: X       * This is a zeroed record...whole record is 0's except for the 8
                    773: X       * blanks we faked for the checksum field. 
                    774: X       */
                    775: X      return (2);
                    776: X    }
                    777: X    if (sum == recsum) {
                    778: X      /*
                    779: X       * Good record.  Decode file size and return. 
                    780: X       */
                    781: X      if (hdrbuf[156] != LNKTYPE) {
                    782: X          asb->sb_size = from_oct(1 + 12, &hdrbuf[124]);
                    783: X      }
                    784: X      asb->sb_mtime = from_oct(1 + 12, &hdrbuf[136]);
                    785: X      asb->sb_mode = from_oct(8, &hdrbuf[100]);
                    786: X
                    787: X      if (strcmp(&hdrbuf[257], TMAGIC) == 0) {
                    788: X          /* Unix Standard tar archive */
                    789: X          head_standard = 1;
                    790: X#ifdef NONAMES
                    791: X          asb->sb_uid = from_oct(8, &hdrbuf[108]);
                    792: X          asb->sb_gid = from_oct(8, &hdrbuf[116]);
                    793: X#else
                    794: X          asb->sb_uid = finduid(&hdrbuf[265]);
                    795: X          asb->sb_gid = findgid(&hdrbuf[297]);
                    796: X#endif
                    797: X          switch (hdrbuf[156]) {
                    798: X          case BLKTYPE:
                    799: X          case CHRTYPE:
                    800: X              asb->sb_rdev = makedev(from_oct(8, &hdrbuf[329]),
                    801: X                                    from_oct(8, &hdrbuf[337]));
                    802: X              break;
                    803: X          default:
                    804: X              /* do nothing... */
                    805: X              break;
                    806: X          }
                    807: X      } else {
                    808: X          /* Old fashioned tar archive */
                    809: X          head_standard = 0;
                    810: X          asb->sb_uid = from_oct(8, &hdrbuf[108]);
                    811: X          asb->sb_gid = from_oct(8, &hdrbuf[116]);
                    812: X      }
                    813: X
                    814: X      switch (hdrbuf[156]) {
                    815: X      case REGTYPE:
                    816: X      case AREGTYPE:
                    817: X          /*
                    818: X           * Berkeley tar stores directories as regular files with a
                    819: X           * trailing /
                    820: X           */
                    821: X          if (name[strlen(name) - 1] == '/') {
                    822: X              name[strlen(name) - 1] = '\0';
                    823: X              asb->sb_mode |= S_IFDIR;
                    824: X          } else {
                    825: X              asb->sb_mode |= S_IFREG;
                    826: X          }
                    827: X          break;
                    828: X      case LNKTYPE:
                    829: X          asb->sb_nlink = 2;
                    830: X          linkto(&hdrbuf[157], asb);
                    831: X          linkto(name, asb);
                    832: X          asb->sb_mode |= S_IFREG;
                    833: X          break;
                    834: X      case BLKTYPE:
                    835: X          asb->sb_mode |= S_IFBLK;
                    836: X          break;
                    837: X      case CHRTYPE:
                    838: X          asb->sb_mode |= S_IFCHR;
                    839: X          break;
                    840: X      case DIRTYPE:
                    841: X          asb->sb_mode |= S_IFDIR;
                    842: X          break;
                    843: X#ifdef S_IFLNK
                    844: X      case SYMTYPE:
                    845: X          asb->sb_mode |= S_IFLNK;
                    846: X          strcpy(asb->sb_link, &hdrbuf[157]);
                    847: X          break;
                    848: X#endif
                    849: X#ifdef S_IFIFO
                    850: X      case FIFOTYPE:
                    851: X          asb->sb_mode |= S_IFIFO;
                    852: X          break;
                    853: X#endif
                    854: X#ifdef S_IFCTG
                    855: X      case CONTTYPE:
                    856: X          asb->sb_mode |= S_IFCTG;
                    857: X          break;
                    858: X#endif
                    859: X      }
                    860: X      return (1);
                    861: X    }
                    862: X    return (0);
                    863: X}
                    864: X
                    865: X
                    866: X/* print_entry - print a single table-of-contents entry
                    867: X *
                    868: X * DESCRIPTION
                    869: X * 
                    870: X *    Print_entry prints a single line of file information.  The format
                    871: X *    of the line is the same as that used by the LS command.  For some
                    872: X *    archive formats, various fields may not make any sense, such as
                    873: X *    the link count on tar archives.  No error checking is done for bad
                    874: X *    or invalid data.
                    875: X *
                    876: X * PARAMETERS
                    877: X *
                    878: X *    char   *name            - pointer to name to print an entry for
                    879: X *    Stat   *asb             - pointer to the stat structure for the file
                    880: X */
                    881: X
                    882: X#ifdef __STDC__
                    883: X
                    884: Xvoid print_entry(char *name, Stat *asb)
                    885: X
                    886: X#else
                    887: X    
                    888: Xvoid print_entry(name, asb)
                    889: Xchar          *name;
                    890: XStat          *asb;
                    891: X
                    892: X#endif
                    893: X{
                    894: X    switch (ar_interface) {
                    895: X    case TAR:
                    896: X      tar_entry(name, asb);
                    897: X      break;
                    898: X    case CPIO:
                    899: X      cpio_entry(name, asb);
                    900: X      break;
                    901: X    case PAX: pax_entry(name, asb);
                    902: X      break;
                    903: X    }
                    904: X}
                    905: X
                    906: X
                    907: X/* cpio_entry - print a verbose cpio-style entry
                    908: X *
                    909: X * DESCRIPTION
                    910: X *
                    911: X *    Print_entry prints a single line of file information.  The format
                    912: X *    of the line is the same as that used by the traditional cpio 
                    913: X *    command.  No error checking is done for bad or invalid data.
                    914: X *
                    915: X * PARAMETERS
                    916: X *
                    917: X *    char   *name            - pointer to name to print an entry for
                    918: X *    Stat   *asb             - pointer to the stat structure for the file
                    919: X */
                    920: X
                    921: X#ifdef __STDC__
                    922: X
                    923: Xstatic void cpio_entry(char *name, Stat *asb)
                    924: X
                    925: X#else
                    926: X    
                    927: Xstatic void cpio_entry(name, asb)
                    928: Xchar         *name;
                    929: XStat         *asb;
                    930: X
                    931: X#endif
                    932: X{
                    933: X    struct tm        *atm;
                    934: X    Link             *from;
                    935: X    struct passwd      *pwp;
                    936: X    struct group       *grp;
                    937: X
                    938: X    if (f_list && f_verbose) {
                    939: X      fprintf(msgfile, "%-7o", asb->sb_mode);
                    940: X      atm = localtime(&asb->sb_mtime);
                    941: X      if (pwp = getpwuid((int) USH(asb->sb_uid))) {
                    942: X          fprintf(msgfile, "%-6s", pwp->pw_name);
                    943: X      } else {
                    944: X          fprintf(msgfile, "%-6u", USH(asb->sb_uid));
                    945: X      }
                    946: X      fprintf(msgfile,"%7ld  %3s %2d %02d:%02d:%02d %4d  ",
                    947: X                     asb->sb_size, monnames[atm->tm_mon], 
                    948: X                     atm->tm_mday, atm->tm_hour, atm->tm_min, 
                    949: X                     atm->tm_sec, atm->tm_year + 1900);
                    950: X    }
                    951: X    fprintf(msgfile, "%s", name);
                    952: X    if ((asb->sb_nlink > 1) && (from = islink(name, asb))) {
                    953: X      fprintf(msgfile, " linked to %s", from->l_name);
                    954: X    }
                    955: X#ifdef        S_IFLNK
                    956: X    if ((asb->sb_mode & S_IFMT) == S_IFLNK) {
                    957: X      fprintf(msgfile, " symbolic link to %s", asb->sb_link);
                    958: X    }
                    959: X#endif        /* S_IFLNK */
                    960: X    putc('\n', msgfile);
                    961: X}
                    962: X
                    963: X
                    964: X/* tar_entry - print a tar verbose mode entry
                    965: X *
                    966: X * DESCRIPTION
                    967: X *
                    968: X *    Print_entry prints a single line of tar file information.  The format
                    969: X *    of the line is the same as that produced by the traditional tar 
                    970: X *    command.  No error checking is done for bad or invalid data.
                    971: X *
                    972: X * PARAMETERS
                    973: X *
                    974: X *    char   *name            - pointer to name to print an entry for
                    975: X *    Stat   *asb             - pointer to the stat structure for the file
                    976: X */
                    977: X
                    978: X#ifdef __STDC__
                    979: X
                    980: Xstatic void tar_entry(char *name, Stat *asb)
                    981: X
                    982: X#else
                    983: X    
                    984: Xstatic void tar_entry(name, asb)
                    985: Xchar          *name;
                    986: XStat            *asb;
                    987: X
                    988: X#endif
                    989: X{
                    990: X    struct tm                *atm;
                    991: X    int                       i;
                    992: X    int                       mode;
                    993: X    char               *symnam = "NULL";
                    994: X    Link               *link;
                    995: X
                    996: X    if ((mode = asb->sb_mode & S_IFMT) == S_IFDIR) {
                    997: X      return;                 /* don't print directories */
                    998: X    }
                    999: X    if (f_extract) {
                   1000: X      switch (mode) {
                   1001: X#ifdef S_IFLNK
                   1002: X      case S_IFLNK:   /* This file is a symbolic link */
                   1003: X          i = readlink(name, symnam, PATH_MAX - 1);
                   1004: X          if (i < 0) {                /* Could not find symbolic link */
                   1005: X              warn("can't read symbolic link", syserr());
                   1006: X          } else {            /* Found symbolic link filename */
                   1007: X              symnam[i] = '\0';
                   1008: X              fprintf(msgfile, "x %s symbolic link to %s\n", name, symnam);
                   1009: X          }
                   1010: X          break;
                   1011: X#endif
                   1012: X      case S_IFREG:   /* It is a link or a file */
                   1013: X          if ((asb->sb_nlink > 1) && (link = islink(name, asb))) {
                   1014: X              fprintf(msgfile, "%s linked to %s\n", name, link->l_name); 
                   1015: X          } else {
                   1016: X              fprintf(msgfile, "x %s, %d bytes, %d tape blocks\n", 
                   1017: X                      name, asb->sb_size, ROUNDUP(asb->sb_size, 
                   1018: X                      BLOCKSIZE) / BLOCKSIZE);
                   1019: X          }
                   1020: X      }
                   1021: X    } else if (f_append || f_create) {
                   1022: X      switch (mode) {
                   1023: X#ifdef S_IFLNK
                   1024: X      case S_IFLNK:   /* This file is a symbolic link */
                   1025: X          i = readlink(name, symnam, PATH_MAX - 1);
                   1026: X          if (i < 0) {                /* Could not find symbolic link */
                   1027: X              warn("can't read symbolic link", syserr());
                   1028: X          } else {            /* Found symbolic link filename */
                   1029: X              symnam[i] = '\0';
                   1030: X              fprintf(msgfile, "a %s symbolic link to %s\n", name, symnam);
                   1031: X          }
                   1032: X          break;
                   1033: X#endif
                   1034: X      case S_IFREG:   /* It is a link or a file */
                   1035: X          fprintf(msgfile, "a %s ", name);
                   1036: X          if ((asb->sb_nlink > 1) && (link = islink(name, asb))) {
                   1037: X              fprintf(msgfile, "link to %s\n", link->l_name); 
                   1038: X          } else {
                   1039: X              fprintf(msgfile, "%d Blocks\n", 
                   1040: X                      ROUNDUP(asb->sb_size, BLOCKSIZE) / BLOCKSIZE);
                   1041: X          }
                   1042: X          break;
                   1043: X      }
                   1044: X    } else if (f_list) {
                   1045: X      if (f_verbose) {
                   1046: X          atm = localtime(&asb->sb_mtime);
                   1047: X          print_mode(asb->sb_mode);
                   1048: X          fprintf(msgfile," %d/%d %6d %3s %2d %02d:%02d %4d %s",
                   1049: X                  asb->sb_uid, asb->sb_gid, asb->sb_size,
                   1050: X                  monnames[atm->tm_mon], atm->tm_mday, atm->tm_hour, 
                   1051: X                  atm->tm_min, atm->tm_year + 1900, name);
                   1052: X      } else {
                   1053: X          fprintf(msgfile, "%s", name);
                   1054: X      }
                   1055: X      switch (mode) {
                   1056: X#ifdef S_IFLNK
                   1057: X      case S_IFLNK:   /* This file is a symbolic link */
                   1058: X          i = readlink(name, symnam, PATH_MAX - 1);
                   1059: X          if (i < 0) {                /* Could not find symbolic link */
                   1060: X              warn("can't read symbolic link", syserr());
                   1061: X          } else {            /* Found symbolic link filename */
                   1062: X              symnam[i] = '\0';
                   1063: X              fprintf(msgfile, " symbolic link to %s", name, symnam);
                   1064: X          }
                   1065: X          break;
                   1066: X#endif
                   1067: X      case S_IFREG:   /* It is a link or a file */
                   1068: X          if ((asb->sb_nlink > 1) && (link = islink(name, asb))) {
                   1069: X              fprintf(msgfile, " linked to %s", link->l_name);
                   1070: X          }
                   1071: X          break;              /* Do not print out directories */
                   1072: X      }
                   1073: X      fputc('\n', msgfile);
                   1074: X    } else {
                   1075: X      fprintf(msgfile, "? %s %d blocks\n", name,
                   1076: X              ROUNDUP(asb->sb_size, BLOCKSIZE) / BLOCKSIZE);
                   1077: X    }
                   1078: X}
                   1079: X
                   1080: X
                   1081: X/* pax_entry - print a verbose cpio-style entry
                   1082: X *
                   1083: X * DESCRIPTION
                   1084: X *
                   1085: X *    Print_entry prints a single line of file information.  The format
                   1086: X *    of the line is the same as that used by the LS command.  
                   1087: X *    No error checking is done for bad or invalid data.
                   1088: X *
                   1089: X * PARAMETERS
                   1090: X *
                   1091: X *    char   *name            - pointer to name to print an entry for
                   1092: X *    Stat   *asb             - pointer to the stat structure for the file
                   1093: X */
                   1094: X
                   1095: X#ifdef __STDC__
                   1096: X
                   1097: Xstatic void pax_entry(char *name, Stat *asb)
                   1098: X
                   1099: X#else
                   1100: X    
                   1101: Xstatic void pax_entry(name, asb)
                   1102: Xchar         *name;
                   1103: XStat         *asb;
                   1104: X
                   1105: X#endif
                   1106: X{
                   1107: X    struct tm        *atm;
                   1108: X    Link             *from;
                   1109: X    struct passwd      *pwp;
                   1110: X    struct group       *grp;
                   1111: X
                   1112: X    if (f_list && f_verbose) {
                   1113: X      print_mode(asb->sb_mode);
                   1114: X      fprintf(msgfile, " %2d", asb->sb_nlink);
                   1115: X      atm = localtime(&asb->sb_mtime);
                   1116: X      if (pwp = getpwuid((int) USH(asb->sb_uid))) {
                   1117: X          fprintf(msgfile, " %-8s", pwp->pw_name);
                   1118: X      } else {
                   1119: X          fprintf(msgfile, " %-8u", USH(asb->sb_uid));
                   1120: X      }
                   1121: X      if (grp = getgrgid((int) USH(asb->sb_gid))) {
                   1122: X          fprintf(msgfile, " %-8s", grp->gr_name);
                   1123: X      } else {
                   1124: X          fprintf(msgfile, " %-8u", USH(asb->sb_gid));
                   1125: X      }
                   1126: X      switch (asb->sb_mode & S_IFMT) {
                   1127: X      case S_IFBLK:
                   1128: X      case S_IFCHR:
                   1129: X          fprintf(msgfile, "\t%3d, %3d",
                   1130: X                         major(asb->sb_rdev), minor(asb->sb_rdev));
                   1131: X          break;
                   1132: X      case S_IFREG:
                   1133: X          fprintf(msgfile, "\t%8ld", asb->sb_size);
                   1134: X          break;
                   1135: X      default:
                   1136: X          fprintf(msgfile, "\t        ");
                   1137: X      }
                   1138: X      fprintf(msgfile," %3s %2d %02d:%02d ",
                   1139: X                     monnames[atm->tm_mon], atm->tm_mday, 
                   1140: X                     atm->tm_hour, atm->tm_min);
                   1141: X    }
                   1142: X    fprintf(msgfile, "%s", name);
                   1143: X    if ((asb->sb_nlink > 1) && (from = islink(name, asb))) {
                   1144: X      fprintf(msgfile, " == %s", from->l_name);
                   1145: X    }
                   1146: X#ifdef        S_IFLNK
                   1147: X    if ((asb->sb_mode & S_IFMT) == S_IFLNK) {
                   1148: X      fprintf(msgfile, " -> %s", asb->sb_link);
                   1149: X    }
                   1150: X#endif        /* S_IFLNK */
                   1151: X    putc('\n', msgfile);
                   1152: X}
                   1153: X
                   1154: X
                   1155: X
                   1156: X
                   1157: X/* print_mode - fancy file mode display
                   1158: X *
                   1159: X * DESCRIPTION
                   1160: X *
                   1161: X *    Print_mode displays a numeric file mode in the standard unix
                   1162: X *    representation, ala ls (-rwxrwxrwx).  No error checking is done
                   1163: X *    for bad mode combinations.  FIFOS, sybmbolic links, sticky bits,
                   1164: X *    block- and character-special devices are supported if supported
                   1165: X *    by the hosting implementation.
                   1166: X *
                   1167: X * PARAMETERS
                   1168: X *
                   1169: X *    ushort  mode    - The integer representation of the mode to print.
                   1170: X */
                   1171: X
                   1172: X#ifdef __STDC__
                   1173: X
                   1174: Xstatic void print_mode(ushort mode)
                   1175: X
                   1176: X#else
                   1177: X    
                   1178: Xstatic void print_mode(mode)
                   1179: Xushort        mode;
                   1180: X
                   1181: X#endif
                   1182: X{
                   1183: X    /* Tar does not print the leading identifier... */
                   1184: X    if (ar_interface != TAR) {
                   1185: X      switch (mode & S_IFMT) {
                   1186: X      case S_IFDIR: 
                   1187: X          putc('d', msgfile); 
                   1188: X          break;
                   1189: X#ifdef        S_IFLNK
                   1190: X      case S_IFLNK: 
                   1191: X          putc('l', msgfile); 
                   1192: X          break;
                   1193: X#endif        /* S_IFLNK */
                   1194: X      case S_IFBLK: 
                   1195: X          putc('b', msgfile); 
                   1196: X          break;
                   1197: X      case S_IFCHR: 
                   1198: X          putc('c', msgfile); 
                   1199: X          break;
                   1200: X#ifdef        S_IFIFO
                   1201: X      case S_IFIFO: 
                   1202: X          putc('p', msgfile); 
                   1203: X          break; 
                   1204: X#endif        /* S_IFIFO */ 
                   1205: X      case S_IFREG: 
                   1206: X      default:
                   1207: X          putc('-', msgfile); 
                   1208: X          break;
                   1209: X      }
                   1210: X    }
                   1211: X    putc(mode & 0400 ? 'r' : '-', msgfile);
                   1212: X    putc(mode & 0200 ? 'w' : '-', msgfile);
                   1213: X    putc(mode & 0100
                   1214: X       ? mode & 04000 ? 's' : 'x'
                   1215: X       : mode & 04000 ? 'S' : '-', msgfile);
                   1216: X    putc(mode & 0040 ? 'r' : '-', msgfile);
                   1217: X    putc(mode & 0020 ? 'w' : '-', msgfile);
                   1218: X    putc(mode & 0010
                   1219: X       ? mode & 02000 ? 's' : 'x'
                   1220: X       : mode & 02000 ? 'S' : '-', msgfile);
                   1221: X    putc(mode & 0004 ? 'r' : '-', msgfile);
                   1222: X    putc(mode & 0002 ? 'w' : '-', msgfile);
                   1223: X    putc(mode & 0001
                   1224: X       ? mode & 01000 ? 't' : 'x'
                   1225: X       : mode & 01000 ? 'T' : '-', msgfile);
                   1226: X}
                   1227: X
                   1228: X
                   1229: X/* from_oct - quick and dirty octal conversion
                   1230: X *
                   1231: X * DESCRIPTION
                   1232: X *
                   1233: X *    From_oct will convert an ASCII representation of an octal number
                   1234: X *    to the numeric representation.  The number of characters to convert
                   1235: X *    is given by the parameter "digs".  If there are less numbers than
                   1236: X *    specified by "digs", then the routine returns -1.
                   1237: X *
                   1238: X * PARAMETERS
                   1239: X *
                   1240: X *    int digs        - Number to of digits to convert 
                   1241: X *    char *where     - Character representation of octal number
                   1242: X *
                   1243: X * RETURNS
                   1244: X *
                   1245: X *    The value of the octal number represented by the first digs
                   1246: X *    characters of the string where.  Result is -1 if the field 
                   1247: X *    is invalid (all blank, or nonoctal). 
                   1248: X *
                   1249: X * ERRORS
                   1250: X *
                   1251: X *    If the field is all blank, then the value returned is -1.
                   1252: X *
                   1253: X */
                   1254: X
                   1255: X#ifdef __STDC__
                   1256: X
                   1257: Xstatic long from_oct(int digs, char *where)
                   1258: X
                   1259: X#else
                   1260: X
                   1261: Xstatic long from_oct(digs, where)
                   1262: Xint             digs;         /* number of characters to convert */
                   1263: Xchar           *where;                /* character representation of octal number */
                   1264: X
                   1265: X#endif
                   1266: X{
                   1267: X    long            value;
                   1268: X
                   1269: X    while (isspace(*where)) { /* Skip spaces */
                   1270: X      where++;
                   1271: X      if (--digs <= 0) {
                   1272: X          return(-1);         /* All blank field */
                   1273: X      }
                   1274: X    }
                   1275: X    value = 0;
                   1276: X    while (digs > 0 && ISODIGIT(*where)) {    /* Scan til nonoctal */
                   1277: X      value = (value | (*where++ - '0'); << 3)
                   1278: X      --digs;
                   1279: X    }
                   1280: X
                   1281: X    if (digs > 0 && *where && !isspace(*where)) {
                   1282: X      return(-1);             /* Ended on non-space/nul */
                   1283: X    }
                   1284: X    return(value);
                   1285: X}
                   1286: END_OF_list.c
                   1287: if test 16229 -ne `wc -c <list.c`; then
                   1288:     echo shar: \"list.c\" unpacked with wrong size!
                   1289: fi
                   1290: # end of overwriting check
                   1291: fi
                   1292: if test -f pax.1 -a "${1}" != "-c" ; then 
                   1293:   echo shar: Will not over-write existing file \"pax.1\"
                   1294: else
                   1295: echo shar: Extracting \"pax.1\" \(13279 characters\)
                   1296: sed "s/^X//" >pax.1 <<'END_OF_pax.1'
                   1297: X.\" $Id: pax.1,v 1.1 88/12/23 18:02:22 mark Rel $
                   1298: X.TH PAX 1 "USENIX Association" ""
                   1299: X.SH NAME
                   1300: Xpax \- portable archive exchange 
                   1301: X.SH SYNOPSIS
                   1302: X.TP \w'\fBpax\fR\ 'u
                   1303: X.B pax
                   1304: X.RB [ \-cimopuvy ]
                   1305: X.RI "[\fB\-f\fR" " archive" ]
                   1306: X.RI "[\fB\-s\fR" " replstr" ]
                   1307: X.RI "[\fB\-t\fR" " device" ] 
                   1308: X.RI [ pattern... ]
                   1309: X.TP \w'\fBpax\ \-r\fR\ 'u
                   1310: X.B "pax\ \-r"
                   1311: X.RB [ \-cimnopuvy ]
                   1312: X.RI "[\fB\-f\fR" " archive" ]
                   1313: X.RI "[\fB\-s\fR" " replstr" ] 
                   1314: X.RI "[\fB\-t\fR" " device" ] 
                   1315: X.RI [ pattern... ]
                   1316: X.TP \w'\fBpax\ \-w\fR\ 'u
                   1317: X.B "pax\ \-w"
                   1318: X.RB [ \-adimuvy ] 
                   1319: X.RI "[\fB\-b\fR" " blocking" ]
                   1320: X.RI "[\fB\-f\fR" " archive" ] 
                   1321: X.RI "[\fB\-s\fR" " replstr" ] 
                   1322: X.RI "[\fB\-t\fR" " device" ] 
                   1323: X.RI "[\fB\-x\fR" " format" ]
                   1324: X.RI [ pathname... ]
                   1325: X.TP \w'\fBpax\ \-rw\fR\ 'u
                   1326: X.B "pax\ \-rw"
                   1327: X.RB [ \-ilmopuvy ] 
                   1328: X.RI "[\fB\-s\fR" " replstr" ] 
                   1329: X.RI [ pathname... ]
                   1330: Xdirectory
                   1331: X.SH DESCRIPTION
                   1332: X.I Pax 
                   1333: Xreads and writes archive files which conform to the 
                   1334: X.B "Archive/Interchange File Format" 
                   1335: Xspecified in 
                   1336: X.IR "IEEE Std. 1003.1-1988" .
                   1337: X.I Pax
                   1338: Xcan also read, but not write, a number of other file formats
                   1339: Xin addition to those specified in the 
                   1340: X.B "Archive/Interchange File Format"
                   1341: Xdescription.
                   1342: XSupport for these traditional file formats, such as V7 
                   1343: X.I "tar" 
                   1344: Xand System V binary 
                   1345: X.I "cpio" 
                   1346: Xformat archives,
                   1347: Xis provided for backward compatibility and to maximize portability.
                   1348: X.PP
                   1349: X.I Pax 
                   1350: Xwill also support traditional 
                   1351: X.I cpio 
                   1352: Xand 
                   1353: XSystem V
                   1354: X.I tar
                   1355: Xinterfaces if invoked with the name
                   1356: X"cpio" or "tar" respectively.
                   1357: XSee the 
                   1358: X.I cpio(1) 
                   1359: Xor 
                   1360: X.I tar(1)
                   1361: Xmanual pages for more details.
                   1362: X.PP
                   1363: XCombinations of the
                   1364: X.B \-r 
                   1365: Xand 
                   1366: X.B \-w
                   1367: Xcommand line arguments specify whether 
                   1368: X.I pax 
                   1369: Xwill read, write or list the contents of the specified archive,
                   1370: Xor move the specified files to another directory.
                   1371: X.PP
                   1372: XThe command line arguments are:
                   1373: X.TP .5i
                   1374: X.B \-w
                   1375: Xwrites the files and directories specified by 
                   1376: X.I pathname
                   1377: Xoperands to the standard output together with the pathname and status 
                   1378: Xinformation prescribed by the archive format used.
                   1379: XA directory
                   1380: X.I pathname
                   1381: Xoperand refers to the files and (recursively) subdirectories of that 
                   1382: Xdirectory.
                   1383: XIf no 
                   1384: X.I pathname 
                   1385: Xoperands are given, then the standard input is read to get a
                   1386: Xlist of pathnames to copy, one pathname per line.
                   1387: XIn this case, only those pathnames appearing on the standard input are
                   1388: Xcopied.
                   1389: X.TP .5i
                   1390: X.B \-r
                   1391: X.I Pax
                   1392: Xreads an archive file from the standard input.
                   1393: XOnly files with names that match any of the 
                   1394: X.I pattern
                   1395: Xoperands are selected for extraction.
                   1396: XThe selected files are conditionally created and copied relative to the
                   1397: Xcurrent directory tree, subject to the options described below.
                   1398: XBy default, the owner and group of selected files will be that of the
                   1399: Xinvoking process, and the permissions and modification times will be the
                   1400: Xsames as those in the archive.
                   1401: X.RS .5i
                   1402: X.PP
                   1403: XThe supported archive formats are automatically detected on input.
                   1404: XThe default output format is 
                   1405: X.IR ustar ,
                   1406: Xbut may be overridden by the 
                   1407: X.B \-x
                   1408: X.I format
                   1409: Xoption described below.
                   1410: X.RE
                   1411: X.TP .5i
                   1412: X.B \-rw
                   1413: X.I Pax 
                   1414: Xreads the files and directories named in the
                   1415: X.I pathname
                   1416: Xoperands and copies them to the destination 
                   1417: X.IR directory .
                   1418: XA directory
                   1419: X.I pathname 
                   1420: Xoperand refers to the files and (recursively) subdirectories of that
                   1421: Xdirectory.
                   1422: XIf no 
                   1423: X.I pathname
                   1424: Xoperands are given, the standard input is read to get a list of pathnames
                   1425: Xto copy, one pathname per line.
                   1426: XIn this case, only those pathnames appearing on the standard input are
                   1427: Xcopied.
                   1428: XThe directory named by the 
                   1429: X.I directory
                   1430: Xoperand must exist and have the proper permissions before the copy can
                   1431: Xoccur.
                   1432: X.PP
                   1433: XIf neither the
                   1434: X.BR \-r " or " \-w 
                   1435: Xoptions are given, then 
                   1436: X.I pax
                   1437: Xwill list the contents of the specified archive.
                   1438: XIn this mode, 
                   1439: X.I pax 
                   1440: Xlists normal files one per line, hard link pathnames as
                   1441: X.sp
                   1442: X.RS 1i
                   1443: X.IR pathname " == " linkname
                   1444: X.RE
                   1445: X.sp
                   1446: Xand symbolic link pathnames (if supported by the implementation) as
                   1447: X.sp
                   1448: X.RS 1i
                   1449: X.IR pathname " -> " linkname
                   1450: X.RE
                   1451: X.sp
                   1452: Xwhere 
                   1453: X.I pathname
                   1454: Xis the name of the file being extracted, and
                   1455: X.I linkname
                   1456: Xis the name of a file which appeared earlier in the archive.
                   1457: X.PP
                   1458: XIf the 
                   1459: X.B \-v
                   1460: Xoption is specified, then 
                   1461: X.I pax 
                   1462: Xlist normal pathnames in the same format used by the 
                   1463: X.I ls
                   1464: Xutility with the
                   1465: X.B \-l
                   1466: Xoption.
                   1467: XHard links are shown as
                   1468: X.sp
                   1469: X.RS 1i
                   1470: X.IR "<ls -l listing>" " == " linkname
                   1471: X.RE
                   1472: X.sp
                   1473: Xand symbolic links (if supported) are shown as
                   1474: X.sp
                   1475: X.RS 1i
                   1476: X.IR "<ls -l listing>" " -> " linkname
                   1477: X.RE
                   1478: X.sp 
                   1479: X.PP
                   1480: X.I Pax 
                   1481: Xis capable of reading and writing archives which span multiple physical 
                   1482: Xvolumes.
                   1483: XUpon detecting an end of medium on an archive which is not yet completed,
                   1484: X.I pax 
                   1485: Xwill prompt the user for the next volume of the archive and will allow the 
                   1486: Xuser to specify the location of the next volume.
                   1487: X.SS Options
                   1488: XThe following options are available:
                   1489: X.TP 1i
                   1490: X.B \-a
                   1491: XThe files specified by
                   1492: X.I pathname
                   1493: Xare appended to the specified archive.
                   1494: X.TP 1i
                   1495: X.BI \-b " blocking"
                   1496: XBlock the output at
                   1497: X.I blocking
                   1498: Xbytes per write to the archive file.
                   1499: XA 
                   1500: X.B k
                   1501: Xsuffix multiplies 
                   1502: X.I blocking 
                   1503: Xby 1024, a
                   1504: X.B b 
                   1505: Xsuffix multiplies 
                   1506: X.I blocking 
                   1507: Xby 512 and a 
                   1508: X.B m
                   1509: Xsuffix multiplies 
                   1510: X.I blocking 
                   1511: Xby 1048576 (1 megabyte).
                   1512: XIf not specified,
                   1513: X.I blocking 
                   1514: Xis automatically determined on input and is ignored for 
                   1515: X.B \-rw.
                   1516: X.TP 1i
                   1517: X.B \-c
                   1518: XComplement the match sense of the the 
                   1519: X.I pattern
                   1520: Xoperands.
                   1521: X.TP 1i
                   1522: X.B \-d
                   1523: XIntermediate directories not explicitly listed in the archive are not 
                   1524: Xcreated.
                   1525: XThis option is ignored unless
                   1526: Xthe 
                   1527: X.B \-r
                   1528: Xoption is specified.
                   1529: X.TP 1i
                   1530: X.BI \-f " archive"
                   1531: XThe
                   1532: X.I archive
                   1533: Xoption specifies the pathname of the input or output archive,
                   1534: Xoverriding the default of standard input for 
                   1535: X.B \-r
                   1536: Xor standard output for
                   1537: X.BR \-w .
                   1538: X.TP 1i
                   1539: X.B \-i
                   1540: XInteractively rename files.
                   1541: XSubstitutions specified by 
                   1542: X.B \-s
                   1543: Xoptions (described below)
                   1544: Xare performed before requesting the new file name from the user.
                   1545: XA file is skipped if an empty line is entered and
                   1546: X.I pax
                   1547: Xexits with an exit status of 0 if 
                   1548: X.B EOF 
                   1549: Xis encountered.
                   1550: X.TP 1i
                   1551: X.B \-l
                   1552: XFiles are linked rather than copied when possible.
                   1553: X.TP 1i
                   1554: X.B \-m
                   1555: XFile modification times are not retained.
                   1556: X.TP 1i
                   1557: X.B \-n
                   1558: XWhen 
                   1559: X.B \-r
                   1560: Xis specified, but
                   1561: X.B \-w
                   1562: Xis not, the 
                   1563: X.I pattern
                   1564: Xarguments are treated as ordinary file names.
                   1565: XOnly the first occurrence of each of these files in the input archive
                   1566: Xis read.
                   1567: XThe
                   1568: X.B pax
                   1569: Xutility exits with a zero exit status after all files in the list have been
                   1570: Xread.
                   1571: XIf one or more files in the list is not found,
                   1572: X.B pax
                   1573: Xwrites a diagnostic to standard error for each of the files and exits with
                   1574: Xa non-zero exit status.
                   1575: Xthe file names are compared before any of the 
                   1576: X.BR \-i ,
                   1577: X.BR \-s ,
                   1578: Xor
                   1579: X.B \-y
                   1580: Xoptions are applied.
                   1581: X.TP 1i
                   1582: X.B \-o
                   1583: XRestore file ownership as specified in the archive.
                   1584: XThe invoking process must have appropriate privileges to accomplish this.
                   1585: X.TP 1i
                   1586: X.B \-p
                   1587: XPreserve the access time of the input files after they have been copied.
                   1588: X.TP 1i
                   1589: X.BI \-s " replstr"
                   1590: XFile names are modified according to the substitution expression using the 
                   1591: Xsyntax of 
                   1592: X.I "ed(1)"
                   1593: Xas shown:
                   1594: X.sp
                   1595: X.RS 2i
                   1596: X-s /\fIold\fR/\fInew\fR/\fB[\fRgp\fB]\fR
                   1597: X.RE
                   1598: X.RS 1i
                   1599: X.PP
                   1600: XAny non null character may be used as a delimiter (a / is used here as an
                   1601: Xexample).
                   1602: XMultiple 
                   1603: X.B \-s
                   1604: Xexpressions may be specified; the expressions are applied in the order
                   1605: Xspecified terminating with the first successful substitution.
                   1606: XThe optional trailing 
                   1607: X.B p
                   1608: Xcauses successful mappings to be listed on standard error.
                   1609: XThe optional trailing
                   1610: X.B g
                   1611: Xcauses the 
                   1612: X.I old 
                   1613: Xexpression to be replaced each time it occurs in the source string.
                   1614: XFiles that substitute to an empty string are ignored both on input and
                   1615: Xoutput.
                   1616: X.RE
                   1617: X.TP 1i
                   1618: X.BI \-t " device"
                   1619: XThe
                   1620: X.I device
                   1621: Xoption argument is an implementation-defined identifier that names the input
                   1622: Xor output archive device, overriding the default of standard input for
                   1623: X.B \-r
                   1624: Xand standard output for
                   1625: X.BR \-w .
                   1626: X.TP 1i
                   1627: X.B \-u
                   1628: XCopy each file only if it is newer than a pre-existing file with the same
                   1629: Xname.
                   1630: XThis implies 
                   1631: X.BR \-a .
                   1632: X.TP 1i
                   1633: X.B \-v
                   1634: XList file names as they are encountered.
                   1635: XProduces a verbose table of contents listing on the standard output when both 
                   1636: X.B \-r 
                   1637: Xand
                   1638: X.B \-w
                   1639: Xare omitted,
                   1640: Xotherwise the file names are printed to standard error as they are
                   1641: Xencountered in the archive.
                   1642: X.TP 1i
                   1643: X.BI \-x " format"
                   1644: XSpecifies the output archive
                   1645: X.IR format .
                   1646: XThe input format, which must be one of the following, is automatically
                   1647: Xdetermined when the
                   1648: X.B \-r 
                   1649: Xoption is used.
                   1650: XThe supported formats are:
                   1651: X.TP 1i
                   1652: X.I cpio
                   1653: XThe extended 
                   1654: X.I CPIO
                   1655: Xinterchange format specified in
                   1656: X.B "Extended CPIO Format" in 
                   1657: X.I "IEEE Std. 1003.1-1988."
                   1658: X.TP 1i
                   1659: X.I ustar
                   1660: XThe extended 
                   1661: X.I TAR
                   1662: Xinterchange format specified in
                   1663: X.B "Extended TAR Format" in 
                   1664: X.I "IEEE Std. 1003.1-1988."
                   1665: XThis is the default archive format.
                   1666: X.RE
                   1667: X.TP 1i
                   1668: X.B \-y
                   1669: XInteractively prompt for the disposition of each file.
                   1670: XSubstitutions specified by 
                   1671: X.B \-s
                   1672: Xoptions (described above)
                   1673: Xare performed before prompting the user for disposition.
                   1674: X.B EOF
                   1675: Xor an input line starting with the character
                   1676: X.B q
                   1677: Xcaused
                   1678: X.I pax
                   1679: Xto exit.
                   1680: XOtherwise, an input line starting with anything other than 
                   1681: X.B y
                   1682: Xcauses the file to be ignored.
                   1683: XThis option cannot be used in conjunction with the 
                   1684: X.B \-i 
                   1685: Xoption.
                   1686: X.PP
                   1687: XOnly the last of multiple 
                   1688: X.B \-f 
                   1689: Xor
                   1690: X.B \-t
                   1691: Xoptions take effect.
                   1692: X.PP
                   1693: XWhen writing to an archive, the
                   1694: Xstandard input is used as a list of pathnames if no
                   1695: X.I pathname
                   1696: Xoperands are specified.
                   1697: XThe format is one pathname per line.
                   1698: XOtherwise, the standard input is the archive file,
                   1699: Xwhich is formatted according to one of the specifications in
                   1700: X.B "Archive/Interchange File format"
                   1701: Xin 
                   1702: X.IR "IEEE Std. 1003.1-1988" ,
                   1703: Xor some other implementation-defined format.
                   1704: X.PP
                   1705: XThe user ID and group ID of the process, together with the appropriate
                   1706: Xprivileges, affect the ability of 
                   1707: X.I pax
                   1708: Xto restore ownership and permissions attributes of the archived files.
                   1709: X(See 
                   1710: X.I "format-reading utility"
                   1711: Xin
                   1712: X.B "Archive/Interchange File Format"
                   1713: Xin 
                   1714: X.IR "IEEE Std. 1003.1-1988" ".)"
                   1715: X.PP
                   1716: XThe options
                   1717: X.BR \-a ,
                   1718: X.BR \-c ,
                   1719: X.BR \-d ,
                   1720: X.BR \-i ,
                   1721: X.BR \-l ,
                   1722: X.BR \-p ,
                   1723: X.BR \-t ,
                   1724: X.BR \-u ,
                   1725: Xand
                   1726: X.BR \-y 
                   1727: Xare provided for functional compatibility with the historical
                   1728: X.I cpio
                   1729: Xand
                   1730: X.I tar
                   1731: Xutilities.
                   1732: XThe option defaults were chosen based on the most common usage of these
                   1733: Xoptions, therefore, some of the options have meanings different than
                   1734: Xthose of the historical commands.
                   1735: X.SS Operands
                   1736: XThe following operands are available:
                   1737: X.TP 1i
                   1738: X.I directory
                   1739: XThe destination directory pathname for copies when both the
                   1740: X.B \-r
                   1741: Xand 
                   1742: X.B \-w
                   1743: Xoptions are specified.
                   1744: XThe directory must exist and be writable before the copy or and error
                   1745: Xresults.
                   1746: X.TP 1i
                   1747: X.I pathname
                   1748: XA file whose contents are used instead of the files named on the standard
                   1749: Xinput.
                   1750: XWhen a directory is named, all of its files and (recursively) 
                   1751: Xsubdirectories
                   1752: Xare copied as well.
                   1753: X.TP 1i
                   1754: X.IR pattern 
                   1755: XA
                   1756: X.I pattern
                   1757: Xis given in the standard shell pattern matching notation.
                   1758: XThe default if no 
                   1759: X.I pattern 
                   1760: Xis  specified is
                   1761: X.BR * \,
                   1762: Xwhich selects all files.
                   1763: X.SH EXAMPLES
                   1764: XThe following command
                   1765: X.sp
                   1766: X.RS 1i
                   1767: Xpax \-w \-f /dev/rmt0 \.
                   1768: X.RE
                   1769: X.sp
                   1770: Xcopies the contents of the current directory to tape drive 0.
                   1771: X.PP
                   1772: XThe commands
                   1773: X.sp
                   1774: X.RS 1i
                   1775: X.RI mkdir " newdir"
                   1776: X.br
                   1777: X.RI cd " olddir"
                   1778: X.br
                   1779: X.RI "pax -rw . " newdir
                   1780: X.RE
                   1781: X.sp
                   1782: Xcopies the contents of 
                   1783: X.I olddir 
                   1784: Xto 
                   1785: X.I newdir .
                   1786: X.PP
                   1787: XThe command
                   1788: X.sp
                   1789: X.RS 1i
                   1790: Xpax \-r \-s ',//*usr//*,,' -f pax.out
                   1791: X.RE
                   1792: X.sp
                   1793: Xreads the archive 
                   1794: X.B pax.out
                   1795: Xwith all files rooted in "/usr" in the archive extracted
                   1796: Xrelative to the current directory.
                   1797: X.SH FILES
                   1798: X.TP 1i
                   1799: X/dev/tty
                   1800: Xused to prompt the user for information when the
                   1801: X.BR \-i " or " \-y
                   1802: Xoptions are specified. 
                   1803: X.SH "SEE ALSO"
                   1804: Xcpio(1), find(1), tar(1), cpio(5), tar(5)
                   1805: X.SH DIAGNOSTICS
                   1806: X.I Pax
                   1807: Xwill terminate immediately, without processing any 
                   1808: Xadditional files on the command line or in the archive.
                   1809: X.SH "EXIT CODES"
                   1810: X.I Pax 
                   1811: Xwill exit with one of the following values:
                   1812: X.IP 0 .5i
                   1813: XAll files in the archive were processed successfully.
                   1814: X.IP ">0" .5i
                   1815: X.I Pax 
                   1816: Xaborted due to errors encountered during operation.
                   1817: X.SH BUGS
                   1818: XSpecial permissions may be required to copy or extract special files.
                   1819: X.PP
                   1820: XDevice, user ID, and group ID numbers larger than 65535 cause additional
                   1821: Xheader records to be output.
                   1822: XThese records are ignored by some historical version of
                   1823: X.I "cpio(1)"
                   1824: Xand
                   1825: X.IR "tar(1)" .
                   1826: X.PP
                   1827: XThe archive formats described in
                   1828: X.B "Archive/Interchange File Format" 
                   1829: Xhave certain restrictions that have
                   1830: Xbeen carried over from historical usage.
                   1831: XFor example, there are restrictions on the length of pathnames stored in
                   1832: Xthe archive.
                   1833: X.PP
                   1834: XWhen getting an "ls -l" style listing on
                   1835: X.I tar
                   1836: Xformat archives, link counts are listed as zero since the 
                   1837: X.I ustar
                   1838: Xarchive format does not keep link count information.
                   1839: X.SH COPYRIGHT
                   1840: XCopyright (c) 1989 Mark H. Colburn.  
                   1841: X.br
                   1842: XAll rights reserved.
                   1843: X.PP
                   1844: XRedistribution and use in source and binary forms are permitted
                   1845: Xprovided that the above copyright notice is duplicated in all such 
                   1846: Xforms and that any documentation, advertising materials, and other 
                   1847: Xmaterials related to such distribution and use acknowledge that the 
                   1848: Xsoftware was developed by Mark H. Colburn and sponsored by The 
                   1849: XUSENIX Association. 
                   1850: X.PP
                   1851: XTHE SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                   1852: XIMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                   1853: XWARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                   1854: X.SH AUTHOR
                   1855: XMark H. Colburn
                   1856: X.br
                   1857: XNAPS International
                   1858: X.br
                   1859: X117 Mackubin Street, Suite 1
                   1860: X.br
                   1861: XSt. Paul, MN 55102
                   1862: X.br
                   1863: [email protected]
                   1864: X.sp 2
                   1865: XSponsored by
                   1866: X.B "The USENIX Association"
                   1867: Xfor public distribution.
                   1868: END_OF_pax.1
                   1869: if test 13279 -ne `wc -c <pax.1`; then
                   1870:     echo shar: \"pax.1\" unpacked with wrong size!
                   1871: fi
                   1872: # end of overwriting check
                   1873: fi
                   1874: echo shar: End of archive 4 \(of 6\).
                   1875: cp /dev/null ark4isdone
                   1876: MISSING=""
                   1877: for I in 1 2 3 4 5 6 ; do
                   1878:     if test ! -f ark${I}isdone ; then
                   1879:        MISSING="${MISSING} ${I}"
                   1880:     fi
                   1881: done
                   1882: if test "${MISSING}" = "" ; then
                   1883:     echo You have unpacked all 6 archives.
                   1884:     rm -f ark[1-9]isdone
                   1885: else
                   1886:     echo You still need to unpack the following archives:
                   1887:     echo "        " ${MISSING}
                   1888: fi
                   1889: ##  End of shell archive.
                   1890: exit 0
                   1891: 

unix.superglobalmegacorp.com

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