X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fextract.c;h=96d487c490053d03e89d13952bbccb2a535a9435;hb=66e89f0fa59bb2907084585efbbc03af70949099;hp=5ca7a2676c835d28bc7b3f50885644e1dd975905;hpb=49086e2770abfa6ad6a7647e2d0707b607ee1bf8;p=chaz%2Ftar diff --git a/src/extract.c b/src/extract.c index 5ca7a26..96d487c 100644 --- a/src/extract.c +++ b/src/extract.c @@ -1,5 +1,5 @@ /* Extract files from a tar archive. - Copyright (C) 1988, 92, 93, 94, 96, 97 Free Software Foundation, Inc. + Copyright (C) 1988, 92,93,94,96,97,98, 1999 Free Software Foundation, Inc. Written by John Gilmore, on 1985-11-19. This program is free software; you can redistribute it and/or modify it @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., - 59 Place - Suite 330, Boston, MA 02111-1307, USA. */ + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "system.h" @@ -204,9 +204,9 @@ set_stat (char *file_name, struct stat *stat_info, int symlink_flag) /* On a few systems, and in particular, those allowing to give files away, changing the owner or group destroys the suid or sgid bits. - So, when root, let's attempt setting these bits once more. */ + So let's attempt setting these bits once more. */ - if (we_are_root && (stat_info->st_mode & (S_ISUID | S_ISGID | S_ISVTX))) + if (stat_info->st_mode & (S_ISUID | S_ISGID | S_ISVTX)) set_mode (file_name, stat_info); } } @@ -343,7 +343,7 @@ extract_sparse_file (int fd, off_t *sizeleft, off_t totalsize, char *name) written = sparsearray[sparse_ind++].numbytes; while (written > BLOCKSIZE) { - count = write (fd, data_block->buffer, BLOCKSIZE); + count = full_write (fd, data_block->buffer, BLOCKSIZE); if (count < 0) ERROR ((0, errno, _("%s: Could not write to file"), name)); written -= count; @@ -352,7 +352,7 @@ extract_sparse_file (int fd, off_t *sizeleft, off_t totalsize, char *name) data_block = find_next_block (); } - count = write (fd, data_block->buffer, written); + count = full_write (fd, data_block->buffer, written); if (count < 0) ERROR ((0, errno, _("%s: Could not write to file"), name)); @@ -392,6 +392,7 @@ extract_archive (void) off_t size; int skipcrud; int counter; + char typeflag; #if 0 int sparse_ind = 0; #endif @@ -447,7 +448,8 @@ Removing leading `/' from absolute path names in the archive"))); /* Extract the archive entry according to its type. */ - switch (current_header->header.typeflag) + typeflag = current_header->header.typeflag; + switch (typeflag) { /* JK - What we want to do if the file is sparse is loop through the array of sparse structures in the header and read in and @@ -480,8 +482,9 @@ Removing leading `/' from absolute path names in the archive"))); if (current_header->oldgnu_header.isextended) { - /* Read in the list of extended headers and translate them into - the sparsearray as before. */ + /* Read in the list of extended headers and translate them + into the sparsearray as before. Note that this + invalidates current_header. */ /* static */ int ind = SPARSES_IN_OLDGNU_HEADER; @@ -538,7 +541,7 @@ Removing leading `/' from absolute path names in the archive"))); openflag = (keep_old_files_option ? O_BINARY | O_NDELAY | O_WRONLY | O_CREAT | O_EXCL : O_BINARY | O_NDELAY | O_WRONLY | O_CREAT | O_TRUNC) - | ((current_header->header.typeflag == GNUTYPE_SPARSE) ? 0 : O_APPEND); + | ((typeflag == GNUTYPE_SPARSE) ? 0 : O_APPEND); /* JK - The last | is a kludge to solve the problem the O_APPEND flag causes with files we are trying to make sparse: when a file @@ -562,14 +565,14 @@ Removing leading `/' from absolute path names in the archive"))); /* Contiguous files (on the Masscomp) have to specify the size in the open call that creates them. */ - if (current_header->header.typeflag == CONTTYPE) + if (typeflag == CONTTYPE) fd = open (CURRENT_FILE_NAME, openflag | O_CTG, current_stat.st_mode, current_stat.st_size); else fd = open (CURRENT_FILE_NAME, openflag, current_stat.st_mode); #else /* not O_CTG */ - if (current_header->header.typeflag == CONTTYPE) + if (typeflag == CONTTYPE) { static int conttype_diagnosed = 0; @@ -599,7 +602,7 @@ Removing leading `/' from absolute path names in the archive"))); } extract_file: - if (current_header->header.typeflag == GNUTYPE_SPARSE) + if (typeflag == GNUTYPE_SPARSE) { char *name; size_t name_length_bis; @@ -644,7 +647,7 @@ Removing leading `/' from absolute path names in the archive"))); see how many bytes we want to write at that position. */ #if 0 - if (current_header->header.typeflag == GNUTYPE_SPARSE) + if (typeflag == GNUTYPE_SPARSE) { lseek (fd, sparsearray[sparse_ind].offset, 0); written = sparsearray[sparse_ind++].numbytes; @@ -656,7 +659,7 @@ Removing leading `/' from absolute path names in the archive"))); if (written > size) written = size; errno = 0; /* FIXME: errno should be read-only */ - sstatus = write (fd, data_block->buffer, written); + sstatus = full_write (fd, data_block->buffer, written); set_next_block_after ((union block *) (data_block->buffer + written - 1)); @@ -703,7 +706,7 @@ Removing leading `/' from absolute path names in the archive"))); written = SIZE_FROM_OCT (exhdr->sparse_header.sp[counter].numbytes); lseek (fd, offset, 0); - sstatus = write (fd, data_block->buffer, written); + sstatus = full_write (fd, data_block->buffer, written); if (sstatus == written) continue; } @@ -876,7 +879,7 @@ Attempting extraction of symbolic links as hard links"))); gnu_restore (skipcrud); } - else if (current_header->header.typeflag == GNUTYPE_DUMPDIR) + else if (typeflag == GNUTYPE_DUMPDIR) skip_file (current_stat.st_size); if (to_stdout_option) @@ -997,7 +1000,7 @@ Cannot extract `%s' -- file is continued from another volume"), default: WARN ((0, 0, _("Unknown file type '%c' for %s, extracted as normal file"), - current_header->header.typeflag, CURRENT_FILE_NAME)); + typeflag, CURRENT_FILE_NAME)); goto again_file; }