[comp.sources.bugs] Official Patch #2 to Pax

mark@jhereg.Jhereg.MN.ORG (Mark H. Colburn) (02/13/89)

This is the second of three official patches to Pax, a freely distributable 
portable archive interchange.  These patches brings the software upto 
release 1.2.  These patches fix a number of bugs and portability problems 
with the initial release of the software.  These three patches (split to
avoid article size limitations) constitute a single logical patch to pax.

I would like to thank all those people who reported bug, suggested fixes, 
provided patches and suggested other extensions to pax.  I appologize to 
that I was not able to respond to all the mail that I got about pax, but 
all of the problems that were reported have either been fixed, or are 
still under consideration.

Please, if you have any problems with pax, let me know so that they can be
fixed.  Remember, if you find a problem, chances are that others will run
into the same problem as well.  Reporting the problems will allow them to
be fixed to avoid future difficulties and effort.

These items were not fixed in the patch, but are scheduled for a future
patch release:

    * Put the software configuration under control of a "Configure" script ala
      less and rn.
    * Bring source into line with new POSIX 1003.2 description of pax.
    * Add support for undocumented -C flag to cpio.
    * MS-DOS support
    * MINIX support
    * Add missing tar.5 cpio.5 man pages

These items were fixed in these patches:

    * Changed misspelling of MERCHANTABILITY.
    * Changed name of syserr to strerror, warn.c.
    * Removed the references to "public domain" in the software.  The 
      software is copyrighted, not public domain.
    * Files are chmod'ed before being moved into the installation 
      directories.  Files are also copied, then linked in the target 
      directory.
    * The variable "min" in regexp.c was changed to "minimum".  It would 
      seem that some copilers define min to be a macro...
    * In buffer.c there was an integer which was getting assigned NULL, 
      rather than 0.
    * If pax was given the -l option, it only successfully linked the 
      from-file and the to-file together if the from-file is already linked 
      to something else.
    * Changed the verbose output file for tar to use stderr, rather than
      stdout.  The verbose output was being interspersed with the archive,
      causing the archive to be unreadable.
    * The LDFLAGS macro is now used in the makefile.  There are also macros 
      for additional libraries which may be needed and one for SHELL which 
      fixes some problems when using the "make lint" facility.
    * Fixed the stupid typo which caused pax/tar/cpio to run out of file
      descriptors on very deep directory trees.
    * Removed all line continuations "\" in preprocessor directives and
      strings.  These were causing problems on certain compilers.
    * Rename two variable which were colloding on compilers that did not
      understand varaiables that were not unique in the first six
      characters.
    * Change the name of openi().  This causes a lot of problems on some
      machines, especially those with shared libraries...
    * Added some changes required for XENIX 286.
    * All references to NULL are now properly cast.
    * Man pages directories are now more compatible with BSD and USG
      installation
    * Other miscellaneous cleanups.

Mark H. Colburn                  "Look into a child's eye;
Minnetech Consulting, Inc.        there's no hate and there's no lie;
mark@jhereg.mn.org                there's no black and there's no white."
--------------------------------- CUT HERE ---------------------------------

Index: list.c
*** /tmp/,RCSt1a17078	Sun Feb 12 14:07:03 1989
--- list.c	Sun Feb 12 14:02:13 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/list.c,v $
   *
!  * $Revision: 1.1 $
   *
   * list.c - List all files on an archive
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/list.c,v $
   *
!  * $Revision: 1.2 $
   *
   * list.c - List all files on an archive
   *
***************
*** 27,33
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	list.c,v $
   * Revision 1.1  88/12/23  18:02:14  mark

--- 27,33 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	list.c,v $
   * Revision 1.2  89/02/12  10:04:43  mark
***************
*** 30,35
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	list.c,v $
   * Revision 1.1  88/12/23  18:02:14  mark
   * Initial revision
   * 

--- 30,38 -----
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	list.c,v $
+  * Revision 1.2  89/02/12  10:04:43  mark
+  * 1.2 release fixes
+  * 
   * Revision 1.1  88/12/23  18:02:14  mark
   * Initial revision
   * 
***************
*** 36,42
   */
  
  #ifndef lint
! static char *ident = "$Id: list.c,v 1.1 88/12/23 18:02:14 mark Rel $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  

--- 39,45 -----
   */
  
  #ifndef lint
! static char *ident = "$Id: list.c,v 1.2 89/02/12 10:04:43 mark Exp $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  
***************
*** 384,390
  	case S_IFLNK: 	/* This file is a symbolic link */
  	    i = readlink(name, symnam, PATH_MAX - 1);
  	    if (i < 0) {		/* Could not find symbolic link */
! 		warn("can't read symbolic link", syserr());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
  		fprintf(msgfile, "x %s symbolic link to %s\n", name, symnam);

--- 387,393 -----
  	case S_IFLNK: 	/* This file is a symbolic link */
  	    i = readlink(name, symnam, PATH_MAX - 1);
  	    if (i < 0) {		/* Could not find symbolic link */
! 		warn("can't read symbolic link", strerror());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
  		fprintf(msgfile, "x %s symbolic link to %s\n", name, symnam);
***************
*** 395,401
  	    if ((asb->sb_nlink > 1) && (link = islink(name, asb))) {
  		fprintf(msgfile, "%s linked to %s\n", name, link->l_name); 
  	    } else {
! 		fprintf(msgfile, "x %s, %d bytes, %d tape blocks\n", 
  			name, asb->sb_size, ROUNDUP(asb->sb_size, 
  			BLOCKSIZE) / BLOCKSIZE);
  	    }

--- 398,404 -----
  	    if ((asb->sb_nlink > 1) && (link = islink(name, asb))) {
  		fprintf(msgfile, "%s linked to %s\n", name, link->l_name); 
  	    } else {
! 		fprintf(msgfile, "x %s, %ld bytes, %d tape blocks\n", 
  			name, asb->sb_size, ROUNDUP(asb->sb_size, 
  			BLOCKSIZE) / BLOCKSIZE);
  	    }
***************
*** 406,412
  	case S_IFLNK: 	/* This file is a symbolic link */
  	    i = readlink(name, symnam, PATH_MAX - 1);
  	    if (i < 0) {		/* Could not find symbolic link */
! 		warn("can't read symbolic link", syserr());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
  		fprintf(msgfile, "a %s symbolic link to %s\n", name, symnam);

--- 409,415 -----
  	case S_IFLNK: 	/* This file is a symbolic link */
  	    i = readlink(name, symnam, PATH_MAX - 1);
  	    if (i < 0) {		/* Could not find symbolic link */
! 		warn("can't read symbolic link", strerror());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
  		fprintf(msgfile, "a %s symbolic link to %s\n", name, symnam);
***************
*** 418,424
  	    if ((asb->sb_nlink > 1) && (link = islink(name, asb))) {
  		fprintf(msgfile, "link to %s\n", link->l_name); 
  	    } else {
! 		fprintf(msgfile, "%d Blocks\n", 
  			ROUNDUP(asb->sb_size, BLOCKSIZE) / BLOCKSIZE);
  	    }
  	    break;

--- 421,427 -----
  	    if ((asb->sb_nlink > 1) && (link = islink(name, asb))) {
  		fprintf(msgfile, "link to %s\n", link->l_name); 
  	    } else {
! 		fprintf(msgfile, "%ld Blocks\n", 
  			ROUNDUP(asb->sb_size, BLOCKSIZE) / BLOCKSIZE);
  	    }
  	    break;
***************
*** 439,445
  	case S_IFLNK: 	/* This file is a symbolic link */
  	    i = readlink(name, symnam, PATH_MAX - 1);
  	    if (i < 0) {		/* Could not find symbolic link */
! 		warn("can't read symbolic link", syserr());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
  		fprintf(msgfile, " symbolic link to %s", name, symnam);

--- 442,448 -----
  	case S_IFLNK: 	/* This file is a symbolic link */
  	    i = readlink(name, symnam, PATH_MAX - 1);
  	    if (i < 0) {		/* Could not find symbolic link */
! 		warn("can't read symbolic link", strerror());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
  		fprintf(msgfile, " symbolic link to %s", symnam);
***************
*** 442,448
  		warn("can't read symbolic link", syserr());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
! 		fprintf(msgfile, " symbolic link to %s", name, symnam);
  	    }
  	    break;
  #endif

--- 445,451 -----
  		warn("can't read symbolic link", strerror());
  	    } else { 		/* Found symbolic link filename */
  		symnam[i] = '\0';
! 		fprintf(msgfile, " symbolic link to %s", symnam);
  	    }
  	    break;
  #endif
***************
*** 454,460
  	}
  	fputc('\n', msgfile);
      } else {
! 	fprintf(msgfile, "? %s %d blocks\n", name,
  		ROUNDUP(asb->sb_size, BLOCKSIZE) / BLOCKSIZE);
      }
  }

--- 457,463 -----
  	}
  	fputc('\n', msgfile);
      } else {
! 	fprintf(msgfile, "? %s %ld blocks\n", name,
  		ROUNDUP(asb->sb_size, BLOCKSIZE) / BLOCKSIZE);
      }
  }
***************
*** 518,525
  	    fprintf(msgfile, "\t        ");
  	}
  	fprintf(msgfile," %3s %2d %02d:%02d ",
! 	               monnames[atm->tm_mon], atm->tm_mday, 
! 		       atm->tm_hour, atm->tm_min);
      }
      fprintf(msgfile, "%s", name);
      if ((asb->sb_nlink > 1) && (from = islink(name, asb))) {

--- 521,528 -----
  	    fprintf(msgfile, "\t        ");
  	}
  	fprintf(msgfile," %3s %2d %02d:%02d ",
! 	        monnames[atm->tm_mon], atm->tm_mday, 
! 		atm->tm_hour, atm->tm_min);
      }
      fprintf(msgfile, "%s", name);
      if ((asb->sb_nlink > 1) && (from = islink(name, asb))) {
***************
*** 532,539
  #endif	/* S_IFLNK */
      putc('\n', msgfile);
  }
- 
- 
  
  
  /* print_mode - fancy file mode display

--- 535,540 -----
  #endif	/* S_IFLNK */
      putc('\n', msgfile);
  }
  
  
  /* print_mode - fancy file mode display
Index: mem.c
*** /tmp/,RCSt1a17083	Sun Feb 12 14:07:14 1989
--- mem.c	Sun Feb 12 14:02:14 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/mem.c,v $
   *
!  * $Revision: 1.1 $
   *
   * mem.c - memory allocation and manipulation functions
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/mem.c,v $
   *
!  * $Revision: 1.2 $
   *
   * mem.c - memory allocation and manipulation functions
   *
***************
*** 28,34
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	mem.c,v $
   * Revision 1.1  88/12/23  18:02:17  mark

--- 28,34 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	mem.c,v $
   * Revision 1.2  89/02/12  10:04:53  mark
***************
*** 31,36
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	mem.c,v $
   * Revision 1.1  88/12/23  18:02:17  mark
   * Initial revision
   * 

--- 31,39 -----
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	mem.c,v $
+  * Revision 1.2  89/02/12  10:04:53  mark
+  * 1.2 release fixes
+  * 
   * Revision 1.1  88/12/23  18:02:17  mark
   * Initial revision
   * 
***************
*** 37,43
   */
  
  #ifndef lint
! static char *ident = "$Id: mem.c,v 1.1 88/12/23 18:02:17 mark Rel $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  

--- 40,46 -----
   */
  
  #ifndef lint
! static char *ident = "$Id: mem.c,v 1.2 89/02/12 10:04:53 mark Exp $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  
***************
*** 65,71
   * RETURNS
   *
   *	Normally returns the pointer to the newly allocated memory.  If
!  *	an error occurss, NULL is returned, and an error message is
   *	printed.
   *
   * ERRORS

--- 68,74 -----
   * RETURNS
   *
   *	Normally returns the pointer to the newly allocated memory.  If
!  *	an error occurs, NULL is returned, and an error message is
   *	printed.
   *
   * ERRORS
***************
*** 87,93
      char           *mem;
      static short    outofmem = 0;
  
!     if ((mem = (char *)malloc(len)) == NULL && !outofmem) {
  	outofmem++;
  	warn("mem_get()", "Out of memory");
      }

--- 90,96 -----
      char           *mem;
      static short    outofmem = 0;
  
!     if ((mem = (char *)malloc(len)) == (char *)NULL && !outofmem) {
  	outofmem++;
  	warn("mem_get()", "Out of memory");
      }
Index: namelist.c
*** /tmp/,RCSt1a19493	Mon Feb 13 09:15:28 1989
--- namelist.c	Mon Feb 13 09:14:57 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/namelist.c,v $
   *
!  * $Revision: 1.1 $
   *
   * namelist.c - track filenames given as arguments to tar/cpio/pax
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/namelist.c,v $
   *
!  * $Revision: 1.6 $
   *
   * namelist.c - track filenames given as arguments to tar/cpio/pax
   *
***************
*** 23,29
   * provided that the above copyright notice is duplicated in all such 
   * forms and that any documentation, advertising materials, and other 
   * materials related to such distribution and use acknowledge that the 
!  * software was developed * by Mark H. Colburn and sponsored by The 
   * USENIX Association. 
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR

--- 23,29 -----
   * provided that the above copyright notice is duplicated in all such 
   * forms and that any documentation, advertising materials, and other 
   * materials related to such distribution and use acknowledge that the 
!  * software was developed by Mark H. Colburn and sponsored by The 
   * USENIX Association. 
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
***************
*** 28,34
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	namelist.c,v $
   * Revision 1.1  88/12/23  18:02:17  mark

--- 28,34 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	namelist.c,v $
   * Revision 1.6  89/02/13  09:14:48  mark
***************
*** 31,36
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	namelist.c,v $
   * Revision 1.1  88/12/23  18:02:17  mark
   * Initial revision
   * 

--- 31,51 -----
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	namelist.c,v $
+  * Revision 1.6  89/02/13  09:14:48  mark
+  * Fixed problem with directory errors
+  * 
+  * Revision 1.5  89/02/12  12:14:00  mark
+  * Fixed misspellings
+  * 
+  * Revision 1.4  89/02/12  11:25:19  mark
+  * Modifications to compile and link cleanly under USG
+  * 
+  * Revision 1.3  89/02/12  10:40:23  mark
+  * Fixed casting problems
+  * 
+  * Revision 1.2  89/02/12  10:04:57  mark
+  * 1.2 release fixes
+  * 
   * Revision 1.1  88/12/23  18:02:17  mark
   * Initial revision
   * 
***************
*** 37,43
   */
  
  #ifndef lint
! static char *ident = "$Id: namelist.c,v 1.1 88/12/23 18:02:17 mark Rel $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  

--- 52,58 -----
   */
  
  #ifndef lint
! static char *ident = "$Id: namelist.c,v 1.6 89/02/13 09:14:48 mark Exp $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  
***************
*** 68,73
  };
  
  
  /* Function Prototypes */
  
  #ifndef __STDC__

--- 83,93 -----
  };
  
  
+ /* Static Variables */
+ 
+ static struct dirinfo *stack_head = (struct dirinfo *)NULL;
+ 
+ 
  /* Function Prototypes */
  
  #ifndef __STDC__
***************
*** 123,129
      if (!p) {
  	fatal("cannot allocate memory for namelist entry\n");
      }
!     p->next = (struct nm_list *) NULL;
      p->length = i;
      strncpy(p->name, name, i);
      p->name[i] = '\0';		/* Null term */

--- 143,149 -----
      if (!p) {
  	fatal("cannot allocate memory for namelist entry\n");
      }
!     p->next = (struct nm_list *)NULL;
      p->length = i;
      strncpy(p->name, name, i);
      p->name[i] = '\0';		/* Null term */
***************
*** 231,237
      for (nlp = namelist; nlp != 0; nlp = nlp->next) {
  	if (!nlp->found) {
  	    fprintf(stderr, "%s: %s not found in archive\n",
! 			   myname, nlp->name);
  	}
  	free(nlp);
      }

--- 251,257 -----
      for (nlp = namelist; nlp != 0; nlp = nlp->next) {
  	if (!nlp->found) {
  	    fprintf(stderr, "%s: %s not found in archive\n",
! 	            myname, nlp->name);
  	}
  	free(nlp);
      }
***************
*** 235,242
  	}
  	free(nlp);
      }
!     namelist = (struct nm_list *) NULL;
!     namelast = (struct nm_list *) NULL;
  }
  
  

--- 255,262 -----
  	}
  	free(nlp);
      }
!     namelist = (struct nm_list *)NULL;
!     namelast = (struct nm_list *)NULL;
  }
  
  
***************
*** 326,332
  	    }
  	} else {
  	    if (in_subdir) {
! 		if ((d = readdir(dirp)) != NULL) {
  		    /* Skip . and .. */
  		    if (strcmp(d->d_name, ".") == 0 ||
  		        strcmp(d->d_name, "..") == 0) {

--- 346,352 -----
  	    }
  	} else {
  	    if (in_subdir) {
! 		if ((d = readdir(dirp)) != (struct dirent *)NULL) {
  		    /* Skip . and .. */
  		    if (strcmp(d->d_name, ".") == 0 ||
  		        strcmp(d->d_name, "..") == 0) {
***************
*** 345,351
  		    curr_dir = popdir();
  		    if (in_subdir) {
  			errno = 0;
! 			if ((dirp = opendir(curr_dir->dirname)) == NULL) {
  			    warn(curr_dir->dirname, "error opening directory (1)");
  			    in_subdir--;
  			}

--- 365,371 -----
  		    curr_dir = popdir();
  		    if (in_subdir) {
  			errno = 0;
! 			if ((dirp=opendir(curr_dir->dirname)) == (DIR *)NULL) {
  			    warn(curr_dir->dirname, "error opening directory (1)");
  			    in_subdir--;
  			}
***************
*** 360,366
  	    }
  	}
  	if ((err = LSTAT(name, statbuf)) < 0) {
! 	    warn(name, syserr());
  	    continue;
  	}
  	if (!names_from_stdin && (statbuf->sb_mode & S_IFMT) == S_IFDIR) {

--- 380,386 -----
  	    }
  	}
  	if ((err = LSTAT(name, statbuf)) < 0) {
! 	    warn(name, strerror());
  	    continue;
  	}
  	if (!names_from_stdin && (statbuf->sb_mode & S_IFMT) == S_IFDIR) {
***************
*** 367,373
  	    if (in_subdir) {
  		curr_dir->where = telldir(dirp);
  		pushdir(curr_dir);
! 		close(dirp);
  	    } 
  	    in_subdir++;
  

--- 387,393 -----
  	    if (in_subdir) {
  		curr_dir->where = telldir(dirp);
  		pushdir(curr_dir);
! 		closedir(dirp);
  	    } 
  	    in_subdir++;
  
***************
*** 372,379
  	    in_subdir++;
  
  	    /* Build new prototype name */
! 	    if ((curr_dir = (struct dirinfo *) 
! 		    mem_get(sizeof(struct dirinfo))) == NULL) {
  		exit(2);
  	    }
  	    strcpy(curr_dir->dirname, name);

--- 392,399 -----
  	    in_subdir++;
  
  	    /* Build new prototype name */
! 	    if ((curr_dir = (struct dirinfo *) mem_get(sizeof(struct dirinfo))) 
! 			  == (struct dirinfo *)NULL) {
  		exit(2);
  	    }
  	    strcpy(curr_dir->dirname, name);
***************
*** 383,393
  	    }
  	    curr_dir->dirname[len++] = '/';	/* Now add exactly one back */
  	    curr_dir->dirname[len] = '\0';/* Make sure null-terminated */
! 
! 	    errno = 0;
! 	    if ((dirp = opendir(curr_dir->dirname)) == NULL) {
! 		warn(curr_dir->dirname, "error opening directory (2)");
! 	    }
  	}
      } while (err < 0);
      return (0);

--- 403,424 -----
  	    }
  	    curr_dir->dirname[len++] = '/';	/* Now add exactly one back */
  	    curr_dir->dirname[len] = '\0';/* Make sure null-terminated */
!             curr_dir->where = 0;
!            
!             errno = 0;
!             do {
!                 if ((dirp = opendir(curr_dir->dirname)) == (DIR *)NULL) {
!                      warn(curr_dir->dirname, "error opening directory (2)");
!                      if (in_subdir > 1) {
!                           curr_dir = popdir();
!                      }
!                      in_subdir--;
!                      err = -1;
!                      continue;
!                 } else {
!                      seekdir(dirp, curr_dir->where);
! 		}
! 	    } while (in_subdir && (! dirp));
  	}
      } while (err < 0);
      return (0);
***************
*** 422,430
  }
  
  
- static struct dirinfo *stack_head = NULL;
- 
- 
  /* pushdir - pushes a directory name on the directory stack
   *
   * DESCRIPTION

--- 453,458 -----
  }
  
  
  /* pushdir - pushes a directory name on the directory stack
   *
   * DESCRIPTION
***************
*** 449,455
  
  #endif
  {
!     if  (stack_head == NULL) {
  	stack_head = info;
  	stack_head->next = NULL;
      } else {

--- 477,483 -----
  
  #endif
  {
!     if  (stack_head == (struct dirinfo *)NULL) {
  	stack_head = info;
  	stack_head->next = (struct dirinfo *)NULL;
      } else {
***************
*** 451,457
  {
      if  (stack_head == NULL) {
  	stack_head = info;
! 	stack_head->next = NULL;
      } else {
  	info->next = stack_head;
  	stack_head = info;

--- 479,485 -----
  {
      if  (stack_head == (struct dirinfo *)NULL) {
  	stack_head = info;
! 	stack_head->next = (struct dirinfo *)NULL;
      } else {
  	info->next = stack_head;
  	stack_head = info;
***************
*** 485,492
  {
      struct dirinfo	*tmp;
  
!     if (stack_head == NULL) {
! 	return(NULL);
      } else {
  	tmp = stack_head;
  	stack_head = stack_head->next;

--- 513,520 -----
  {
      struct dirinfo	*tmp;
  
!     if (stack_head == (struct dirinfo *)NULL) {
! 	return((struct dirinfo *)NULL);
      } else {
  	tmp = stack_head;
  	stack_head = stack_head->next;
Index: names.c
*** /tmp/,RCSt1a17093	Sun Feb 12 14:07:34 1989
--- names.c	Sun Feb 12 14:02:17 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/names.c,v $
   *
!  * $Revision: 1.1 $
   *
   * names.c - Look up user and/or group names. 
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/names.c,v $
   *
!  * $Revision: 1.2 $
   *
   * names.c - Look up user and/or group names. 
   *
***************
*** 27,33
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	names.c,v $
   * Revision 1.1  88/12/23  18:02:19  mark

--- 27,33 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	names.c,v $
   * Revision 1.2  89/02/12  10:05:05  mark
***************
*** 30,35
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	names.c,v $
   * Revision 1.1  88/12/23  18:02:19  mark
   * Initial revision
   * 

--- 30,38 -----
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	names.c,v $
+  * Revision 1.2  89/02/12  10:05:05  mark
+  * 1.2 release fixes
+  * 
   * Revision 1.1  88/12/23  18:02:19  mark
   * Initial revision
   * 
***************
*** 36,42
   */
  
  #ifndef lint
! static char *ident = "$Id: names.c,v 1.1 88/12/23 18:02:19 mark Rel $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  

--- 39,45 -----
   */
  
  #ifndef lint
! static char *ident = "$Id: names.c,v 1.2 89/02/12 10:05:05 mark Exp $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  
Index: pass.c
*** /tmp/,RCSt1a17098	Sun Feb 12 14:07:40 1989
--- pass.c	Sun Feb 12 14:02:19 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/pass.c,v $
   *
!  * $Revision: 1.1 $
   *
   * pass.c - handle the pass option of cpio
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/pass.c,v $
   *
!  * $Revision: 1.3 $
   *
   * pass.c - handle the pass option of cpio
   *
***************
*** 27,33
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pass.c,v $
   * Revision 1.1  88/12/23  18:02:20  mark

--- 27,33 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pass.c,v $
   * Revision 1.3  89/02/12  10:29:51  mark
***************
*** 30,35
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pass.c,v $
   * Revision 1.1  88/12/23  18:02:20  mark
   * Initial revision
   * 

--- 30,41 -----
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pass.c,v $
+  * Revision 1.3  89/02/12  10:29:51  mark
+  * Fixed misspelling of Replstr
+  * 
+  * Revision 1.2  89/02/12  10:05:09  mark
+  * 1.2 release fixes
+  * 
   * Revision 1.1  88/12/23  18:02:20  mark
   * Initial revision
   * 
***************
*** 36,42
   */
  
  #ifndef lint
! static char *ident = "$Id: pass.c,v 1.1 88/12/23 18:02:20 mark Rel $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  

--- 42,48 -----
   */
  
  #ifndef lint
! static char *ident = "$Id: pass.c,v 1.3 89/02/12 10:29:51 mark Exp $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  
***************
*** 74,80
      int             fd;
      Stat            sb;
  
!     while (name_next(name, &sb) >= 0 && (fd = openi(name, &sb)) >= 0) {
  
  	if (rplhead != NULL) {
  	    rpl_name(name);

--- 80,86 -----
      int             fd;
      Stat            sb;
  
!     while (name_next(name, &sb) >= 0 && (fd = openin(name, &sb)) >= 0) {
  
  	if (rplhead != (Replstr *)NULL) {
  	    rpl_name(name);
***************
*** 76,82
  
      while (name_next(name, &sb) >= 0 && (fd = openi(name, &sb)) >= 0) {
  
! 	if (rplhead != NULL) {
  	    rpl_name(name);
  	}
  	if (get_disposition("pass", name) || get_newname(name, sizeof(name))) {

--- 82,88 -----
  
      while (name_next(name, &sb) >= 0 && (fd = openin(name, &sb)) >= 0) {
  
! 	if (rplhead != (Replstr *)NULL) {
  	    rpl_name(name);
  	}
  	if (get_disposition("pass", name) || get_newname(name, sizeof(name))) {
***************
*** 139,147
  	return (-1);
      }
      if (asb->sb_nlink > 1) {
- 	if (f_link && islink(from, asb) == (Link *) NULL) {
- 	    linkto(from, asb);
- 	}
  	linkto(to, asb);
      }
      if ((ofd = openo(to, asb, islink(to, asb), 1)) < 0) {

--- 145,150 -----
  	return (-1);
      }
      if (asb->sb_nlink > 1) {
  	linkto(to, asb);
      }
      if (f_link && islink(from, asb) == (Link *)NULL) {
***************
*** 144,150
  	}
  	linkto(to, asb);
      }
!     if ((ofd = openo(to, asb, islink(to, asb), 1)) < 0) {
  	return (-1);
      }
      if (ofd > 0) {

--- 147,156 -----
      if (asb->sb_nlink > 1) {
  	linkto(to, asb);
      }
!     if (f_link && islink(from, asb) == (Link *)NULL) {
! 	linkto(from, asb);
!     }
!     if ((ofd = openout(to, asb, islink(to, asb), 1)) < 0) {
  	return (-1);
      }
      if (ofd > 0) {
***************
*** 151,157
  	passdata(from, ifd, to, ofd);
      }
      tstamp[0] = asb->sb_atime;
!     tstamp[1] = f_modification_time ? asb->sb_mtime : time((time_t *) 0);
      utime(to, tstamp);
      return (ifd);
  }

--- 157,163 -----
  	passdata(from, ifd, to, ofd);
      }
      tstamp[0] = asb->sb_atime;
!     tstamp[1] = f_mtime ? asb->sb_mtime : time((time_t *) 0);
      utime(to, tstamp);
      return (ifd);
  }
Index: pathname.c
*** /tmp/,RCSt1a17103	Sun Feb 12 14:07:46 1989
--- pathname.c	Sun Feb 12 14:02:21 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/pathname.c,v $
   *
!  * $Revision: 1.1 $
   *
   * pathname.c - directory/pathname support functions 
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/pathname.c,v $
   *
!  * $Revision: 1.2 $
   *
   * pathname.c - directory/pathname support functions 
   *
***************
*** 26,32
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pathname.c,v $
   * Revision 1.1  88/12/23  18:02:21  mark

--- 26,32 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pathname.c,v $
   * Revision 1.2  89/02/12  10:05:13  mark
***************
*** 29,34
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pathname.c,v $
   * Revision 1.1  88/12/23  18:02:21  mark
   * Initial revision
   * 

--- 29,37 -----
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pathname.c,v $
+  * Revision 1.2  89/02/12  10:05:13  mark
+  * 1.2 release fixes
+  * 
   * Revision 1.1  88/12/23  18:02:21  mark
   * Initial revision
   * 
***************
*** 35,41
   */
  
  #ifndef lint
! static char *ident = "$Id: pathname.c,v 1.1 88/12/23 18:02:21 mark Rel $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  

--- 38,44 -----
   */
  
  #ifndef lint
! static char *ident = "$Id: pathname.c,v 1.2 89/02/12 10:05:13 mark Exp $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  
***************
*** 51,57
   *
   *	Dirneed checks to see if a directory of the name pointed to by name
   *	exists.  If the directory does exist, then dirneed returns 0.  If
!  *	the directory does not exist and the f_create_dirs flag is set,
   *	then dirneed will create the needed directory, recursively creating
   *	any needed intermediate directory.
   *

--- 54,60 -----
   *
   *	Dirneed checks to see if a directory of the name pointed to by name
   *	exists.  If the directory does exist, then dirneed returns 0.  If
!  *	the directory does not exist and the f_dir_create flag is set,
   *	then dirneed will create the needed directory, recursively creating
   *	any needed intermediate directory.
   *
***************
*** 55,61
   *	then dirneed will create the needed directory, recursively creating
   *	any needed intermediate directory.
   *
!  *	If f_create_dirs is not set, then no directories will be created
   *	and a value of -1 will be returned if the directory does not
   *	exist.
   *

--- 58,64 -----
   *	then dirneed will create the needed directory, recursively creating
   *	any needed intermediate directory.
   *
!  *	If f_dir_create is not set, then no directories will be created
   *	and a value of -1 will be returned if the directory does not
   *	exist.
   *
***************
*** 66,72
   * RETURNS
   *
   *	Returns a 0 if the creation of the directory succeeded or if the
!  *	directory already existed.  If the f_create_dirs flag was not set
   *	and the named directory does not exist, or the directory creation 
   *	failed, a -1 will be returned to the calling routine.
   */

--- 69,75 -----
   * RETURNS
   *
   *	Returns a 0 if the creation of the directory succeeded or if the
!  *	directory already existed.  If the f_dir_create flag was not set
   *	and the named directory does not exist, or the directory creation 
   *	failed, a -1 will be returned to the calling routine.
   */
***************
*** 87,93
      int             ok;
      static Stat     sb;
  
!     last = NULL;
      for (cp = name; *cp;) {
  	if (*cp++ == '/') {
  	    last = cp;

--- 90,96 -----
      int             ok;
      static Stat     sb;
  
!     last = (char *)NULL;
      for (cp = name; *cp;) {
  	if (*cp++ == '/') {
  	    last = cp;
***************
*** 93,99
  	    last = cp;
  	}
      }
!     if (last == NULL) {
  	return (STAT(".", &sb));
      }
      *--last = '\0';

--- 96,102 -----
  	    last = cp;
  	}
      }
!     if (last == (char *)NULL) {
  	return (STAT(".", &sb));
      }
      *--last = '\0';
***************
*** 99,105
      *--last = '\0';
      ok = STAT(*name ? name : ".", &sb) == 0
  	? ((sb.sb_mode & S_IFMT) == S_IFDIR)
! 	: (f_create_dirs && dirneed(name) == 0 && dirmake(name, &sb) == 0);
      *last = '/';
      return (ok ? 0 : -1);
  }

--- 102,108 -----
      *--last = '\0';
      ok = STAT(*name ? name : ".", &sb) == 0
  	? ((sb.sb_mode & S_IFMT) == S_IFDIR)
! 	: (f_dir_create && dirneed(name) == 0 && dirmake(name, &sb) == 0);
      *last = '/';
      return (ok ? 0 : -1);
  }
***************
*** 176,182
      if (idx == 0) {
  	element[idx++] = absolute ? "" : "."; 
      }
!     element[idx] = NULL;
      name = begin;
      if (absolute) {
  	*name++ = '/';

--- 179,185 -----
      if (idx == 0) {
  	element[idx++] = absolute ? "" : "."; 
      }
!     element[idx] = (char *)NULL;
      name = begin;
      if (absolute) {
  	*name++ = '/';
Index: pax.1
*** /tmp/,RCSt1a17108	Sun Feb 12 14:07:54 1989
--- pax.1	Sun Feb 12 14:02:22 1989
***************
*** 1,4
! .\" $Id: pax.1,v 1.1 88/12/23 18:02:22 mark Rel $
  .TH PAX 1 "USENIX Association" ""
  .SH NAME
  pax \- portable archive exchange 

--- 1,4 -----
! .\" $Id: pax.1,v 1.2 89/02/12 10:08:47 mark Exp $
  .TH PAX 1 "USENIX Association" ""
  .SH NAME
  pax \- portable archive exchange 
***************
*** 213,218
  suffix multiplies 
  .I blocking 
  by 1048576 (1 megabyte).
  If not specified,
  .I blocking 
  is automatically determined on input and is ignored for 

--- 213,220 -----
  suffix multiplies 
  .I blocking 
  by 1048576 (1 megabyte).
+ For machines with 16-bit int's (VAXen, XENIX-286, etc.), 
+ the maximum buffer size is 32k-1.
  If not specified,
  .I blocking 
  is automatically determined on input and is ignored for 
***************
*** 219,225
  .B \-rw.
  .TP 1i
  .B \-c
! Complement the match sense of the the 
  .I pattern
  operands.
  .TP 1i

--- 221,227 -----
  .B \-rw.
  .TP 1i
  .B \-c
! Complement the match sense of the 
  .I pattern
  operands.
  .TP 1i
***************
*** 352,358
  .B \-r 
  option is used.
  The supported formats are:
! .TP 1i
  .I cpio
  The extended 
  .I CPIO

--- 354,361 -----
  .B \-r 
  option is used.
  The supported formats are:
! .RS 1i
! .TP 0.75i
  .I cpio
  The extended 
  .I CPIO
***************
*** 359,365
  interchange format specified in
  .B "Extended CPIO Format" in 
  .I "IEEE Std. 1003.1-1988."
! .TP 1i
  .I ustar
  The extended 
  .I TAR

--- 362,368 -----
  interchange format specified in
  .B "Extended CPIO Format" in 
  .I "IEEE Std. 1003.1-1988."
! .TP 0.75i
  .I ustar
  The extended 
  .I TAR
***************
*** 540,545
  format archives, link counts are listed as zero since the 
  .I ustar
  archive format does not keep link count information.
  .SH COPYRIGHT
  Copyright (c) 1989 Mark H. Colburn.  
  .br

--- 543,553 -----
  format archives, link counts are listed as zero since the 
  .I ustar
  archive format does not keep link count information.
+ .PP
+ On 16 bit architectures, the largest buffer size is 32k-1.
+ This is due, in part, to using integers in the buffer allocation schemes,
+ however, on many of these machines, it is not possible to allocate blocks
+ of memory larger than 32k.
  .SH COPYRIGHT
  Copyright (c) 1989 Mark H. Colburn.  
  .br
***************
*** 554,560
  .PP
  THE SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
! WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  .SH AUTHOR
  Mark H. Colburn
  .br

--- 562,568 -----
  .PP
  THE SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
! WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  .SH AUTHOR
  Mark H. Colburn
  .br
***************
*** 558,564
  .SH AUTHOR
  Mark H. Colburn
  .br
! NAPS International
  .br
  117 Mackubin Street, Suite 1
  .br

--- 566,572 -----
  .SH AUTHOR
  Mark H. Colburn
  .br
! Minnetech Consulting, Inc.
  .br
  117 Mackubin Street, Suite 1
  .br
Index: pax.c
*** /tmp/,RCSt1a17113	Sun Feb 12 14:08:07 1989
--- pax.c	Sun Feb 12 14:02:25 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/pax.c,v $
   *
!  * $Revision: 1.1 $
   *
   * DESCRIPTION
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/pax.c,v $
   *
!  * $Revision: 1.2 $
   *
   * DESCRIPTION
   *
***************
*** 46,52
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pax.c,v $
   * Revision 1.1  88/12/23  18:02:23  mark

--- 46,52 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pax.c,v $
   * Revision 1.2  89/02/12  10:05:17  mark
***************
*** 49,54
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pax.c,v $
   * Revision 1.1  88/12/23  18:02:23  mark
   * Initial revision
   * 

--- 49,57 -----
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   *
   * $Log:	pax.c,v $
+  * Revision 1.2  89/02/12  10:05:17  mark
+  * 1.2 release fixes
+  * 
   * Revision 1.1  88/12/23  18:02:23  mark
   * Initial revision
   * 
***************
*** 55,61
   */
  
  #ifndef lint
! static char *ident = "$Id: pax.c,v 1.1 88/12/23 18:02:23 mark Rel $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  

--- 58,64 -----
   */
  
  #ifndef lint
! static char *ident = "$Id: pax.c,v 1.2 89/02/12 10:05:17 mark Exp $";
  static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  #endif /* ! lint */
  
***************
*** 88,94
  OFFSET          total;			/* Total number of bytes transferred */
  short           f_access_time;		/* Reset access times of input files */
  short           areof;			/* End of input volume reached */
! short           f_create_dirs;		/* Create missing directories */
  short           f_append;		/* Add named files to end of archive */
  short           f_create;		/* create a new archive */
  short           f_extract;		/* Extract named files from archive */

--- 91,97 -----
  OFFSET          total;			/* Total number of bytes transferred */
  short           f_access_time;		/* Reset access times of input files */
  short           areof;			/* End of input volume reached */
! short           f_dir_create;		/* Create missing directories */
  short           f_append;		/* Add named files to end of archive */
  short           f_create;		/* create a new archive */
  short           f_extract;		/* Extract named files from archive */
***************
*** 104,110
  short           f_newer;		/* append files to archive if newer */
  short		f_disposition;		/* ask for file disposition */
  short           f_reverse_match;	/* Reverse sense of pattern match */
! short           f_modification_time;	/* Retain file modification time */
  short           f_unconditional;	/* Copy unconditionally */
  time_t          now = 0;		/* Current time */
  uint            arvolume;		/* Volume number */

--- 107,113 -----
  short           f_newer;		/* append files to archive if newer */
  short		f_disposition;		/* ask for file disposition */
  short           f_reverse_match;	/* Reverse sense of pattern match */
! short           f_mtime;		/* Retain file modification time */
  short           f_unconditional;	/* Copy unconditionally */
  time_t          now = 0;		/* Current time */
  uint            arvolume;		/* Volume number */
***************
*** 110,116
  uint            arvolume;		/* Volume number */
  uint            blocksize = BLOCKSIZE;	/* Archive block size */
  FILE	       *msgfile;		/* message outpu file stdout/stderr */
! Replstr        *rplhead = NULL;		/* pointer to head of replstr list */
  Replstr        *rpltail;		/* pointer to tail of replstr list */
  
  

--- 113,119 -----
  uint            arvolume;		/* Volume number */
  uint            blocksize = BLOCKSIZE;	/* Archive block size */
  FILE	       *msgfile;		/* message outpu file stdout/stderr */
! Replstr        *rplhead = (Replstr *)NULL;	/*  head of replstr list */
  Replstr        *rpltail;		/* pointer to tail of replstr list */
  
  
***************
*** 234,241
       * of the tar and/or cpio interfaces...
       */
      f_unconditional = 1;
!     f_modification_time = 1;
!     f_create_dirs = 1;
      f_list = 1;
      blocksize = 0;
      blocking = 0;

--- 237,244 -----
       * of the tar and/or cpio interfaces...
       */
      f_unconditional = 1;
!     f_mtime = 1;
!     f_dir_create = 1;
      f_list = 1;
      blocksize = 0;
      blocking = 0;
***************
*** 258,264
  	    f_reverse_match = 1;
  	    break;
  	case 'd':
! 	    f_create_dirs = 0;
  	    break;
  	case 'f':
  	    if (blocksize == 0) {

--- 261,267 -----
  	    f_reverse_match = 1;
  	    break;
  	case 'd':
! 	    f_dir_create = 0;
  	    break;
  	case 'f':
  	    if (blocksize == 0) {
***************
*** 274,280
  	    f_link = 1;
  	    break;
  	case 'm':
! 	    f_modification_time = 0;
  	    break;
  	case 'o':
  	    f_owner = 1;

--- 277,283 -----
  	    f_link = 1;
  	    break;
  	case 'm':
! 	    f_mtime = 0;
  	    break;
  	case 'o':
  	    f_owner = 1;
***************
*** 358,364
      } else if (f_pass && optind < n_argc) {
  	dirname = n_argv[--n_argc];
  	if (LSTAT(dirname, &st) < 0) {
! 	    fatal(syserr());
  	}
  	if ((st.sb_mode & S_IFMT) != S_IFDIR) {
  	    fatal("Not a directory");

--- 361,367 -----
      } else if (f_pass && optind < n_argc) {
  	dirname = n_argv[--n_argc];
  	if (LSTAT(dirname, &st) < 0) {
! 	    fatal(strerror());
  	}
  	if ((st.sb_mode & S_IFMT) != S_IFDIR) {
  	    fatal("Not a directory");
***************
*** 465,471
  	    number = number * 10 + *idx++ - '0';
  	switch (*idx++) {
  	case 'b':
! 	    result += number * 512;
  	    continue;
  	case 'k':
  	    result += number * 1024;

--- 468,474 -----
  	    number = number * 10 + *idx++ - '0';
  	switch (*idx++) {
  	case 'b':
! 	    result += number * 512L;
  	    continue;
  	case 'k':
  	    result += number * 1024L;
***************
*** 468,474
  	    result += number * 512;
  	    continue;
  	case 'k':
! 	    result += number * 1024;
  	    continue;
  	case 'm':
  	    result += number * 1024 * 1024;

--- 471,477 -----
  	    result += number * 512L;
  	    continue;
  	case 'k':
! 	    result += number * 1024L;
  	    continue;
  	case 'm':
  	    result += number * 1024L * 1024L;
***************
*** 471,477
  	    result += number * 1024;
  	    continue;
  	case 'm':
! 	    result += number * 1024 * 1024;
  	    continue;
  	case '+':
  	    result += number;

--- 474,480 -----
  	    result += number * 1024L;
  	    continue;
  	case 'm':
! 	    result += number * 1024L * 1024L;
  	    continue;
  	case '+':
  	    result += number;
***************
*** 515,522
  
  #endif
  {
!     fprintf(stderr, "\
! Usage: %s -[cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
      fprintf(stderr, "\
         %s -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",

--- 518,524 -----
  
  #endif
  {
!     fprintf(stderr, "Usage: %s -[cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
      fprintf(stderr, "       %s -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
***************
*** 518,525
      fprintf(stderr, "\
  Usage: %s -[cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
!     fprintf(stderr, "\
!        %s -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
      fprintf(stderr, "\
         %s -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]\n\

--- 520,526 -----
  {
      fprintf(stderr, "Usage: %s -[cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
!     fprintf(stderr, "       %s -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
      fprintf(stderr, "       %s -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]\n              [-t device] [-x format] [pathname...]\n",
  	myname);
***************
*** 521,529
      fprintf(stderr, "\
         %s -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
!     fprintf(stderr, "\
!        %s -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]\n\
! 	   [-t device] [-x format] [pathname...]\n",
  	myname);
      fprintf(stderr, "\
         %s -r -w [-ilmopuvy] [-s replstr] [pathname...] directory\n",

--- 522,528 -----
  	myname);
      fprintf(stderr, "       %s -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [pattern...]\n",
  	myname);
!     fprintf(stderr, "       %s -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]\n              [-t device] [-x format] [pathname...]\n",
  	myname);
      fprintf(stderr, "       %s -r -w [-ilmopuvy] [-s replstr] [pathname...] directory\n",
  	myname);
***************
*** 525,532
         %s -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]\n\
  	   [-t device] [-x format] [pathname...]\n",
  	myname);
!     fprintf(stderr, "\
!        %s -r -w [-ilmopuvy] [-s replstr] [pathname...] directory\n",
  	myname);
      exit(1);
  }

--- 524,530 -----
  	myname);
      fprintf(stderr, "       %s -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]\n              [-t device] [-x format] [pathname...]\n",
  	myname);
!     fprintf(stderr, "       %s -r -w [-ilmopuvy] [-s replstr] [pathname...] directory\n",
  	myname);
      exit(1);
  }
Index: pax.h
*** /tmp/,RCSt1a17118	Sun Feb 12 14:08:18 1989
--- pax.h	Sun Feb 12 14:02:26 1989
***************
*** 1,6
  /* $Source: /u/mark/src/pax/RCS/pax.h,v $
   *
!  * $Revision: 1.1 $
   *
   * pax.h - defnitions for entire program
   *

--- 1,6 -----
  /* $Source: /u/mark/src/pax/RCS/pax.h,v $
   *
!  * $Revision: 1.2 $
   *
   * pax.h - defnitions for entire program
   *
***************
*** 27,33
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   */
  
  #ifndef _PAX_H

--- 27,33 -----
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
!  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   */
  
  #ifndef _PAX_H
***************
*** 53,59
  #  include <dirent.h>
  # endif
  #else
! # include <sys/dir.h>
  # define dirent direct
  #endif
  

--- 53,67 -----
  #  include <dirent.h>
  # endif
  #else
! # ifdef hpux
! #  include <ndir.h>
! # else
! #  ifdef XENIX_286
! #   include <sys/ndir.h>
! #  else XENIX_286
! #   include <sys/dir.h>
! #  endif XENIX_286
! # endif /* hpux */
  # define dirent direct
  #endif
  
***************
*** 74,79
  #ifdef XENIX
  #   include <sys/inode.h>
  #endif
  
  #include <pwd.h>
  #include <grp.h>

--- 82,90 -----
  #ifdef XENIX
  #   include <sys/inode.h>
  #endif
+ #ifdef XENIX_286
+ #include <sys/param.h>
+ #endif XENIX_286
  
  #include <pwd.h>
  #include <grp.h>
***************
*** 77,82
  
  #include <pwd.h>
  #include <grp.h>
  #include <sys/file.h>
  
  /* Defines */

--- 88,94 -----
  
  #include <pwd.h>
  #include <grp.h>
+ #ifndef XENIX_286
  #include <sys/file.h>
  #endif XENIX_286
  
***************
*** 78,83
  #include <pwd.h>
  #include <grp.h>
  #include <sys/file.h>
  
  /* Defines */
  

--- 90,96 -----
  #include <grp.h>
  #ifndef XENIX_286
  #include <sys/file.h>
+ #endif XENIX_286
  
  /* Defines */
  
***************
*** 331,338
  extern short	f_pass;
  extern short	f_disposition;
  extern short    f_reverse_match;
! extern short    f_modification_time;
! extern short    f_create_dirs;
  extern short    f_unconditional;
  extern short    f_newer;
  extern time_t   now;

--- 344,351 -----
  extern short	f_pass;
  extern short	f_disposition;
  extern short    f_reverse_match;
! extern short    f_mtime;
! extern short    f_dir_create;
  extern short    f_unconditional;
  extern short    f_newer;
  extern time_t   now;
Index: paxdir.c
*** /tmp/,RCSt1a17123	Sun Feb 12 14:08:27 1989
--- paxdir.c	Sun Feb 12 14:02:28 1989
***************
*** 213,219
      struct stat     sbuf;	/* result of fstat() */
  
      if ((fd = open(dirname, O_RDONLY)) < 0)
! 	return NULL;		/* errno set by open() */
  
      if (fstat(fd, &sbuf) != 0 || !S_ISDIR(sbuf.st_mode)) {
  	close(fd);

--- 213,219 -----
      struct stat     sbuf;	/* result of fstat() */
  
      if ((fd = open(dirname, O_RDONLY)) < 0)
! 	return ((DIR *)NULL);		/* errno set by open() */
  
      if (fstat(fd, &sbuf) != 0 || !S_ISDIR(sbuf.st_mode)) {
  	close(fd);
***************
*** 218,224
      if (fstat(fd, &sbuf) != 0 || !S_ISDIR(sbuf.st_mode)) {
  	close(fd);
  	errno = ENOTDIR;
! 	return NULL;		/* not a directory */
      }
      if ((dirp = (DIR *) malloc(sizeof(DIR))) == NULL
  	|| (dirp->dd_buf = (char *) malloc((unsigned) DIRBUF)) == NULL

--- 218,224 -----
      if (fstat(fd, &sbuf) != 0 || !S_ISDIR(sbuf.st_mode)) {
  	close(fd);
  	errno = ENOTDIR;
! 	return ((DIR *)NULL);		/* not a directory */
      }
      if ((dirp = (DIR *) malloc(sizeof(DIR))) == (DIR *)NULL
  	|| (dirp->dd_buf = (char *) malloc((unsigned) DIRBUF)) == (char *)NULL
***************
*** 220,227
  	errno = ENOTDIR;
  	return NULL;		/* not a directory */
      }
!     if ((dirp = (DIR *) malloc(sizeof(DIR))) == NULL
! 	|| (dirp->dd_buf = (char *) malloc((unsigned) DIRBUF)) == NULL
  	) {
  	register int    serrno = errno;
  	/* errno set to ENOMEM by sbrk() */

--- 220,227 -----
  	errno = ENOTDIR;
  	return ((DIR *)NULL);		/* not a directory */
      }
!     if ((dirp = (DIR *) malloc(sizeof(DIR))) == (DIR *)NULL
! 	|| (dirp->dd_buf = (char *) malloc((unsigned) DIRBUF)) == (char *)NULL
  	) {
  	register int    serrno = errno;
  	/* errno set to ENOMEM by sbrk() */
***************
*** 226,232
  	register int    serrno = errno;
  	/* errno set to ENOMEM by sbrk() */
  
! 	if (dirp != NULL)
  	    free((pointer) dirp);
  
  	close(fd);

--- 226,232 -----
  	register int    serrno = errno;
  	/* errno set to ENOMEM by sbrk() */
  
! 	if (dirp != (DIR *)NULL)
  	    free((pointer) dirp);
  
  	close(fd);
***************
*** 231,237
  
  	close(fd);
  	errno = serrno;
! 	return NULL;		/* not enough memory */
      }
      dirp->dd_fd = fd;
      dirp->dd_loc = dirp->dd_size = 0;	/* refill needed */

--- 231,237 -----
  
  	close(fd);
  	errno = serrno;
! 	return ((DIR *)NULL);		/* not enough memory */
      }
      dirp->dd_fd = fd;
      dirp->dd_loc = dirp->dd_size = 0;	/* refill needed */
***************
*** 259,265
  {
      register int	fd;
  
!     if ( dirp == NULL || dirp->dd_buf == NULL ) {
  	errno = EFAULT;
  	return -1;			/* invalid pointer */
      }

--- 259,265 -----
  {
      register int	fd;
  
!     if ( dirp == (DIR *)NULL || dirp->dd_buf == (char *)NULL ) {
  	errno = EFAULT;
  	return -1;			/* invalid pointer */
      }
***************
*** 290,296
  {
      register struct dirent *dp;	/* -> directory data */
  
!     if (dirp == NULL || dirp->dd_buf == NULL) {
  	errno = EFAULT;
  	return NULL;		/* invalid pointer */
      }

--- 290,296 -----
  {
      register struct dirent *dp;	/* -> directory data */
  
!     if (dirp == (DIR *)NULL || dirp->dd_buf == (char *)NULL) {
  	errno = EFAULT;
  	return (struct dirent *)NULL;		/* invalid pointer */
      }
***************
*** 292,298
  
      if (dirp == NULL || dirp->dd_buf == NULL) {
  	errno = EFAULT;
! 	return NULL;		/* invalid pointer */
      }
      do {
  	if (dirp->dd_loc >= dirp->dd_size)	/* empty or obsolete */

--- 292,298 -----
  
      if (dirp == (DIR *)NULL || dirp->dd_buf == (char *)NULL) {
  	errno = EFAULT;
! 	return (struct dirent *)NULL;		/* invalid pointer */
      }
      do {
  	if (dirp->dd_loc >= dirp->dd_size)	/* empty or obsolete */
***************
*** 303,309
  		getdents(dirp->dd_fd, dirp->dd_buf, (unsigned) DIRBUF)
  		) <= 0
  	    )
! 	    return NULL;	/* EOF or error */
  
  	dp = (struct dirent *) & dirp->dd_buf[dirp->dd_loc];
  	dirp->dd_loc += dp->d_reclen;

--- 303,309 -----
  		getdents(dirp->dd_fd, dirp->dd_buf, (unsigned) DIRBUF)
  		) <= 0
  	    )
! 	    return ((struct dirent *)NULL);	/* EOF or error */
  
  	dp = (struct dirent *) & dirp->dd_buf[dirp->dd_loc];
  	dirp->dd_loc += dp->d_reclen;
***************
*** 340,346
  {
      register bool   rewind;	/* "start over when stymied" flag */
  
!     if (dirp == NULL || dirp->dd_buf == NULL) {
  	errno = EFAULT;
  	return;			/* invalid pointer */
      }

--- 340,346 -----
  {
      register bool   rewind;	/* "start over when stymied" flag */
  
!     if (dirp == (DIR *)NULL || dirp->dd_buf == (char *)NULL) {
  	errno = EFAULT;
  	return;			/* invalid pointer */
      }
***************
*** 372,378
  	/* See whether the matching entry is in the current buffer. */
  
  	if ((dirp->dd_loc < dirp->dd_size	/* valid index */
! 	     || readdir(dirp) != NULL	/* next buffer read */
  	     && (dirp->dd_loc = 0, true)	/* beginning of buffer set */
  	     )
  	    && (dp = (struct dirent *) & dirp->dd_buf[dirp->dd_loc])->d_off

--- 372,378 -----
  	/* See whether the matching entry is in the current buffer. */
  
  	if ((dirp->dd_loc < dirp->dd_size	/* valid index */
! 	     || readdir(dirp) != (struct dirent *)NULL	/* next buffer read */
  	     && (dirp->dd_loc = 0, true)	/* beginning of buffer set */
  	     )
  	    && (dp = (struct dirent *) & dirp->dd_buf[dirp->dd_loc])->d_off
***************
*** 442,448
  
  #endif
  {
!     if (dirp == NULL || dirp->dd_buf == NULL) {
  	errno = EFAULT;
  	return -1;		/* invalid pointer */
      }

--- 442,448 -----
  
  #endif
  {
!     if (dirp == (DIR *)NULL || dirp->dd_buf == (char *)NULL) {
  	errno = EFAULT;
  	return -1;		/* invalid pointer */
      }
***************
*** 593,599
      }
  #endif
  
!     if (buf == NULL
  #ifdef ATT_SPEC
  	|| (unsigned long) buf % sizeof(long) != 0	/* ugh */
  #endif

--- 593,599 -----
      }
  #endif
  
!     if (buf == (char *)NULL
  #ifdef ATT_SPEC
  	|| (unsigned long) buf % sizeof(long) != 0	/* ugh */
  #endif
-- 
Mark H. Colburn                  "Look into a child's eye;
Minnetech Consulting, Inc.        there's no hate and there's no lie;
mark@jhereg.mn.org                there's no black and there's no white."