OSDN Git Service

* tests/lha-test.in (lha-test14): added to test the symbolic link file.
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sat, 24 Aug 2002 11:56:15 +0000 (11:56 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sat, 24 Aug 2002 11:56:15 +0000 (11:56 +0000)
* src/lhlist.c (list_one): use LzHeader.realname.

* src/lhext.c (extract_one): use LzHeader.realname.
should call make_parent_path(symlink).

* src/lhadd.c (add_one): use LzHeader.realname.
(delete): ditto.
(append_it): use strcmp() instead of strcmp_filename().
(strcmp_filename): removed.

* src/lha.h (struct LzHeader): added a member `realname' which is
symbolic linked name.

* src/header.c (get_header): split symbolic name in archive.
(write_header): join symbolic link name and linked name to put it
in archive.

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

src/header.c
src/lha.h
src/lhadd.c
src/lhext.c
src/lhlist.c
tests/lha-test.in

index 3147236..625a1b7 100644 (file)
@@ -1125,6 +1125,20 @@ get_header(fp, hdr)
                      system_kanji_code,
                      archive_delim, system_delim, filename_case);
 
+       if ((hdr->unix_mode & UNIX_FILE_SYMLINK) == UNIX_FILE_SYMLINK) {
+        char *p;
+        /* split symbolic link */
+        p = strchr(hdr->name, '|');
+        if (p) {
+            /* hdr->name is symbolic link name */
+            /* hdr->realname is real name */
+            *p = 0;
+            strncpy(hdr->realname, p+1, sizeof(hdr->realname));
+        }
+        else
+            error("unknown symlink name \"%s\"", hdr->name);
+    }
+
     return TRUE;
 }
 
@@ -1196,15 +1210,10 @@ init_header(name, v_stat, hdr)
 
 #ifdef S_IFLNK
        if (is_symlink(v_stat)) {
-               char    lkname[FILENAME_LENGTH];
-               int             len;
                memcpy(hdr->method, LZHDIRS_METHOD, METHOD_TYPE_STORAGE);
                hdr->attribute = GENERIC_DIRECTORY_ATTRIBUTE;
                hdr->original_size = 0;
-               len = readlink(name, lkname, sizeof(lkname));
-               if (xsnprintf(hdr->name, sizeof(hdr->name),
-                      "%s|%.*s", hdr->name, len, lkname) == -1)
-            error("file name is too long (%s -> %.*s)", hdr->name, len, lkname);
+               readlink(name, hdr->realname, sizeof(hdr->realname));
        }
 #endif
 }
@@ -1517,8 +1526,23 @@ write_header(fp, hdr)
         archive_delim = "\\";
     }
 
-    strncpy(pathname, hdr->name, sizeof(pathname));
-    pathname[sizeof(pathname)-1] = 0;
+       if ((hdr->unix_mode & UNIX_FILE_SYMLINK) == UNIX_FILE_SYMLINK) {
+        char *p;
+        p = strchr(hdr->name, '|');
+        if (p) {
+            error("symlink name \"%s\" contains '|' char. change it into '_'",
+                  hdr->name);
+            *p = '_';
+        }
+        if (xsnprintf(pathname, sizeof(pathname),
+                      "%s|%s", hdr->name, hdr->realname) == -1)
+            error("file name is too long (%s -> %s)", hdr->name, hdr->realname);
+    }
+    else {
+        strncpy(pathname, hdr->name, sizeof(pathname));
+        pathname[sizeof(pathname)-1] = 0;
+    }
+
     convert_filename(pathname, strlen(pathname), sizeof(pathname),
                      system_kanji_code,
                      archive_kanji_code,
index 275db20..6a53c5c 100644 (file)
--- a/src/lha.h
+++ b/src/lha.h
@@ -211,6 +211,7 @@ typedef struct LzHeader {
        unsigned char   attribute;
        unsigned char   header_level;
        char            name[FILENAME_LENGTH];
+    char            realname[FILENAME_LENGTH];/* real name for symbolic link */
        unsigned int    crc;      /* file CRC */
        boolean         has_crc;  /* file CRC */
     unsigned int    header_crc; /* header CRC */
index 29d3e6d..137226a 100644 (file)
@@ -31,13 +31,8 @@ add_one(fp, nafp, hdr)
        write_header(nafp, hdr);/* DUMMY */
 
        if ((hdr->unix_mode & UNIX_FILE_SYMLINK) == UNIX_FILE_SYMLINK) {
-               char            buf[256], *b1, *b2;
-               if (!quiet) {
-                       strcpy(buf, hdr->name);
-                       b1 = strtok(buf, "|");
-                       b2 = strtok(NULL, "|");
-                       printf("%s -> %s\t- Symbolic Link\n", b1, b2);
-               }               /* if quiet .. */
+               if (!quiet)
+                       printf("%s -> %s\t- Symbolic Link\n", hdr->realname, hdr->name);
        }
 
        if (hdr->original_size == 0) {  /* empty file or directory */
@@ -119,8 +114,7 @@ append_it(name, oafp, nafp)
                        oafp = NULL;
                        break;
                } else {
-                       /* for symbolic link. t.okamoto */
-                       cmp = strcmp_filename(ahdr.name, hdr.name);
+                       cmp = strcmp(ahdr.name, hdr.name);
                        if (cmp < 0) {  /* SKIP */
                                /* copy old to new */
                                if (!noexec) {
@@ -229,20 +223,16 @@ delete(oafp, nafp)
 {
        LzHeader        ahdr;
        long            old_header_pos;
-       char            lpath[256], *b1, *b2;
 
        old_header_pos = ftell(oafp);
        while (get_header(oafp, &ahdr)) {
-               strcpy(lpath, ahdr.name);
-               b1 = strtok(lpath, "|");
-               b2 = strtok(NULL, "|");
-               if (need_file(b1)) {    /* skip */
+               if (need_file(ahdr.name)) {     /* skip */
                        fseek(oafp, ahdr.packed_size, SEEK_CUR);
                        if (noexec || !quiet) {
-                               if (b2 != NULL)
-                                       message("delete %s -> %s", b1, b2);
+                if ((ahdr.unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK)
+                    message("delete %s -> %s", ahdr.realname, ahdr.name);
                                else
-                                       message("delete %s", b1);
+                                       message("delete %s", ahdr.name);
             }
                }
                else {          /* copy */
@@ -627,28 +617,6 @@ cmd_delete()
        return;
 }
 
-/* for symbolic link name. t.okamoto 96/2/20 */
-int strcmp_filename( str1, str2 )
-char *str1;
-char *str2;
-{
-       char *p, *q;
-
-       p = str1; q = str2;
-       while (*p != 0 && *q != 0) {
-               if (*p == '|') {
-                       if (*q == 0) return 0;
-                       else if (*q != '|') return -1;
-               } else if (*q == '|') {
-                       if (*p == 0) return 0;
-                       else if (*q != '|') return 1;
-               } else if (*p != *q) break;
-               p++; q++;
-       }
-       return (int)*p-(int)*q;
-}
-
-               
 /* Local Variables: */
 /* mode:c */
 /* tab-width:4 */
index f98abb1..062cfa0 100644 (file)
@@ -365,11 +365,7 @@ extract_one(afp, hdr)
                        }
                        /* NAME has trailing SLASH '/', (^_^) */
                        if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK) {
-                               char            buf[256], *bb1, *bb2;
                                int             l_code;
-                               strcpy(buf, name);
-                               bb1 = strtok(buf, "|");
-                               bb2 = strtok(NULL, "|");
 
 #ifdef S_IFLNK
                                if (skip_flg == FALSE)  {
@@ -378,28 +374,30 @@ extract_one(afp, hdr)
                                                return;
                                        }
                                } else {
-                                       if (GETSTAT(bb1, &stbuf) == 0 && force != TRUE) {
+                                       if (GETSTAT(name, &stbuf) == 0 && force != TRUE) {
                                                if (stbuf.st_mtime >= hdr->unix_last_modified_stamp) {
                                                        if (quiet != TRUE)
-                                                               printf("%s : Skipped...\n", bb1);
+                                                               printf("%s : Skipped...\n", name);
                                                        return;
                                                }
                                        }
                                }
 
-                               unlink(bb1);
-                               l_code = symlink(bb2, bb1);
+                               unlink(name);
+                make_parent_path(name);
+                               l_code = symlink(hdr->realname, name);
                                if (l_code < 0) {
                                        if (quiet != TRUE)
                                                warning("Can't make Symbolic Link \"%s\" -> \"%s\"",
-                                bb1, bb2);
+                                hdr->realname, name);
                                }
                                if (quiet != TRUE) {
-                                       message("Symbolic Link %s -> %s", bb1, bb2);
+                                       message("Symbolic Link %s -> %s",
+                            hdr->realname, name);
                                }
-                               strcpy(name, bb1);      /* Symbolic's name set */
 #else
-                               warning("Can't make Symbolic Link %s -> %s", bb1, bb2);
+                               warning("Can't make Symbolic Link %s -> %s",
+                        hdr->realname, name);
                                return;
 #endif
                        } else { /* make directory */
index 820b452..6c2e98e 100644 (file)
@@ -124,8 +124,12 @@ list_one(hdr)
        char            method[6];
        char modebits[11];
 
-       if (verbose)
-               printf("%s\n", hdr->name);
+    if (verbose) {
+        if ((hdr->unix_mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
+            printf("%s\n", hdr->name);
+        else
+            printf("%s -> %s\n", hdr->realname, hdr->name);
+    }
 
        strncpy(method, hdr->method, 5);
        method[5] = '\0';
@@ -255,14 +259,10 @@ list_one(hdr)
        print_stamp(hdr->unix_last_modified_stamp);
 
        if (!verbose) {
-               if ((mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
+               if ((hdr->unix_mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
                        printf(" %s", hdr->name);
                else {
-                       char buf[FILENAME_LENGTH], *b1, *b2;
-                       strcpy(buf, hdr->name);
-                       b1 = strtok(buf, "|");
-                       b2 = strtok(NULL, "|");
-                       printf(" %s -> %s", b1, b2);
+                       printf(" %s -> %s", hdr->realname, hdr->name);
                }
     }
        if (verbose)
index 13cf433..11111d4 100644 (file)
@@ -115,6 +115,7 @@ esac
 . $srcdir/lha-test11; cleanup
 . $srcdir/lha-test12; cleanup
 . $srcdir/lha-test13; cleanup
+. $srcdir/lha-test14; cleanup
 
 if (( $error_num != 0 )); then
   echo $error_num tests failed! >&2