X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=62b9c51178f485075fc6e2df2797b2c7c25d4d81;hb=5aac7fa0e7b3ff355d23f8f27f6eee25452fd56a;hp=639507c3da1d711a605dca6212af155456836987;hpb=f4f09d0626de7ff0d9d3643aa453f90be82c7791;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index 639507c..62b9c51 100644 --- a/src/create.c +++ b/src/create.c @@ -1,5 +1,5 @@ /* Create a tar archive. - Copyright (C) 1985, 1992 Free Software Foundation + Copyright (C) 1985, 1992, 1993 Free Software Foundation This file is part of GNU Tar. @@ -60,28 +60,6 @@ struct utimbuf #endif -#if defined(_POSIX_VERSION) || defined(DIRENT) -#include -#ifdef direct -#undef direct -#endif /* direct */ -#define direct dirent -#define DP_NAMELEN(x) strlen((x)->d_name) -#endif /* _POSIX_VERSION or DIRENT */ -#if !defined(_POSIX_VERSION) && !defined(DIRENT) && defined(BSD42) -#include -#define DP_NAMELEN(x) (x)->d_namlen -#endif /* not _POSIX_VERSION and BSD42 */ -#ifdef __MSDOS__ -#include "msd_dir.h" -#define DP_NAMELEN(x) (x)->d_namlen -#define direct dirent -#endif -#if defined(USG) && !defined(_POSIX_VERSION) && !defined(DIRENT) -#include -#define DP_NAMELEN(x) strlen((x)->d_name) -#endif /* USG and not _POSIX_VERSION and not DIRENT */ - extern struct stat hstat; /* Stat struct corresponding */ #ifndef __MSDOS__ @@ -192,10 +170,8 @@ create_archive () } else { - p = name_next (1); - do + while (p = name_next (1)) dump_file (p, -1, 1); - while (p = name_next (1)); } write_eot (); @@ -277,7 +253,7 @@ dump_file (p, curdev, toplevel) && !S_ISDIR (hstat.st_mode) && (f_new_files > 1 || new_time > hstat.st_ctime)) { - if (curdev < 0) + if (curdev == -1) { msg ("%s: is unchanged; not dumped", p); } @@ -367,7 +343,7 @@ dump_file (p, curdev, toplevel) } /* Not found. Add it to the list of possible links. */ - lp = (struct link *) malloc ((unsigned) (sizeof (struct link) + strlen (p))); + lp = (struct link *) ck_malloc ((unsigned) (sizeof (struct link) + strlen (p))); if (!lp) { if (!nolinks) @@ -558,7 +534,7 @@ dump_file (p, curdev, toplevel) /* sum += i; if (sum < upperbound) goto extend;*/ - if (index_offset + i < upperbound) + if (index_offset + i <= upperbound) { index_offset += i; exhdr->ext_hdr.isextended++; @@ -686,7 +662,7 @@ dump_file (p, curdev, toplevel) else if (S_ISDIR (hstat.st_mode)) { register DIR *dirp; - register struct direct *d; + register struct dirent *d; char *namebuf; int buflen; register int len; @@ -831,9 +807,9 @@ dump_file (p, curdev, toplevel) if (is_dot_or_dotdot (d->d_name)) continue; - if (DP_NAMELEN (d) + len >= buflen) + if (NLENGTH (d) + len >= buflen) { - buflen = len + DP_NAMELEN (d); + buflen = len + NLENGTH (d); namebuf = ck_realloc (namebuf, buflen + 1); /* namebuf[len]='\0'; msg("file name %s%s too long", @@ -1014,7 +990,7 @@ init_sparsearray () /* * Make room for our scratch space -- initially is 10 elts long */ - sparsearray = (struct sp_array *) malloc (sp_array_size * sizeof (struct sp_array)); + sparsearray = (struct sp_array *) ck_malloc (sp_array_size * sizeof (struct sp_array)); for (i = 0; i < sp_array_size; i++) { sparsearray[i].offset = 0; @@ -1079,7 +1055,7 @@ deal_with_sparse (name, header, nulls_at_end) * realloc the scratch area, since we've run out of room -- */ sparsearray = (struct sp_array *) - realloc (sparsearray, + ck_realloc (sparsearray, 2 * sp_array_size * (sizeof (struct sp_array))); sp_array_size *= 2; } @@ -1129,6 +1105,11 @@ deal_with_sparse (name, header, nulls_at_end) } if (amidst_data) sparsearray[sparse_ind++].numbytes = numbytes; + else + { + sparsearray[sparse_ind].offset = offset-1; + sparsearray[sparse_ind++].numbytes = 1; + } close (fd); return sparse_ind - 1; @@ -1295,7 +1276,7 @@ start_header (name, st) strncpy (header->header.arch_name, name, NAMSIZ); header->header.arch_name[NAMSIZ - 1] = '\0'; - to_oct ((long) (st->st_mode & 07777), + to_oct ((long) (f_oldarch ? (st->st_mode & 07777) : st->st_mode), 8, header->header.mode); to_oct ((long) st->st_uid, 8, header->header.uid); to_oct ((long) st->st_gid, 8, header->header.gid);