tar: strip leading '/' BEFORE memorizing hardlink's name
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 24 Sep 2007 19:07:57 +0000 (19:07 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 24 Sep 2007 19:07:57 +0000 (19:07 -0000)
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

index 11f5ebac0049ba4cfc94af9e4cd99903f1591cec..bbda52d144bb8f2e448d3aef77bfb9fa4b621b99 100644 (file)
@@ -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 */