From 86e0a22ec602f929b1f3b1bd7d7b2f41cc86638c Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 24 Sep 2007 19:07:57 +0000 Subject: tar: strip leading '/' BEFORE memorizing hardlink's name function old new delta writeFileToTarball 1362 1352 -10 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-10) Total: -10 bytes --- archival/tar.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'archival') diff --git a/archival/tar.c b/archival/tar.c index 11f5ebac0..bbda52d14 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -386,6 +386,20 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf, const char *header_name; int inputFileFd = -1; + header_name = fileName; + while (header_name[0] == '/') { + static smallint warned; + + if (!warned) { + bb_error_msg("removing leading '/' from member names"); + warned = 1; + } + header_name++; + } + + if (header_name[0] == '\0') + return TRUE; + /* * Check to see if we are dealing with a hard link. * If so - @@ -397,7 +411,7 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf, if (statbuf->st_nlink > 1) { tbInfo->hlInfo = findHardLinkInfo(tbInfo->hlInfoHead, statbuf); if (tbInfo->hlInfo == NULL) - addHardLinkInfo(&tbInfo->hlInfoHead, statbuf, fileName); + addHardLinkInfo(&tbInfo->hlInfoHead, statbuf, header_name); } /* It is against the rules to archive a socket */ @@ -409,36 +423,23 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf, /* It is a bad idea to store the archive we are in the process of creating, * so check the device and inode to be sure that this particular file isn't * the new tarball */ - if (tbInfo->statBuf.st_dev == statbuf->st_dev && - tbInfo->statBuf.st_ino == statbuf->st_ino) { + if (tbInfo->statBuf.st_dev == statbuf->st_dev + && tbInfo->statBuf.st_ino == statbuf->st_ino + ) { bb_error_msg("%s: file is the archive; skipping", fileName); return TRUE; } - header_name = fileName; - while (header_name[0] == '/') { - static smallint warned; - - if (!warned) { - bb_error_msg("removing leading '/' from member names"); - warned = 1; - } - header_name++; - } + if (exclude_file(tbInfo->excludeList, header_name)) + return SKIP; #if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS - if (strlen(fileName) >= NAME_SIZE) { + if (strlen(header_name) >= NAME_SIZE) { bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); return TRUE; } #endif - if (header_name[0] == '\0') - return TRUE; - - if (exclude_file(tbInfo->excludeList, header_name)) - return SKIP; - /* Is this a regular file? */ if (tbInfo->hlInfo == NULL && S_ISREG(statbuf->st_mode)) { /* open the file we want to archive, and make sure all is well */ -- cgit v1.2.3