/* attrib = */ get_header(buf, &pos, 1);
h->level = get_header(buf, &pos, 1); /* header level */
h->namelen = get_header(buf, &pos, 1);
+ if (pos + h->namelen > headersize+2) {
+ warn("path name is too long");
+ h->namelen = headersize+2-pos;
+ }
get_string(buf, &pos, h->namelen, h->filename);
h->filename[h->namelen] = 0;
h->file_crc = get_header(buf, &pos, 2);
int headersize;
int headersum;
int ext_headersize;
+ char dirname[1024] = "";
+ int dirnamelen = 0;
int pos = 0;
headersize = get_header(buf, &pos, 1);
ext_type = get_header(extbuf, &extpos, 1);
switch (ext_type) {
+ case 1:
+ /* filename header */
+ h->namelen = ext_headersize - 3;
+ get_string(extbuf, &extpos, h->namelen, h->filename);
+ h->filename[h->namelen] = 0;
+ break;
+ case 2:
+ /* dirname header */
+ dirnamelen = ext_headersize - 3;
+ get_string(extbuf, &extpos, dirnamelen, dirname);
+ dirname[dirnamelen] = 0;
+ break;
case 0x54:
h->mtime = get_header(extbuf, &extpos, 4);
break;
ext_headersize = get_header(extbuf, &extpos, 2);
}
+ if (dirnamelen > 0 && dirname[dirnamelen-1] != '/') {
+ dirname[dirnamelen++] = '/';
+ }
+
+ strcat(dirname, h->filename);
+ h->namelen = strlen(dirname);
+ strcpy(h->filename, dirname);
+
return 1; /* success */
}
int headersize;
int pos = 0;
- headersize = 22 + h->namelen;
+ headersize = 22;
+ if (!opts.generic)
+ headersize += 12; /* extended header size */
- put_header(buf, &pos, 1, 0); /* dummy */
+ if (headersize + h->namelen > 255) {
+ warn("path name is too long");
+ h->namelen = 255 - headersize;
+ headersize = 255;
+ }
+ else {
+ headersize += h->namelen;
+ }
+
+ put_header(buf, &pos, 1, headersize);
put_header(buf, &pos, 1, 0); /* dummy */
put_string(buf, &pos, 5, h->method);
put_header(buf, &pos, 2, 0100000); /* mode */
put_header(buf, &pos, 2, 0); /* uid */
put_header(buf, &pos, 2, 0); /* gid */
- headersize += pos; /* size of ext-header (old style) */
}
- put_header_tmp(buf, 0, 1, headersize);
-
sum = calc_headersum(buf+2, headersize);
put_header_tmp(buf, 1, 1, sum);
int extsize = 0;
int pos = 0;
int extpos;
+ char *dirname, *fname;
+ int dirnamelen;
- headersize = 25 + h->namelen;
+ fname = basename(h->filename);
+ dirname = h->filename;
+ dirnamelen = fname - dirname;
+ h->namelen = strlen(fname);
+ printf("namelen = %d\n", h->namelen);
- put_header(buf, &pos, 1, headersize);
+ headersize = 25;
+
+ put_header(buf, &pos, 1, 0); /* dummy */
put_header(buf, &pos, 1, 0); /* dummy */
put_string(buf, &pos, 5, h->method);
put_header(buf, &pos, 4, h->compsize); /* packed size */
put_header(buf, &pos, 4, time_t_to_ftime(h->mtime)); /* ftime */
put_header(buf, &pos, 1, 0x20); /* attribute */
put_header(buf, &pos, 1, 1); /* level */
- put_header(buf, &pos, 1, h->namelen); /* length of pathname */
- put_string(buf, &pos, h->namelen, h->filename);
+ if (headersize + h->namelen > 255)
+ put_header(buf, &pos, 1, 0); /* length of pathname */
+ else {
+ put_header(buf, &pos, 1, h->namelen); /* length of pathname */
+ put_string(buf, &pos, h->namelen, fname);
+ headersize += h->namelen;
+ }
+ put_header_tmp(buf, 0, 1, headersize); /* header size */
put_header(buf, &pos, 2, h->file_crc);
if (opts.generic)
put_header(buf, &pos, 1, '\0');
put_header(buf, &pos, 1, 0x54); /* time stamp */
put_header(buf, &pos, 4, h->mtime); /* time_t */
+ if (h->namelen > 0) {
+ put_header(buf, &pos, 2, 3 + h->namelen);
+ put_header(buf, &pos, 1, 1); /* 0x01: filename header */
+ put_string(buf, &pos, h->namelen, fname); /* filename */
+ }
+
+ if (dirnamelen > 0) {
+ put_header(buf, &pos, 2, 3 + dirnamelen);
+ put_header(buf, &pos, 1, 2); /* 0x02: dirname header */
+ put_string(buf, &pos, dirnamelen, dirname); /* dirname */
+ }
+
extsize = pos - extpos;
put_header(buf, &pos, 2, 0); /* next header size (end of header) */
break;
case 'g':
opts.generic = 1;
+ opts.header_level = 0;
break;
case 'o':
/* compress method */