OSDN Git Service

* src/lhadd.c, src/header.c (remove_leading_dots): move to
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sat, 7 May 2005 21:16:05 +0000 (21:16 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sat, 7 May 2005 21:16:05 +0000 (21:16 +0000)
header.c for readlink().

* src/lhadd.c (add_one): symbolic link indication was contrary.
( not "realname -> linkname" but "linkname -> realname" )
(delete): ditto.

* src/lhext.c (extract_one): ditto.

* src/lhlist.c (list_one): ditto.

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@819 6a8cc165-1e22-0410-a132-eb4e3f353aba

src/header.c
src/lhadd.c
src/lhext.c
src/lhlist.c

index 5620619..e8d083d 100644 (file)
@@ -1176,6 +1176,44 @@ seek_lha_header(fp)
     return -1;
 }
 
+
+/* remove leading `xxxx/..' */
+static char *
+remove_leading_dots(char *path)
+{
+    char *first = path;
+    char *ptr = 0;
+
+    if (strcmp(first, "..") == 0) {
+        warning("Removing leading `..' from member name.");
+        return first+1;         /* change to "." */
+    }
+
+    if (strstr(first, "..") == 0)
+        return first;
+
+    while (path && *path) {
+
+        if (strcmp(path, "..") == 0)
+            ptr = path = path+2;
+        else if (strncmp(path, "../", 3) == 0)
+            ptr = path = path+3;
+        else
+            path = strchr(path, '/');
+
+        if (path && *path == '/') {
+            path++;
+        }
+    }
+
+    if (ptr) {
+        warning("Removing leading `%.*s' from member name.", ptr-first, first);
+        return ptr;
+    }
+
+    return first;
+}
+
 void
 init_header(name, v_stat, hdr)
     char           *name;
@@ -1194,7 +1232,9 @@ init_header(name, v_stat, hdr)
     hdr->original_size = v_stat->st_size;
     hdr->attribute = GENERIC_ATTRIBUTE;
     hdr->header_level = header_level;
-    len = str_safe_copy(hdr->name, name, sizeof(hdr->name));
+    len = str_safe_copy(hdr->name,
+                        remove_leading_dots(name),
+                        sizeof(hdr->name));
     hdr->crc = 0x0000;
     hdr->extend_type = EXTEND_UNIX;
     hdr->unix_last_modified_stamp = v_stat->st_mtime;
index e662e94..37f83bd 100644 (file)
@@ -32,7 +32,7 @@ add_one(fp, nafp, hdr)
 
     if ((hdr->unix_mode & UNIX_FILE_SYMLINK) == UNIX_FILE_SYMLINK) {
         if (!quiet)
-            printf("%s -> %s\t- Symbolic Link\n", hdr->realname, hdr->name);
+            printf("%s -> %s\t- Symbolic Link\n", hdr->name, hdr->realname);
     }
 
     if (hdr->original_size == 0) {  /* empty file, symlink or directory */
@@ -73,42 +73,6 @@ add_one(fp, nafp, hdr)
     fseeko(nafp, next_pos, SEEK_SET);
 }
 
-static char *
-remove_leading_dots(char *path)
-{
-    char *first = path;
-    char *ptr = 0;
-
-    if (strcmp(first, "..") == 0) {
-        first[1] = 0;
-        return first;
-    }
-
-    if (strstr(first, "..") == 0)
-        return first;
-
-    while (path && *path) {
-
-        if (strcmp(path, "..") == 0)
-            ptr = path = path+2;
-        else if (strncmp(path, "../", 3) == 0)
-            ptr = path = path+3;
-        else
-            path = strchr(path, '/');
-
-        if (path && *path == '/') {
-            path++;
-        }
-    }
-
-    if (ptr) {
-        warning("Removing leading `%.*s' from member name.", ptr-first, first);
-        return ptr;
-    }
-
-    return first;
-}
-
 FILE           *
 append_it(name, oafp, nafp)
     char           *name;
@@ -146,7 +110,7 @@ append_it(name, oafp, nafp)
         }
     }
 
-    init_header(remove_leading_dots(name), &stbuf, &hdr);
+    init_header(name, &stbuf, &hdr);
 
     cmp = 0;                    /* avoid compiler warnings `uninitialized' */
     while (oafp) {
@@ -262,7 +226,7 @@ delete(oafp, nafp)
             fseeko(oafp, ahdr.packed_size, SEEK_CUR);
             if (noexec || !quiet) {
                 if ((ahdr.unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK)
-                    message("delete %s -> %s", ahdr.realname, ahdr.name);
+                    message("delete %s -> %s", ahdr.name, ahdr.realname);
                 else
                     message("delete %s", ahdr.name);
             }
index 7a43109..c185621 100644 (file)
@@ -400,15 +400,15 @@ extract_one(afp, hdr)
                 if (l_code < 0) {
                     if (quiet != TRUE)
                         warning("Can't make Symbolic Link \"%s\" -> \"%s\"",
-                                hdr->realname, name);
+                                name, hdr->realname);
                 }
                 if (quiet != TRUE) {
                     message("Symbolic Link %s -> %s",
-                            hdr->realname, name);
+                            name, hdr->realname);
                 }
 #else
                 warning("Can't make Symbolic Link %s -> %s",
-                        hdr->realname, name);
+                        name, hdr->realname);
                 return read_size;
 #endif
             } else { /* make directory */
index 1d4fdd8..e9b403b 100644 (file)
@@ -128,7 +128,7 @@ list_one(hdr)
         if ((hdr->unix_mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
             printf("%s\n", hdr->name);
         else
-            printf("%s -> %s\n", hdr->realname, hdr->name);
+            printf("%s -> %s\n", hdr->name, hdr->realname);
     }
 
     strncpy(method, hdr->method, 5);
@@ -262,7 +262,7 @@ list_one(hdr)
         if ((hdr->unix_mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
             printf(" %s", hdr->name);
         else {
-            printf(" %s -> %s", hdr->realname, hdr->name);
+            printf(" %s -> %s", hdr->name, hdr->realname);
         }
     }
     if (verbose)