Pārlūkot izejas kodu

*** empty log message ***

François Pinard 30 gadi atpakaļ
vecāks
revīzija
e4b2fc0bd9
6 mainītis faili ar 469 papildinājumiem un 53 dzēšanām
  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.
 
 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.
 
@@ -32,55 +34,3 @@ incremental dumps, use +incremental (-G).)
 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.
 
-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)
 
 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
 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