tar: revert part of last change. -39 bytes
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 29 Nov 2009 15:28:33 +0000 (16:28 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 29 Nov 2009 15:28:33 +0000 (16:28 +0100)
It looks like GNU "tar cf file file" _does_ save file as if
it is a hardlink, when it meets it for the second time.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/tar.c

index 699022ee555a57b24ab6ffaed42bc61dca2b6499..c12331c832146feb2b8a2fe5574f137ef3faa0d9 100644 (file)
@@ -136,7 +136,6 @@ static void addHardLinkInfo(HardLinkInfo **hlInfoHeadPtr,
        hlInfo->dev = statbuf->st_dev;
        hlInfo->ino = statbuf->st_ino;
 //     hlInfo->linkCount = statbuf->st_nlink;
-//TODO: "normalize" the name so that "./name/" == "name" etc?
        strcpy(hlInfo->name, fileName);
 }
 
@@ -156,15 +155,12 @@ static void freeHardLinkInfo(HardLinkInfo **hlInfoHeadPtr)
        }
 }
 
-/* Might be faster (and bigger) if the dev/ino were stored in numeric order;) */
-static HardLinkInfo *findHardLinkInfo(HardLinkInfo *hlInfo, struct stat *statbuf, const char *filename)
+/* Might be faster (and bigger) if the dev/ino were stored in numeric order ;) */
+static HardLinkInfo *findHardLinkInfo(HardLinkInfo *hlInfo, struct stat *statbuf)
 {
        while (hlInfo) {
-               if ((statbuf->st_ino == hlInfo->ino)
-                && (statbuf->st_dev == hlInfo->dev)
-               /* Name must NOT match. Think "tar cf t.tar file file"
-                * (same file tarred twice) */
-                && strcmp(filename, hlInfo->name) != 0
+               if (statbuf->st_ino == hlInfo->ino
+                && statbuf->st_dev == hlInfo->dev
                ) {
                        DBG("found hardlink:'%s'", hlInfo->name);
                        break;
@@ -448,7 +444,7 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb
        tbInfo->hlInfo = NULL;
        if (!S_ISDIR(statbuf->st_mode) && statbuf->st_nlink > 1) {
                DBG("'%s': st_nlink > 1", header_name);
-               tbInfo->hlInfo = findHardLinkInfo(tbInfo->hlInfoHead, statbuf, header_name);
+               tbInfo->hlInfo = findHardLinkInfo(tbInfo->hlInfoHead, statbuf);
                if (tbInfo->hlInfo == NULL) {
                        DBG("'%s': addHardLinkInfo", header_name);
                        addHardLinkInfo(&tbInfo->hlInfoHead, statbuf, header_name);
@@ -627,8 +623,8 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
        while (include) {
                if (!recursive_action(include->data, ACTION_RECURSE |
                                (dereferenceFlag ? ACTION_FOLLOWLINKS : 0),
-                               writeFileToTarball, writeFileToTarball, &tbInfo, 0))
-               {
+                               writeFileToTarball, writeFileToTarball, &tbInfo, 0)
+               {
                        errorFlag = TRUE;
                }
                include = include->link;
@@ -970,24 +966,21 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
 
        /* Open the tar file */
        {
-               FILE *tar_stream;
-               int flags;
+               int tar_fd = STDIN_FILENO;
+               int flags = O_RDONLY;
 
                if (opt & OPT_CREATE) {
                        /* Make sure there is at least one file to tar up.  */
                        if (tar_handle->accept == NULL)
                                bb_error_msg_and_die("empty archive");
 
-                       tar_stream = stdout;
+                       tar_fd = STDOUT_FILENO;
                        /* Mimicking GNU tar 1.15.1: */
                        flags = O_WRONLY | O_CREAT | O_TRUNC;
-               } else {
-                       tar_stream = stdin;
-                       flags = O_RDONLY;
                }
 
                if (LONE_DASH(tar_filename)) {
-                       tar_handle->src_fd = fileno(tar_stream);
+                       tar_handle->src_fd = tar_fd;
                        tar_handle->seek = seek_by_read;
                } else {
                        if (ENABLE_FEATURE_TAR_AUTODETECT && flags == O_RDONLY) {