diff --git a/app-arch/unzip/patches/unzip-6.0.patchset b/app-arch/unzip/patches/unzip-6.0.patchset new file mode 100644 index 000000000..61cd1c7a7 --- /dev/null +++ b/app-arch/unzip/patches/unzip-6.0.patchset @@ -0,0 +1,657 @@ +From dbc591f74feeecb1b0848475d50dac9b7cd4fbdc Mon Sep 17 00:00:00 2001 +From: Jerome Duval +Date: Wed, 25 Feb 2015 18:16:33 +0000 +Subject: Haiku patch + + +diff --git a/unix/Makefile b/unix/Makefile +index ab32270..a8e4b85 100644 +--- a/unix/Makefile ++++ b/unix/Makefile +@@ -63,9 +63,8 @@ FL = -o funzip$E $(LFLAGS1) + FL2 = $(LF2) + + # general-purpose stuff +-#CP = cp +-CP = ln +-LN = ln ++CP = cp ++LN = ln -s + RM = rm -f + CHMOD = chmod + BINPERMS = 755 +@@ -121,7 +120,7 @@ INSTALL_PROGRAM = $(INSTALL) + INSTALL_D = mkdir -p + # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate + manext = 1 +-prefix = /usr/local ++prefix = $(PREFIX) + BINDIR = $(prefix)/bin# where to install executables + MANDIR = $(prefix)/man/man$(manext)# where to install man pages + INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/unzip$E $(BINDIR)/unzipsfx$E \ +@@ -144,7 +143,7 @@ SYSTEMG1 = generic generic_gcc generic_pkg generic_gccpkg + SYSTEMG2 = generic1 generic2 generic3 generic_bz2 generic_zlib generic_shlib + SYSTEMS1 = 386i 3Bx 7300 7300_gcc aix aix_rt amdahl amdahl_eft apollo aviion + SYSTEMS2 = bsd bsdi bsdi_noasm bull coherent convex cray cray_opt cyber_sgi +-SYSTEMS3 = cygwin dec dnix encore eta freebsd gcc gould hk68 hp hpux ++SYSTEMS3 = cygwin dec dnix encore eta freebsd gcc gould haiku hk68 hp hpux + SYSTEMS4 = isc isc_gcc isi linux linux_dos linux_noasm linux_shlib linux_shlibz + SYSTEMS5 = lynx macosx macosx_gcc minix mips mpeix next next10 next2x next3x + SYSTEMS6 = nextfat osf1 pixel ptx pyramid qnxnto realix regulus rs6000 sco +@@ -778,6 +777,13 @@ gcc: unix_make + $(MAKE) unzips CC=gcc LD=gcc CFLAGS="-O3" LF2="" + $(STRIP) $(UNZIPS) + ++# Haiku: ++haiku: unix_make ++ $(MAKE) unzips \ ++ CC="cc" CFLAGS=" -O3 -DLARGE_FILE_SUPPORT -DUNICODE_SUPPORT -DUNICODE_WCHAR -DUNICODE_SUPPORT -DUTF8_MAYBE_NATIVE -DNO_LCHMOD -DHAVE_DIRENT_H -DHAVE_TERMIOS_H -D_MBCS -DNO_SYSDIR" \ ++ CRCA_O="" AS="cc -c" LFLAGS1="" LF2="-s" CC_BZ="cc" CFLAGS_BZ=" -O3" \ ++ IZ_BZIP2="." D_USE_BZ2="" L_BZ2="" LIBBZ2="" ++ + # Heurikon HK68 (68010), UniPlus+ System V 5.0, Green Hills C-68000 + hk68: unix_make + $(MAKE) unzips CC="gcc" LD="gcc"\ +diff --git a/unzpriv.h b/unzpriv.h +index dc9eff5..2cb9af6 100644 +--- a/unzpriv.h ++++ b/unzpriv.h +@@ -306,6 +306,14 @@ + #endif + + /*--------------------------------------------------------------------------- ++ Haiku section: ++ ---------------------------------------------------------------------------*/ ++ ++#ifdef __HAIKU__ ++# include ++#endif ++ ++/*--------------------------------------------------------------------------- + Human68k/X680x0 section: + ---------------------------------------------------------------------------*/ + +@@ -741,7 +749,7 @@ + # define DOS_T20_VMS + #endif + +-#if (defined(__ATHEOS__) || defined(__BEOS__)) ++#if (defined(__ATHEOS__) || defined(__BEOS__) || defined(__HAIKU__)) + # define ATH_BEO + #endif + +-- +1.8.3.4 + + +From acf8f1b2f2ed8db58f23c9c397c84df79248ee56 Mon Sep 17 00:00:00 2001 +From: Jerome Duval +Date: Wed, 25 Feb 2015 21:47:12 +0000 +Subject: merge beos.c into unix.c with __HAIKU__ + + +diff --git a/unix/Makefile b/unix/Makefile +index a8e4b85..e27058e 100644 +--- a/unix/Makefile ++++ b/unix/Makefile +@@ -781,7 +781,7 @@ gcc: unix_make + haiku: unix_make + $(MAKE) unzips \ + CC="cc" CFLAGS=" -O3 -DLARGE_FILE_SUPPORT -DUNICODE_SUPPORT -DUNICODE_WCHAR -DUNICODE_SUPPORT -DUTF8_MAYBE_NATIVE -DNO_LCHMOD -DHAVE_DIRENT_H -DHAVE_TERMIOS_H -D_MBCS -DNO_SYSDIR" \ +- CRCA_O="" AS="cc -c" LFLAGS1="" LF2="-s" CC_BZ="cc" CFLAGS_BZ=" -O3" \ ++ CRCA_O="" AS="cc -c" LFLAGS1="-lbe" LF2="-s" CC_BZ="cc" CFLAGS_BZ=" -O3" \ + IZ_BZIP2="." D_USE_BZ2="" L_BZ2="" LIBBZ2="" + + # Heurikon HK68 (68010), UniPlus+ System V 5.0, Green Hills C-68000 +diff --git a/unix/unix.c b/unix/unix.c +index efa97fc..df76ffc 100644 +--- a/unix/unix.c ++++ b/unix/unix.c +@@ -46,6 +46,21 @@ + # endif + #endif + ++#ifdef __HAIKU__ ++#include ++#include ++#include ++#define EB_BE_FL_BADBITS 0xfe /* bits currently undefined */ ++static uch *scanBeOSexfield OF((const uch *ef_ptr, unsigned ef_len)); ++static void setBeOSexfield OF((const char *path, uch *extra_field)); ++#ifdef BEOS_USE_PRINTEXFIELD ++static void printBeOSexfield OF((int isdir, uch *extra_field)); ++#endif ++#ifdef BEOS_ASSIGN_FILETYPE ++static void assign_MIME( const char * ); ++#endif ++#endif ++ + #ifdef _POSIX_VERSION + # ifndef DIRENT + # define DIRENT +@@ -638,6 +653,15 @@ int mapname(__G__ renamed) + Info(slide, 0, ((char *)slide, " creating: %s\n", + FnFilter1(G.filename))); + } ++#ifdef __HAIKU__ ++ if (!uO.J_flag) { /* Handle the BeOS extra field if present. */ ++ void *ptr = scanBeOSexfield(G.extra_field, ++ G.lrec.extra_field_length); ++ if (ptr) { ++ setBeOSexfield(G.filename, ptr); ++ } ++ } ++#endif + #ifndef NO_CHMOD + /* Filter out security-relevant attributes bits. */ + G.pInfo->file_attr = filtattr(__G__ G.pInfo->file_attr); +@@ -663,6 +687,17 @@ int mapname(__G__ renamed) + /* set dir time (note trailing '/') */ + return (error & ~MPN_MASK) | MPN_CREATED_DIR; + } ++#ifdef __HAIKU__ ++ /* TODO: should we re-write the BeOS extra field data in case it's */ ++ /* changed? The answer is yes. [Sept 1999 - cjh] */ ++ if (!uO.J_flag) { /* Handle the BeOS extra field if present. */ ++ void *ptr = scanBeOSexfield(G.extra_field, ++ G.lrec.extra_field_length); ++ if (ptr) { ++ setBeOSexfield(G.filename, ptr); ++ } ++ } ++#endif + /* dir existed already; don't look for data to extract */ + return (error & ~MPN_MASK) | MPN_INF_SKIP; + } +@@ -1128,15 +1163,27 @@ void close_outfile(__G) /* GRR: change to return PK-style warning level */ + # else + extent attribsize = 0; + # endif ++ extent slnk_entrysize; ++ slinkentry *slnk_entry; ++#ifdef __HAIKU__ ++ uch *BeOS_exfld; ++ if (!uO.J_flag) { ++ /* Symlinks can have attributes, too. */ ++ BeOS_exfld = scanBeOSexfield(G.extra_field, ++ G.lrec.extra_field_length); ++ if (BeOS_exfld) { ++ attribsize = makeword(EB_LEN + BeOS_exfld) + EB_HEADSIZE; ++ } ++ } ++#endif + /* size of the symlink entry is the sum of + * (struct size (includes 1st '\0') + 1 additional trailing '\0'), + * system specific attribute data size (might be 0), + * and the lengths of name and link target. + */ +- extent slnk_entrysize = (sizeof(slinkentry) + 1) + attribsize + ++ slnk_entrysize = (sizeof(slinkentry) + 1) + attribsize + + ucsize + strlen(G.filename); +- slinkentry *slnk_entry; +- ++ + if (slnk_entrysize < ucsize) { + Info(slide, 0x201, ((char *)slide, + "warning: symbolic link (%s) failed: mem alloc overflow\n", +@@ -1156,15 +1203,19 @@ void close_outfile(__G) /* GRR: change to return PK-style warning level */ + slnk_entry->targetlen = ucsize; + slnk_entry->attriblen = attribsize; + # ifdef SET_SYMLINK_ATTRIBS +- memcpy(slnk_entry->buf, &(G.pInfo->file_attr), ++#ifdef __HAIKU__ ++ if (attribsize > 0) ++ memcpy(slnk_entry->buf, BeOS_exfld, attribsize); ++#else ++ memcpy(slnk_entry->buf, &(G.pInfo->file_attr), + sizeof(unsigned)); + if (have_uidgid_flg) + memcpy(slnk_entry->buf + 4, z_uidgid, sizeof(z_uidgid)); ++#endif + # endif + slnk_entry->target = slnk_entry->buf + slnk_entry->attriblen; + slnk_entry->fname = slnk_entry->target + ucsize + 1; + strcpy(slnk_entry->fname, G.filename); +- + /* move back to the start of the file to re-read the "link data" */ + rewind(G.outfile); + +@@ -1204,6 +1255,23 @@ void close_outfile(__G) /* GRR: change to return PK-style warning level */ + fclose(G.outfile); + #endif + ++#ifdef __HAIKU__ ++ /* handle the BeOS extra field if present */ ++ if (!uO.J_flag) { ++ void *ptr = scanBeOSexfield(G.extra_field, ++ G.lrec.extra_field_length); ++ ++ if (ptr) { ++ setBeOSexfield(G.filename, ptr); ++#ifdef BEOS_ASSIGN_FILETYPE ++ } else { ++ /* Otherwise, ask the system to try assigning a MIME type. */ ++ assign_MIME( G.filename ); ++#endif ++ } ++ } ++#endif ++ + /* if -X option was specified and we have UID/GID info, restore it */ + if (have_uidgid_flg + /* check that both uid and gid values fit into their data sizes */ +@@ -1278,6 +1346,9 @@ int set_symlnk_attribs(__G__ slnk_entry) + slinkentry *slnk_entry; + { + if (slnk_entry->attriblen > 0) { ++#ifdef __HAIKU__ ++ setBeOSexfield(slnk_entry->fname, (uch *)slnk_entry->buf); ++#endif + # if (!defined(NO_LCHOWN)) + if (slnk_entry->attriblen > sizeof(unsigned)) { + ulg *z_uidgid_p = (zvoid *)(slnk_entry->buf + sizeof(unsigned)); +@@ -1874,3 +1945,281 @@ static void qlfix(__G__ ef_ptr, ef_len) + } + } + #endif /* QLZIP */ ++ ++#ifdef __HAIKU__ ++ ++/******************************/ ++/* Extra field functions */ ++/******************************/ ++ ++/* ++** Scan the extra fields in extra_field, and look for a BeOS EF; return a ++** pointer to that EF, or NULL if it's not there. ++*/ ++static uch *scanBeOSexfield(const uch *ef_ptr, unsigned ef_len) ++{ ++ while( ef_ptr != NULL && ef_len >= EB_HEADSIZE ) { ++ unsigned eb_id = makeword(EB_ID + ef_ptr); ++ unsigned eb_len = makeword(EB_LEN + ef_ptr); ++ ++ if (eb_len > (ef_len - EB_HEADSIZE)) { ++ Trace((stderr, ++ "scanBeOSexfield: block length %u > rest ef_size %u\n", eb_len, ++ ef_len - EB_HEADSIZE)); ++ break; ++ } ++ ++ if (eb_id == EF_BEOS && eb_len >= EB_BEOS_HLEN) { ++ return (uch *)ef_ptr; ++ } ++ ++ ef_ptr += (eb_len + EB_HEADSIZE); ++ ef_len -= (eb_len + EB_HEADSIZE); ++ } ++ ++ return NULL; ++} ++ ++/* Used by setBeOSexfield(): ++ ++Set a file/directory's attributes to the attributes passed in. ++ ++If set_file_attrs() fails, an error will be returned: ++ ++ EOK - no errors occurred ++ ++(other values will be whatever the failed function returned; no docs ++yet, or I'd list a few) ++*/ ++static int set_file_attrs( const char *name, ++ const unsigned char *attr_buff, ++ const off_t attr_size ) ++{ ++ int retval = EOK; ++ unsigned char *ptr; ++ const unsigned char *guard; ++ int fd; ++ ++ ptr = (unsigned char *)attr_buff; ++ guard = ptr + attr_size; ++ ++ fd = open(name, O_RDWR | O_NOTRAVERSE); ++ if (fd < 0) { ++ return errno; /* should it be -fd ? */ ++ } ++ ++ while (ptr < guard) { ++ ssize_t wrote_bytes; ++ struct attr_info fa_info; ++ const char *attr_name; ++ unsigned char *attr_data; ++ ++ attr_name = (char *)&(ptr[0]); ++ ptr += strlen(attr_name) + 1; ++ ++ /* The attr_info data is stored in big-endian format because the */ ++ /* PowerPC port was here first. */ ++ memcpy(&fa_info, ptr, sizeof(struct attr_info)); ++ fa_info.type = (uint32)B_BENDIAN_TO_HOST_INT32( fa_info.type ); ++ fa_info.size = (off_t)B_BENDIAN_TO_HOST_INT64( fa_info.size ); ++ ptr += sizeof(struct attr_info); ++ ++ if (fa_info.size < 0LL) { ++ Info(slide, 0x201, ((char *)slide, ++ "warning: skipping attribute with invalid length (%Ld)\n", ++ fa_info.size)); ++ break; ++ } ++ ++ attr_data = ptr; ++ ptr += fa_info.size; ++ ++ if (ptr > guard) { ++ /* We've got a truncated attribute. */ ++ Info(slide, 0x201, ((char *)slide, ++ "warning: truncated attribute\n")); ++ break; ++ } ++ ++ /* Wave the magic wand... this will swap Be-known types properly. */ ++ (void)swap_data( fa_info.type, attr_data, fa_info.size, ++ B_SWAP_BENDIAN_TO_HOST ); ++ ++ wrote_bytes = fs_write_attr(fd, attr_name, fa_info.type, 0, ++ attr_data, fa_info.size); ++ if (wrote_bytes != fa_info.size) { ++ Info(slide, 0x201, ((char *)slide, ++ "warning: wrote %ld attribute bytes of %ld\n", ++ (unsigned long)wrote_bytes,(unsigned long)fa_info.size)); ++ } ++ } ++ ++ close(fd); ++ ++ return retval; ++} ++ ++static void setBeOSexfield(const char *path, uch *extra_field) ++{ ++ uch *ptr = extra_field; ++ ush id = 0; ++ ush size = 0; ++ ulg full_size = 0; ++ uch flags = 0; ++ uch *attrbuff = NULL; ++ int retval; ++ ++ if( extra_field == NULL ) { ++ return; ++ } ++ ++ /* Collect the data from the extra field buffer. */ ++ id = makeword(ptr); ptr += 2; /* we don't use this... */ ++ size = makeword(ptr); ptr += 2; ++ full_size = makelong(ptr); ptr += 4; ++ flags = *ptr; ptr++; ++ ++ /* Do a little sanity checking. */ ++ if (flags & EB_BE_FL_BADBITS) { ++ /* corrupted or unsupported */ ++ Info(slide, 0x201, ((char *)slide, ++ "Unsupported flags set for this BeOS extra field, skipping.\n")); ++ return; ++ } ++ if (size <= EB_BEOS_HLEN) { ++ /* corrupted, unsupported, or truncated */ ++ Info(slide, 0x201, ((char *)slide, ++ "BeOS extra field is %d bytes, should be at least %d.\n", size, ++ EB_BEOS_HLEN)); ++ return; ++ } ++ if (full_size < (size - EB_BEOS_HLEN)) { ++ /* possible old archive? will this screw up on valid archives? */ ++ Info(slide, 0x201, ((char *)slide, ++ "Skipping attributes: BeOS extra field is %d bytes, " ++ "data size is %ld.\n", size - EB_BEOS_HLEN, full_size)); ++ return; ++ } ++ ++ /* Find the BeOS file attribute data. */ ++ if (flags & EB_BE_FL_UNCMPR) { ++ /* Uncompressed data */ ++ attrbuff = ptr; ++ } else { ++ /* Compressed data */ ++ attrbuff = (uch *)malloc( full_size ); ++ if (attrbuff == NULL) { ++ /* No memory to uncompress attributes */ ++ Info(slide, 0x201, ((char *)slide, ++ "Can't allocate memory to uncompress file attributes.\n")); ++ return; ++ } ++ ++ retval = memextract(__G__ attrbuff, full_size, ++ ptr, size - EB_BEOS_HLEN); ++ if( retval != PK_OK ) { ++ /* error uncompressing attributes */ ++ Info(slide, 0x201, ((char *)slide, ++ "Error uncompressing file attributes.\n")); ++ ++ /* Some errors here might not be so bad; we should expect */ ++ /* some truncated data, for example. If the data was */ ++ /* corrupt, we should _not_ attempt to restore the attrs */ ++ /* for this file... there's no way to detect what attrs */ ++ /* are good and which are bad. */ ++ free (attrbuff); ++ return; ++ } ++ } ++ ++ /* Now attempt to set the file attributes on the extracted file. */ ++ retval = set_file_attrs(path, attrbuff, (off_t)full_size); ++ if (retval != EOK) { ++ Info(slide, 0x201, ((char *)slide, ++ "Error writing file attributes.\n")); ++ } ++ ++ /* Clean up, if necessary */ ++ if (attrbuff != ptr) { ++ free(attrbuff); ++ } ++ ++ return; ++} ++ ++#ifdef BEOS_USE_PRINTEXFIELD ++static void printBeOSexfield( int isdir, uch *extra_field ) ++{ ++ uch *ptr = extra_field; ++ ush id = 0; ++ ush size = 0; ++ ulg full_size = 0; ++ uch flags = 0; ++ ++ /* Tell picky compilers to be quiet. */ ++ isdir = isdir; ++ ++ if( extra_field == NULL ) { ++ return; ++ } ++ ++ /* Collect the data from the buffer. */ ++ id = makeword( ptr ); ptr += 2; ++ size = makeword( ptr ); ptr += 2; ++ full_size = makelong( ptr ); ptr += 4; ++ flags = *ptr; ptr++; ++ ++ if( id != EF_BEOS ) { ++ /* not a 'Be' field */ ++ printf("\t*** Unknown field type (0x%04x, '%c%c')\n", id, ++ (char)(id >> 8), (char)id); ++ } ++ ++ if( flags & EB_BE_FL_BADBITS ) { ++ /* corrupted or unsupported */ ++ printf("\t*** Corrupted BeOS extra field:\n"); ++ printf("\t*** unknown bits set in the flags\n"); ++ printf("\t*** (Possibly created by an old version of zip for BeOS.\n"); ++ } ++ ++ if( size <= EB_BEOS_HLEN ) { ++ /* corrupted, unsupported, or truncated */ ++ printf("\t*** Corrupted BeOS extra field:\n"); ++ printf("\t*** size is %d, should be larger than %d\n", size, ++ EB_BEOS_HLEN ); ++ } ++ ++ if( flags & EB_BE_FL_UNCMPR ) { ++ /* Uncompressed data */ ++ printf("\tBeOS extra field data (uncompressed):\n"); ++ printf("\t\t%ld data bytes\n", full_size); ++ } else { ++ /* Compressed data */ ++ printf("\tBeOS extra field data (compressed):\n"); ++ printf("\t\t%d compressed bytes\n", size - EB_BEOS_HLEN); ++ printf("\t\t%ld uncompressed bytes\n", full_size); ++ } ++} ++#endif ++ ++#ifdef BEOS_ASSIGN_FILETYPE ++/* Note: This will no longer be necessary in BeOS PR4; update_mime_info() */ ++/* will be updated to build its own absolute pathname if it's not given one. */ ++static void assign_MIME( const char *file ) ++{ ++ char *fullname; ++ char buff[PATH_MAX], cwd_buff[PATH_MAX]; ++ int retval; ++ ++ if( file[0] == '/' ) { ++ fullname = (char *)file; ++ } else { ++ sprintf( buff, "%s/%s", getcwd( cwd_buff, PATH_MAX ), file ); ++ fullname = buff; ++ } ++ ++ retval = update_mime_info( fullname, FALSE, TRUE, TRUE ); ++} ++#endif ++ ++#endif +diff --git a/unzip.c b/unzip.c +index 8dbfc95..e44c2e4 100644 +--- a/unzip.c ++++ b/unzip.c +@@ -2164,7 +2164,7 @@ static void help_extended(__G) + " -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name in", + " standard header.", + " -j Junk paths and deposit all files in extraction directory.", +- " -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.", ++ " -J [BeOS, Haiku] Junk file attributes. [MacOS] Ignore MacOS specific info.", + " -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.", + " -L Convert to lowercase any names from uppercase only file system.", + " -LL Convert all files to lowercase.", +diff --git a/unzip.h b/unzip.h +index 5b2a326..a002d95 100644 +--- a/unzip.h ++++ b/unzip.h +@@ -495,7 +495,7 @@ typedef struct _UzpOpts { + int scanimage; /* -I: scan image files */ + #endif + int jflag; /* -j: junk pathnames (unzip) */ +-#if (defined(__ATHEOS__) || defined(__BEOS__) || defined(MACOS)) ++#if (defined(__ATHEOS__) || defined(__BEOS__) || defined(MACOS) || defined(__HAIKU__)) + int J_flag; /* -J: ignore AtheOS/BeOS/MacOS e. f. info (unzip) */ + #endif + #if (defined(__ATHEOS__) || defined(__BEOS__) || defined(UNIX)) +-- +1.8.3.4 + + +From 0a3a44b7ed2f7fa56420451e99d4713e0cb602e7 Mon Sep 17 00:00:00 2001 +From: Jerome Duval +Date: Wed, 25 Feb 2015 22:24:29 +0000 +Subject: apply patch from Ingo Weinhold + + +diff --git a/unix/unix.c b/unix/unix.c +index df76ffc..773c408 100644 +--- a/unix/unix.c ++++ b/unix/unix.c +@@ -1993,7 +1993,7 @@ yet, or I'd list a few) + */ + static int set_file_attrs( const char *name, + const unsigned char *attr_buff, +- const off_t attr_size ) ++ const off_t total_attr_size ) + { + int retval = EOK; + unsigned char *ptr; +@@ -2001,38 +2001,40 @@ static int set_file_attrs( const char *name, + int fd; + + ptr = (unsigned char *)attr_buff; +- guard = ptr + attr_size; ++ guard = ptr + total_attr_size; + +- fd = open(name, O_RDWR | O_NOTRAVERSE); ++ fd = open(name, O_RDONLY | O_NOTRAVERSE); + if (fd < 0) { + return errno; /* should it be -fd ? */ + } + + while (ptr < guard) { + ssize_t wrote_bytes; +- struct attr_info fa_info; + const char *attr_name; + unsigned char *attr_data; ++ uint32 attr_type; ++ int64 attr_size; + + attr_name = (char *)&(ptr[0]); + ptr += strlen(attr_name) + 1; + + /* The attr_info data is stored in big-endian format because the */ + /* PowerPC port was here first. */ +- memcpy(&fa_info, ptr, sizeof(struct attr_info)); +- fa_info.type = (uint32)B_BENDIAN_TO_HOST_INT32( fa_info.type ); +- fa_info.size = (off_t)B_BENDIAN_TO_HOST_INT64( fa_info.size ); ++ memcpy(&attr_type, ptr, 4); ptr += 4; ++ memcpy(&attr_size, ptr, 8); ptr += 8; ++ attr_type = (uint32)B_BENDIAN_TO_HOST_INT32( attr_type ); ++ attr_size = (off_t)B_BENDIAN_TO_HOST_INT64( attr_size ); + ptr += sizeof(struct attr_info); + +- if (fa_info.size < 0LL) { ++ if (attr_size < 0LL) { + Info(slide, 0x201, ((char *)slide, + "warning: skipping attribute with invalid length (%Ld)\n", +- fa_info.size)); ++ attr_size)); + break; + } + + attr_data = ptr; +- ptr += fa_info.size; ++ ptr += attr_size; + + if (ptr > guard) { + /* We've got a truncated attribute. */ +@@ -2042,15 +2044,15 @@ static int set_file_attrs( const char *name, + } + + /* Wave the magic wand... this will swap Be-known types properly. */ +- (void)swap_data( fa_info.type, attr_data, fa_info.size, ++ (void)swap_data( attr_type, attr_data, attr_size, + B_SWAP_BENDIAN_TO_HOST ); + +- wrote_bytes = fs_write_attr(fd, attr_name, fa_info.type, 0, +- attr_data, fa_info.size); +- if (wrote_bytes != fa_info.size) { ++ wrote_bytes = fs_write_attr(fd, attr_name, attr_type, 0, ++ attr_data, attr_size); ++ if (wrote_bytes != attr_size) { + Info(slide, 0x201, ((char *)slide, + "warning: wrote %ld attribute bytes of %ld\n", +- (unsigned long)wrote_bytes,(unsigned long)fa_info.size)); ++ (unsigned long)wrote_bytes,(unsigned long)attr_size)); + } + } + +-- +1.8.3.4 + diff --git a/app-arch/unzip/unzip-6.0.recipe b/app-arch/unzip/unzip-6.0.recipe index 5e21f809c..a85b8683b 100644 --- a/app-arch/unzip/unzip-6.0.recipe +++ b/app-arch/unzip/unzip-6.0.recipe @@ -5,39 +5,49 @@ UnZip is an extraction utility for archives compressed in \ or test its integrity. " HOMEPAGE="http://www.info-zip.org/UnZip.html" +LICENSE="Info-ZIP" +COPYRIGHT="1995-2014 Greg Roelofs" SRC_URI="http://downloads.sourceforge.net/project/infozip/UnZip%206.x%20%28latest%29/UnZip%206.0/unzip60.tar.gz" CHECKSUM_SHA256="036d96991646d0449ed0aa952e4fbe21b476ce994abc276e49d30e686708bd37" REVISION="1" -ARCHITECTURES="!x86_gcc2" +ARCHITECTURES="x86_gcc2 x86 x86_64" + +PATCHES="unzip-$portVersion.patchset" PROVIDES=" unzip = $portVersion -" + cmd:funzip + cmd:unzip + cmd:unzipsfx + cmd:zipgrep + cmd:zipinfo + " -BUILD_PREREQUIRES=" +REQUIRES=" + haiku + " + +BUILD_REQUIRES=" haiku_devel + " +BUILD_PREREQUIRES=" cmd:gcc cmd:make -" + " SOURCE_DIR="unzip60" + BUILD() { - make -f beos/Makefile \ - PREFIX=$prefix MANDIR=$manDir - + make -f unix/Makefile haiku MANDIR=$manDir } INSTALL() { - make -f beos/Makefile install + make -f unix/Makefile install PREFIX=$prefix MANDIR=$manDir } TEST() { make test -# make check } - -LICENSE="Info-ZIP" -COPYRIGHT="1995-2014 Greg Roelofs"