浏览代码

*** empty log message ***

François Pinard 30 年之前
父节点
当前提交
e4b2fc0bd9
共有 6 个文件被更改,包括 469 次插入53 次删除
  1. 2 52
      README
  2. 1 1
      src/makefile.pc
  3. 220 0
      src/msd_dir.c
  4. 41 0
      src/msd_dir.h
  5. 138 0
      src/names.c
  6. 67 0
      src/open3.h

+ 2 - 52
README

@@ -15,6 +15,8 @@ This distribution also includes rmt, the remote tape server (which
 must reside in /etc).  The mt program is in the GNU cpio distribution.
 must reside in /etc).  The mt program is in the GNU cpio distribution.
 
 
 See the file INSTALL for compilation and installation instructions for Unix.
 See the file INSTALL for compilation and installation instructions for Unix.
+See the file NEWS for information on all that is new in this version
+of tar.
 
 
 makefile.pc is a makefile for Turbo C 2.0 on MS-DOS.
 makefile.pc is a makefile for Turbo C 2.0 on MS-DOS.
 
 
@@ -32,55 +34,3 @@ incremental dumps, use +incremental (-G).)
 There is no tar manual in this release.  The old manual has too many
 There is no tar manual in this release.  The old manual has too many
 problems to make it usable.  A new manual will appear in version 1.12.
 problems to make it usable.  A new manual will appear in version 1.12.
 
 
-User-visible changes since 1.10:
-
-o Many bug fixes
-
-o Now uses GNU standard configure, generated by Autoconf.
-
-o Long options now use `--'; use of `+' is deprecated and support for it
-  will eventually be removed.
-
-o New option --null causes filenames read by -T to be null-terminated,
-  and causes -C to be ignored.
-
-o New option --remove-files deletes files (but not directories) after
-  they are added to the archive.
-
-o New option --ignore-failed-read prevents read-errors from affecting
-  the exit status.
-
-o New option --checkpoint prints occasional messages as the tape is
-  being read or written.
-
-o New option --show-omitted-dirs prints the names of directories
-  omitted from the archive.
-
-o Some tape drives which use a non-standard method of indicating
-  end-of-tape now work correctly with multi-tape archives.
-
-o --volno-file: Read the volume number used in prompting the user (but
-  not in recording volume ID's on the archive) from a file.
-
-o When using --multi-volume, you can now give multiple -f arguments;
-  the various tape drives will get used in sequence and then wrap
-  around to the beginning.
-
-o Remote archive names no longer have to be in /dev: any file with a
-  `:' is interpreted as remote.  If new option --force-local is given,
-  then even archive files with a `:' are considered local.
-
-o New option --atime-preserve restores (if possible) atimes to their
-  original values after dumping the file.
-
-o No longer does tar confusingly dump "." when you don't tell it what
-  to dump.
-
-o When extracting directories, tar now correctly restores their
-  modification and access times.
-
-o Longnames support is redone differently--long name info directly
-  precedes the long-named file or link in the archive, so you no
-  longer have to wait for the extract to hit the end of the tape for
-  long names to work.
-

+ 1 - 1
src/makefile.pc

@@ -30,7 +30,7 @@ CFLAGS = -I. $(DEFS) \
 LDFLAGS = -m$(MODEL)
 LDFLAGS = -m$(MODEL)
 
 
 OBJ1 =	tar.obj create.obj extract.obj buffer.obj getoldopt.obj update.obj gnu.obj mangle.obj
 OBJ1 =	tar.obj create.obj extract.obj buffer.obj getoldopt.obj update.obj gnu.obj mangle.obj
-OBJ2 =	version.obj list.obj names.obj diffarch.obj port.obj wildmat.obj getopt.obj
+OBJ2 =	version.obj list.obj names.obj diffarch.obj port.obj fnmatch.obj getopt.obj
 OBJ3 =  getopt1.obj regex.obj getdate.obj alloca.obj tcexparg.obj msd_dir.obj
 OBJ3 =  getopt1.obj regex.obj getdate.obj alloca.obj tcexparg.obj msd_dir.obj
 OBJS =	$(OBJ1) $(OBJ2) $(OBJ3)
 OBJS =	$(OBJ1) $(OBJ2) $(OBJ3)
 
 

+ 220 - 0
src/msd_dir.c

@@ -0,0 +1,220 @@
+/*
+ * @(#)msd_dir.c 1.4 87/11/06	Public Domain.
+ *
+ *  A public domain implementation of BSD directory routines for
+ *  MS-DOS.  Written by Michael Rendell ({uunet,utai}michael@garfield),
+ *  August 1897
+ */
+
+#include	<sys/types.h>
+#include	<sys/stat.h>
+#include	"msd_dir.h"
+#ifndef __TURBOC__
+#include	<malloc.h>
+#else
+#include	<stdlib.h>
+#endif
+#include	<string.h>
+#include	<dos.h>
+
+#ifndef	NULL
+# define	NULL	0
+#endif	/* NULL */
+
+#ifndef	MAXPATHLEN
+# define	MAXPATHLEN	255
+#endif	/* MAXPATHLEN */
+
+/* attribute stuff */
+#define	A_RONLY		0x01
+#define	A_HIDDEN	0x02
+#define	A_SYSTEM	0x04
+#define	A_LABEL		0x08
+#define	A_DIR		0x10
+#define	A_ARCHIVE	0x20
+
+/* dos call values */
+#define	DOSI_FINDF	0x4e
+#define	DOSI_FINDN	0x4f
+#define	DOSI_SDTA	0x1a
+
+#define	Newisnull(a, t)		((a = (t *) malloc(sizeof(t))) == (t *) NULL)
+/* #define	ATTRIBUTES		(A_DIR | A_HIDDEN | A_SYSTEM) */
+#define ATTRIBUTES	(A_RONLY | A_SYSTEM | A_DIR)
+
+/* what find first/next calls look use */
+typedef struct {
+	char		d_buf[21];
+	char		d_attribute;
+	unsigned short	d_time;
+	unsigned short	d_date;
+	long		d_size;
+	char		d_name[13];
+} Dta_buf;
+
+static	char	*getdirent();
+static	void	mysetdta();
+static	void	free_dircontents();
+
+static	Dta_buf		dtabuf;
+static	Dta_buf		*dtapnt = &dtabuf;
+static	union REGS	reg, nreg;
+
+#if	defined(M_I86LM)
+static	struct SREGS	sreg;
+#endif
+
+DIR	*
+opendir(name)
+	char	*name;
+{
+	struct	stat		statb;
+	DIR			*dirp;
+	char			c;
+	char			*s;
+	struct _dircontents	*dp;
+	char			nbuf[MAXPATHLEN + 1];
+	
+	if (stat(name, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR)
+		return (DIR *) NULL;
+	if (Newisnull(dirp, DIR))
+		return (DIR *) NULL;
+	if (*name && (c = name[strlen(name) - 1]) != '\\' && c != '/')
+		(void) strcat(strcpy(nbuf, name), "\\*.*");
+	else
+		(void) strcat(strcpy(nbuf, name), "*.*");
+	dirp->dd_loc = 0;
+	mysetdta();
+	dirp->dd_contents = dirp->dd_cp = (struct _dircontents *) NULL;
+	if ((s = getdirent(nbuf)) == (char *) NULL)
+		return dirp;
+	do {
+		if (Newisnull(dp, struct _dircontents) || (dp->_d_entry =
+			malloc((unsigned) (strlen(s) + 1))) == (char *) NULL)
+		{
+			if (dp)
+				free((char *) dp);
+			free_dircontents(dirp->dd_contents);
+			return (DIR *) NULL;
+		}
+		if (dirp->dd_contents)
+			dirp->dd_cp = dirp->dd_cp->_d_next = dp;
+		else
+			dirp->dd_contents = dirp->dd_cp = dp;
+		(void) strcpy(dp->_d_entry, s);
+		dp->_d_next = (struct _dircontents *) NULL;
+	} while ((s = getdirent((char *) NULL)) != (char *) NULL);
+	dirp->dd_cp = dirp->dd_contents;
+
+	return dirp;
+}
+
+void
+closedir(dirp)
+	DIR	*dirp;
+{
+	free_dircontents(dirp->dd_contents);
+	free((char *) dirp);
+}
+
+struct dirent	*
+readdir(dirp)
+	DIR	*dirp;
+{
+	static	struct dirent	dp;
+	
+	if (dirp->dd_cp == (struct _dircontents *) NULL)
+		return (struct dirent *) NULL;
+	dp.d_namlen = dp.d_reclen =
+		strlen(strcpy(dp.d_name, dirp->dd_cp->_d_entry));
+	strlwr(dp.d_name);		/* JF */
+	dp.d_ino = 0;
+	dirp->dd_cp = dirp->dd_cp->_d_next;
+	dirp->dd_loc++;
+
+	return &dp;
+}
+
+void
+seekdir(dirp, off)
+	DIR	*dirp;
+	long	off;
+{
+	long			i = off;
+	struct _dircontents	*dp;
+
+	if (off < 0)
+		return;
+	for (dp = dirp->dd_contents ; --i >= 0 && dp ; dp = dp->_d_next)
+		;
+	dirp->dd_loc = off - (i + 1);
+	dirp->dd_cp = dp;
+}
+
+long
+telldir(dirp)
+	DIR	*dirp;
+{
+	return dirp->dd_loc;
+}
+
+static	void
+free_dircontents(dp)
+	struct	_dircontents	*dp;
+{
+	struct _dircontents	*odp;
+
+	while (dp) {
+		if (dp->_d_entry)
+			free(dp->_d_entry);
+		dp = (odp = dp)->_d_next;
+		free((char *) odp);
+	}
+}
+
+static	char	*
+getdirent(dir)
+	char	*dir;
+{
+	if (dir != (char *) NULL) {		/* get first entry */
+		reg.h.ah = DOSI_FINDF;
+		reg.h.cl = ATTRIBUTES;
+#if	defined(M_I86LM)
+		reg.x.dx = FP_OFF(dir);
+		sreg.ds = FP_SEG(dir);
+#else
+		reg.x.dx = (unsigned) dir;
+#endif
+	} else {				/* get next entry */
+		reg.h.ah = DOSI_FINDN;
+#if	defined(M_I86LM)
+		reg.x.dx = FP_OFF(dtapnt);
+		sreg.ds = FP_SEG(dtapnt);
+#else
+		reg.x.dx = (unsigned) dtapnt;
+#endif
+	}
+#if	defined(M_I86LM)
+	intdosx(&reg, &nreg, &sreg);
+#else
+	intdos(&reg, &nreg);
+#endif
+	if (nreg.x.cflag)
+		return (char *) NULL;
+
+	return dtabuf.d_name;
+}
+
+static	void
+mysetdta()
+{
+	reg.h.ah = DOSI_SDTA;
+#if	defined(M_I86LM)
+	reg.x.dx = FP_OFF(dtapnt);
+	sreg.ds = FP_SEG(dtapnt);
+	intdosx(&reg, &nreg, &sreg);
+#else
+	reg.x.dx = (int) dtapnt;
+	intdos(&reg, &nreg);
+#endif
+}

+ 41 - 0
src/msd_dir.h

@@ -0,0 +1,41 @@
+/*
+ * @(#)msd_dir.h 1.4 87/11/06	Public Domain.
+ *
+ *  A public domain implementation of BSD directory routines for
+ *  MS-DOS.  Written by Michael Rendell ({uunet,utai}michael@garfield),
+ *  August 1897
+ */
+
+#define	rewinddir(dirp)	seekdir(dirp, 0L)
+
+#define	MAXNAMLEN	12
+
+#ifdef __TURBOC__
+typedef int ino_t;
+typedef int dev_t;
+#endif
+
+struct dirent {
+	ino_t	d_ino;			/* a bit of a farce */
+	int	d_reclen;		/* more farce */
+	int	d_namlen;		/* length of d_name */
+	char	d_name[MAXNAMLEN + 1];		/* garentee null termination */
+};
+
+struct _dircontents {
+	char	*_d_entry;
+	struct _dircontents	*_d_next;
+};
+
+typedef struct _dirdesc {
+	int		dd_id;	/* uniquely identify each open directory */
+	long		dd_loc;	/* where we are in directory entry is this */
+	struct _dircontents	*dd_contents;	/* pointer to contents of dir */
+	struct _dircontents	*dd_cp;	/* pointer to current position */
+} DIR;
+
+extern	DIR		*opendir();
+extern	struct dirent	*readdir();
+extern	void		seekdir();
+extern	long		telldir();
+extern	void		closedir();

+ 138 - 0
src/names.c

@@ -0,0 +1,138 @@
+/* Look up user and/or group names.
+   Copyright (C) 1988, 1992 Free Software Foundation
+
+This file is part of GNU Tar.
+
+GNU Tar is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Tar is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Tar; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/*
+ * Look up user and/or group names.
+ *
+ * This file should be modified for non-unix systems to do something
+ * reasonable.
+ */ 
+
+#include <sys/types.h>
+#include "tar.h"
+#include "port.h"
+
+#ifndef NONAMES
+/* Whole module goes away if NONAMES defined.  Otherwise... */
+#include <stdio.h>
+#include <pwd.h>
+#include <grp.h>
+
+static int	saveuid = -993;
+static char	saveuname[TUNMLEN];
+static int	my_uid = -993;
+
+static int	savegid = -993;
+static char	savegname[TGNMLEN];
+static int	my_gid = -993;
+
+#define myuid	( my_uid < 0? (my_uid = getuid()): my_uid )
+#define	mygid	( my_gid < 0? (my_gid = getgid()): my_gid )
+
+/*
+ * Look up a user or group name from a uid/gid, maintaining a cache.
+ * FIXME, for now it's a one-entry cache.
+ * FIXME2, the "-993" is to reduce the chance of a hit on the first lookup.
+ *
+ * This is ifdef'd because on Suns, it drags in about 38K of "yellow
+ * pages" code, roughly doubling the program size.  Thanks guys.
+ */
+void
+finduname(uname, uid)
+	char	uname[TUNMLEN];
+	int	uid;
+{
+	struct passwd	*pw;
+#ifndef HAVE_GETPWUID
+	extern struct passwd *getpwuid ();
+#endif
+
+	if (uid != saveuid) {
+		saveuid = uid;
+		saveuname[0] = '\0';
+		pw = getpwuid(uid); 
+		if (pw) 
+			strncpy(saveuname, pw->pw_name, TUNMLEN);
+	}
+	strncpy(uname, saveuname, TUNMLEN);
+}
+
+int
+finduid(uname)
+	char	uname[TUNMLEN];
+{
+	struct passwd	*pw;
+	extern struct passwd *getpwnam();
+
+	if (uname[0] != saveuname[0]	/* Quick test w/o proc call */
+	    || 0!=strncmp(uname, saveuname, TUNMLEN)) {
+		strncpy(saveuname, uname, TUNMLEN);
+		pw = getpwnam(uname); 
+		if (pw) {
+			saveuid = pw->pw_uid;
+		} else {
+			saveuid = myuid;
+		}
+	}
+	return saveuid;
+}
+
+
+void
+findgname(gname, gid)
+	char	gname[TGNMLEN];
+	int	gid;
+{
+	struct group	*gr;
+#ifndef HAVE_GETGRGID
+	extern struct group *getgrgid ();
+#endif
+
+	if (gid != savegid) {
+		savegid = gid;
+		savegname[0] = '\0';
+		(void)setgrent();
+		gr = getgrgid(gid); 
+		if (gr) 
+			strncpy(savegname, gr->gr_name, TGNMLEN);
+	}
+	(void) strncpy(gname, savegname, TGNMLEN);
+}
+
+
+int
+findgid(gname)
+	char	gname[TUNMLEN];
+{
+	struct group	*gr;
+	extern struct group *getgrnam();
+
+	if (gname[0] != savegname[0]	/* Quick test w/o proc call */
+	    || 0!=strncmp(gname, savegname, TUNMLEN)) {
+		strncpy(savegname, gname, TUNMLEN);
+		gr = getgrnam(gname); 
+		if (gr) {
+			savegid = gr->gr_gid;
+		} else {
+			savegid = mygid;
+		}
+	}
+	return savegid;
+}
+#endif

+ 67 - 0
src/open3.h

@@ -0,0 +1,67 @@
+/* Defines for Sys V style 3-argument open call.
+   Copyright (C) 1988 Free Software Foundation
+
+This file is part of GNU Tar.
+
+GNU Tar is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Tar is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Tar; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/*
+ * open3.h -- #defines for the various flags for the Sys V style 3-argument
+ * open() call.  On BSD or System 5, the system already has this in an
+ * include file.  This file is needed for V7 and MINIX systems for the
+ * benefit of open3() in port.c, a routine that emulates the 3-argument
+ * call using system calls available on V7/MINIX. 
+ *
+ * This file is needed by PD tar even if we aren't using the
+ * emulator, since the #defines for O_WRONLY, etc. are used in
+ * a couple of places besides the open() calls, (e.g. in the assignment
+ * to openflag in extract.c).  We just #include this rather than
+ * #ifdef them out.
+ *
+ * Written 6/10/87 by rmtodd@uokmax (Richard Todd).
+ *
+ * The names have been changed by John Gilmore, 31 July 1987, since
+ * Richard called it "bsdopen", and really this change was introduced in
+ * AT&T Unix systems before BSD picked it up.
+ */
+
+/* Only one of the next three should be specified */
+#define O_RDONLY	 0 /* only allow read */
+#define	O_WRONLY	 1 /* only allow write */
+#define	O_RDWR		 2 /* both are allowed */
+
+/* The rest of these can be OR-ed in to the above. */
+/*
+ * O_NDELAY isn't implemented by the emulator.  It's only useful (to tar) on
+ * systems that have named pipes anyway; it prevents tar's hanging by
+ * opening a named pipe.  We #ifndef it because some systems already have
+ * it defined.
+ */
+#ifndef O_NDELAY
+#define O_NDELAY	 4 /* don't block on opening devices that would
+			    * block on open -- ignored by emulator. */
+#endif
+#define O_CREAT		 8 /* create file if needed */
+#define O_EXCL		16 /* file cannot already exist */
+#define O_TRUNC		32 /* truncate file on open */
+#define O_APPEND	64 /* always write at end of file -- ignored by emul */
+
+#ifdef EMUL_OPEN3
+/*
+ * make emulation transparent to rest of file -- redirect all open() calls
+ * to our routine
+ */
+#define open	open3
+#endif