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;
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;
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 */
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;
}
}
- init_header(remove_leading_dots(name), &stbuf, &hdr);
+ init_header(name, &stbuf, &hdr);
cmp = 0; /* avoid compiler warnings `uninitialized' */
while (oafp) {
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);
}
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 */
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);
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)