* size field is 4 bytes
*/
-static long
+static ssize_t
get_extended_header(fp, hdr, header_size, hcrc)
FILE *fp;
LzHeader *hdr;
- long header_size;
+ size_t header_size;
unsigned int *hcrc;
{
char data[LZHEADER_STORAGE];
char dirname[FILENAME_LENGTH];
int dir_length = 0;
int i;
- long whole_size = header_size;
+ ssize_t whole_size = header_size;
int ext_type;
int n = 1 + hdr->size_field_length; /* `ext-type' + `next-header size' */
LzHeader *hdr;
char *data;
{
- int header_size;
+ size_t header_size;
+ ssize_t extend_size;
int checksum;
int name_length;
int i;
- int extend_size;
hdr->size_field_length = 2; /* in bytes */
hdr->header_size = header_size = get_byte();
LzHeader *hdr;
char *data;
{
- int header_size, extend_size;
+ size_t header_size;
+ ssize_t extend_size;
int checksum;
int name_length;
int i, dummy;
LzHeader *hdr;
char *data;
{
- int header_size, extend_size;
+ size_t header_size;
+ ssize_t extend_size;
int padding;
unsigned int hcrc;
LzHeader *hdr;
char *data;
{
- long header_size, extend_size;
+ size_t header_size;
+ ssize_t extend_size;
int padding;
unsigned int hcrc;
}
/* skip SFX header */
-boolean
-skip_msdos_sfx1_code(fp)
- FILE *fp;
+int
+seek_lha_header(fp)
+ FILE *fp;
{
- unsigned char buffer[64 * 1024]; /* SFX header size */
+ unsigned char buffer[64 * 1024]; /* max seek size */
unsigned char *p;
int n;
/* size and checksum validate check */
- /* level 0 header */
- if (p[I_HEADER_LEVEL] == 0
+ /* level 0 or 1 header */
+ if ((p[I_HEADER_LEVEL] == 0 || p[I_HEADER_LEVEL] == 1)
&& p[I_HEADER_SIZE] > 20
&& p[I_HEADER_CHECKSUM] == calc_sum(p+2, p[I_HEADER_SIZE])) {
- fseek(fp, (p - buffer) - n, SEEK_CUR);
- return TRUE;
+ if (fseek(fp, (p - buffer) - n, SEEK_CUR) == -1)
+ fatal_error("cannot seek header");
+ return 0;
}
/* level 2 header */
if (p[I_HEADER_LEVEL] == 2
&& p[I_HEADER_SIZE] >= 24
&& p[I_ATTRIBUTE] == 0x20) {
- fseek(fp, (p - buffer) - n, SEEK_CUR);
- return TRUE;
+ if (fseek(fp, (p - buffer) - n, SEEK_CUR) == -1)
+ fatal_error("cannot seek header");
+ return 0;
}
}
- fseek(fp, -n, SEEK_CUR);
- return FALSE;
+ if (fseek(fp, -n, SEEK_CUR) == -1)
+ fatal_error("cannot seek header");
+ return -1;
}
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
/* Write unix extended header or generic header. */
-static int
+static size_t
write_header_level0(data, hdr, pathname)
LzHeader *hdr;
char *data, *pathname;
{
int limit;
int name_length;
- int header_size;
+ size_t header_size;
setup_put(data);
memset(data, 0, LZHEADER_STORAGE);
return header_size + 2;
}
-static int
+static size_t
write_header_level1(data, hdr, pathname)
LzHeader *hdr;
char *data, *pathname;
{
int name_length, dir_length, limit;
char *basename, *dirname;
- int header_size;
+ size_t header_size;
char *extend_header_top;
- int extend_header_size;
+ size_t extend_header_size;
basename = strrchr(pathname, LHA_PATHSEP);
if (basename) {
return header_size + extend_header_size + 2;
}
-static int
+static size_t
write_header_level2(data, hdr, pathname)
LzHeader *hdr;
char *data, *pathname;
{
int name_length, dir_length;
char *basename, *dirname;
- int header_size;
+ size_t header_size;
char *extend_header_top;
char *headercrc_ptr;
unsigned int hcrc;
FILE *fp;
LzHeader *hdr;
{
- int header_size;
+ size_t header_size;
char data[LZHEADER_STORAGE];
int archive_kanji_code = CODE_SJIS;
int calc_sum P_((register char *p, register int len));
void convert_filename P_((char *name, int len, int size, int from_code, int to_code, char *from_delim, char *to_delim, int case_to));
boolean get_header P_((FILE *fp, LzHeader *hdr));
-boolean skip_msdos_sfx1_code P_((FILE *fp));
+int seek_lha_header P_((FILE *fp));
void init_header P_((char *name, struct stat *v_stat, LzHeader *hdr));
void write_header P_((FILE *fp, LzHeader *hdr));
char *sjis_to_utf8 P_((char *dst, const char *src, size_t dstsize));
if test -c /dev/zero; then
# Usually, size of SFX code is less than 20K
- dd if=/dev/zero of=test-tmp-1.exe bs=1024 count=20 2>/dev/null
+ dd if=/dev/zero of=test-tmp-hg.exe bs=1024 count=20 2>/dev/null
else
# dummy header
- echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > test-tmp-1.exe
+ echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > test-tmp-hg.exe
fi
check $? $LINENO
-$lha c - test-[abc] >> test-tmp-1.exe
+cp test-tmp-hg.exe test-tmp-h0.exe &&
+cp test-tmp-hg.exe test-tmp-h1.exe &&
+cp test-tmp-hg.exe test-tmp-h2.exe
check $? $LINENO
-$lha v test-tmp-1.exe
+# generic header
+$lha cg - test-[abc] >> test-tmp-hg.exe
check $? $LINENO
-$lha xw=test-tmp-1 test-tmp-1.exe
+$lha vv test-tmp-hg.exe
check $? $LINENO
-diff -r test-1 test-tmp-1
+$lha xw=test-tmp-hg test-tmp-hg.exe
+ check $? $LINENO
+diff -r test-1 test-tmp-hg
+ check $? $LINENO
+
+# level 0 header
+$lha c0 - test-[abc] >> test-tmp-h0.exe
+ check $? $LINENO
+$lha vv test-tmp-h0.exe
+ check $? $LINENO
+$lha xw=test-tmp-h0 test-tmp-h0.exe
+ check $? $LINENO
+diff -r test-1 test-tmp-h0
+ check $? $LINENO
+
+# level 1 header
+$lha c1 - test-[abc] >> test-tmp-h1.exe
+ check $? $LINENO
+$lha vv test-tmp-h1.exe
+ check $? $LINENO
+$lha xw=test-tmp-h1 test-tmp-h1.exe
+ check $? $LINENO
+diff -r test-1 test-tmp-h1
+ check $? $LINENO
+
+# level 2 header
+$lha c2 - test-[abc] >> test-tmp-h2.exe
+ check $? $LINENO
+$lha vv test-tmp-h2.exe
+ check $? $LINENO
+$lha xw=test-tmp-h2 test-tmp-h2.exe
+ check $? $LINENO
+diff -r test-1 test-tmp-h2
check $? $LINENO