From c086e08a4bb931721b2bc8db545ecb3eeaa431dd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fran=C3=A7ois=20Pinard?= Date: Wed, 16 Nov 1994 02:56:34 +0000 Subject: [PATCH] *** empty log message *** --- README | 16 ++- src/makefile.pc | 17 +-- src/msd_dir.c | 277 +++++++++++++++++++++++++----------------------- src/msd_dir.h | 45 ++++---- src/names.c | 139 +++++++++++++----------- src/open3.h | 18 ++-- 6 files changed, 273 insertions(+), 239 deletions(-) diff --git a/README b/README index ae5153a..6783c57 100644 --- a/README +++ b/README @@ -21,9 +21,9 @@ of tar. makefile.pc is a makefile for Turbo C 2.0 on MS-DOS. -Various people have been having problems using floppies on a NeXT. -I've gotten conflicting reports about what should be done to solve the -problems, and we have no way to test it ourselves. +Various people have been having problems using floppies on a NeXT. In +order to have them work right, you need to kill the automounting +program which tries to monut floppies as soon as they are added. If you want to do incremental dumps, use the distributed backup scripts. They are what we use at the FSF to do all our backups. Most @@ -34,3 +34,13 @@ 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. + +If your system needs to link with -lPW to get alloca, but has +rename in the C library (so HAVE_RENAME is defined), -lPW might +give you an incorrect version of rename. On HP-UX this manifests +itself as an undefined data symbol called "Error" when linking cp, ln, +and mv. If this happens, use `ar x' to extract alloca.o from libPW.a +and `ar rc' to put it in a library liballoca.a, and put that in LIBS +instead of -lPW. This problem does not occur when using gcc, which +has alloca built in. + diff --git a/src/makefile.pc b/src/makefile.pc index 5a4f141..22abe52 100644 --- a/src/makefile.pc +++ b/src/makefile.pc @@ -1,4 +1,4 @@ -# Makefile for GNU tar on MS-DOS using Turbo C 2.0. +# Makefile for GNU tar on MS-DOS. # Copyright (C) 1991 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify @@ -15,18 +15,14 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -CC = tcc +CC = bcc RM = rm -f MODEL = m -DEFS = -DNONAMES -DNO_REMOTE -DNO_MTIO -DSTDC_HEADERS -m$(MODEL) -Dmain=_main +DEFS = -DNONAMES -DNO_REMOTE -DSTDC_HEADERS=1 -m$(MODEL) -Dmain=_main LIBS = -DEF_AR_FILE = tar.out -DEFBLOCKING = 20 -CFLAGS = -I. $(DEFS) \ - -DDEF_AR_FILE="$(DEF_AR_FILE)" \ - -DDEFBLOCKING=$(DEFBLOCKING) +CFLAGS = $(DEFS) LDFLAGS = -m$(MODEL) OBJ1 = tar.obj create.obj extract.obj buffer.obj getoldopt.obj update.obj gnu.obj mangle.obj @@ -43,6 +39,11 @@ tar: testpad.h getdate.c $(OBJS) .c.obj: $(CC) -c $(CFLAGS) $< +# For some reason, Borland C++ 3.1 chokes on this file when given +# the full set of -D options. +getoldopt.obj: getoldopt.c + $(CC) -c -m$(MODEL) -DSTDC_HEADERS getoldopt.c + testpad.h: testpad.exe testpad diff --git a/src/msd_dir.c b/src/msd_dir.c index a902d70..2741407 100644 --- a/src/msd_dir.c +++ b/src/msd_dir.c @@ -19,11 +19,11 @@ #ifndef NULL # define NULL 0 -#endif /* NULL */ +#endif /* NULL */ #ifndef MAXPATHLEN # define MAXPATHLEN 255 -#endif /* MAXPATHLEN */ +#endif /* MAXPATHLEN */ /* attribute stuff */ #define A_RONLY 0x01 @@ -43,178 +43,187 @@ #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; +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; +static struct SREGS sreg; #endif -DIR * -opendir(name) - char *name; +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; + 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; +closedir (dirp) + DIR *dirp; { - free_dircontents(dirp->dd_contents); - free((char *) dirp); + free_dircontents (dirp->dd_contents); + free ((char *) dirp); } -struct dirent * -readdir(dirp) - DIR *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; + 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; +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 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; +telldir (dirp) + DIR *dirp; { - return dirp->dd_loc; + return dirp->dd_loc; } -static void -free_dircontents(dp) - struct _dircontents *dp; +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); - } + 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; +static char * +getdirent (dir) + char *dir; { - if (dir != (char *) NULL) { /* get first entry */ - reg.h.ah = DOSI_FINDF; - reg.h.cl = ATTRIBUTES; + 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); + reg.x.dx = FP_OFF (dir); + sreg.ds = FP_SEG (dir); #else - reg.x.dx = (unsigned) dir; + reg.x.dx = (unsigned) dir; #endif - } else { /* get next entry */ - reg.h.ah = DOSI_FINDN; + } + else + { /* get next entry */ + reg.h.ah = DOSI_FINDN; #if defined(M_I86LM) - reg.x.dx = FP_OFF(dtapnt); - sreg.ds = FP_SEG(dtapnt); + reg.x.dx = FP_OFF (dtapnt); + sreg.ds = FP_SEG (dtapnt); #else - reg.x.dx = (unsigned) dtapnt; + reg.x.dx = (unsigned) dtapnt; #endif - } + } #if defined(M_I86LM) - intdosx(®, &nreg, &sreg); + intdosx (®, &nreg, &sreg); #else - intdos(®, &nreg); + intdos (®, &nreg); #endif - if (nreg.x.cflag) - return (char *) NULL; + if (nreg.x.cflag) + return (char *) NULL; - return dtabuf.d_name; + return dtabuf.d_name; } -static void -mysetdta() +static void +mysetdta () { - reg.h.ah = DOSI_SDTA; + reg.h.ah = DOSI_SDTA; #if defined(M_I86LM) - reg.x.dx = FP_OFF(dtapnt); - sreg.ds = FP_SEG(dtapnt); - intdosx(®, &nreg, &sreg); + reg.x.dx = FP_OFF (dtapnt); + sreg.ds = FP_SEG (dtapnt); + intdosx (®, &nreg, &sreg); #else - reg.x.dx = (int) dtapnt; - intdos(®, &nreg); + reg.x.dx = (int) dtapnt; + intdos (®, &nreg); #endif } diff --git a/src/msd_dir.h b/src/msd_dir.h index f953133..06c7a64 100644 --- a/src/msd_dir.h +++ b/src/msd_dir.h @@ -15,27 +15,30 @@ 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 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; -}; +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; +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(); +extern DIR *opendir (); +extern struct dirent *readdir (); +extern void seekdir (); +extern long telldir (); +extern void closedir (); diff --git a/src/names.c b/src/names.c index acd7857..0de6a88 100644 --- a/src/names.c +++ b/src/names.c @@ -22,7 +22,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ * * This file should be modified for non-unix systems to do something * reasonable. - */ + */ #include #include "tar.h" @@ -34,13 +34,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include -static int saveuid = -993; -static char saveuname[TUNMLEN]; -static int my_uid = -993; +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; +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 ) @@ -54,85 +54,96 @@ static int my_gid = -993; * pages" code, roughly doubling the program size. Thanks guys. */ void -finduname(uname, uid) - char uname[TUNMLEN]; - int uid; +finduname (uname, uid) + char uname[TUNMLEN]; + int uid; { - struct passwd *pw; + struct passwd *pw; #ifndef HAVE_GETPWUID - extern struct passwd *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); + 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]; +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; - } + 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; + } + return saveuid; } void -findgname(gname, gid) - char gname[TGNMLEN]; - int gid; +findgname (gname, gid) + char gname[TGNMLEN]; + int gid; { - struct group *gr; + struct group *gr; #ifndef HAVE_GETGRGID - extern struct group *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); + 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]; +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; - } + 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; + } + return savegid; } + #endif diff --git a/src/open3.h b/src/open3.h index 9ea2b4f..c1c0e59 100644 --- a/src/open3.h +++ b/src/open3.h @@ -22,7 +22,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ * 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. + * 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 @@ -38,9 +38,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ */ /* 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 */ +#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. */ /* @@ -50,13 +50,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ * it defined. */ #ifndef O_NDELAY -#define O_NDELAY 4 /* don't block on opening devices that would +#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 */ +#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 /* -- 2.44.0