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;
}
#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
}
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,
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 */
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 */
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) {
{
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 */
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 */
}
/* 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) {
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 */
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';
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)
. $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