*
* Note, that as of BusyBox-0.43, tar has been completely rewritten from the
* ground up. It still has remnents of the old code lying about, but it is
- * very different now (i.e. cleaner, less global variables, etc)
+ * very different now (i.e., cleaner, less global variables, etc.)
*
* Copyright (C) 1999,2000,2001 by Lineo, inc.
* Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
gid_t gid; /* Numeric GID */
size_t size; /* Size of file */
time_t mtime; /* Last-modified time */
- enum TarFileType type; /* Regular, directory, link, etc */
+ enum TarFileType type; /* Regular, directory, link, etc. */
char * linkname; /* Name for symbolic and hard links */
long devmajor; /* Major number for special device */
long devminor; /* Minor number for special device */
fixUpPermissions(TarInfo *header)
{
struct utimbuf t;
- /* Now set permissions etc for the new file */
+ /* Now set permissions etc. for the new file */
chown(header->name, header->uid, header->gid);
chmod(header->name, header->mode);
/* Reset the time */
static int
tarExtractDirectory(TarInfo *header, int extractFlag, int tostdoutFlag)
{
+ int result;
if (extractFlag==FALSE || tostdoutFlag==TRUE)
return( TRUE);
/* make the final component, just in case it was
* omitted by create_path() (which will skip the
* directory if it doesn't have a terminating '/') */
- if (mkdir(header->name, header->mode) < 0 && errno != EEXIST) {
+ result = mkdir(header->name, header->mode);
+ /* Don't fix permissions on pre-existing directories */
+ if (result == 0) {
+ fixUpPermissions(header);
+ } else if (result < 0 && errno != EEXIST) {
perror_msg("%s", header->name);
return FALSE;
}
- fixUpPermissions(header);
return( TRUE);
}
return( FALSE);
}
- /* Now set permissions etc for the new directory */
+ /* Now set permissions etc. for the new directory */
fixUpPermissions(header);
return( TRUE);
}
}
}
- /* Now set permissions etc for the new directory */
+ /* Now set permissions etc. for the new directory */
fixUpPermissions(header);
return( TRUE);
}
static int alreadyWarned=FALSE;
while (*(header->name) == '/')
- ++*(header->name);
+ header->name++;
if (alreadyWarned == FALSE) {
error_msg("Removing leading '/' from member names");
strncpy(header.linkname, tbInfo->hlInfo->name, sizeof(header.linkname));
} else if (S_ISLNK(statbuf->st_mode)) {
char *lpath = xreadlink(real_name);
+ if (!lpath) /* Already printed err msg inside xreadlink() */
+ return ( FALSE);
header.typeflag = SYMTYPE;
strncpy(header.linkname, lpath, sizeof(header.linkname));
free(lpath);
return ( FALSE);
}
- /* Calculate and store the checksum (i.e. the sum of all of the bytes of
+ /* Calculate and store the checksum (i.e., the sum of all of the bytes of
* the header). The checksum field must be filled with blanks for the
* calculation. The checksum field is formatted differently from the
* other fields: it has [6] digits, a null, then a space -- rather than