--- zipfile.c.orig Sun Nov 7 13:30:11 1999 +++ zipfile.c Fri May 31 13:58:36 2002 @@ -14,6 +14,10 @@ #include "zip.h" #include "revision.h" +#ifdef __FreeBSD__ +#include +#endif + #ifdef VMS # include # include @@ -628,6 +632,18 @@ #endif /* !UTIL */ +#ifdef __FreeBSD__ +#if __FreeBSD_version < 500028 +local off_t fsize(FILE *f) { + struct stat s; + + if (f == NULL) return 0; + if (fstat(fileno(f), &s) < 0) return 0; + return s.st_size; +} +#endif +#endif + /* * scanzipf_reg starts searching for the End Signature at the end of the file * The End Signature points to the Central Directory Signature which points @@ -667,7 +683,13 @@ t[1] = '\0'; t[2] = '\0'; t[3] = '\0'; - if (fseek(f, -4096L, SEEK_END) == 0) { + if ( +#ifdef __FreeBSD__ +#if __FreeBSD_version < 500028 + fsize(f) >= 4096L && +#endif +#endif + fseek(f, -4096L, SEEK_END) == 0) { zipbeg = (ulg) (ftell(f) + 4096L); while (!found && zipbeg >= 4096) { zipbeg -= 4096L; @@ -678,6 +700,11 @@ * XXX error check ?? */ fread(buf, 1, 4096, f); +#ifdef __FreeBSD__ +#if __FreeBSD_version < 500028 + if (ftell(f) >= 8192L) +#endif +#endif fseek(f, -8192L, SEEK_CUR); t = &buf[4095]; /*