added forgotten files --HG-- branch : HEAD
diff --git a/lib/zip_fclose.c b/lib/zip_fclose.c new file mode 100644 index 0000000..2bddffd --- /dev/null +++ b/lib/zip_fclose.c
@@ -0,0 +1,31 @@ +#include "zip.h" +#include "zipint.h" + + + +int +zip_fclose(struct zip_file *zff) +{ + int i, ret; + + if (zff->zstr) + inflateEnd(zff->zstr); + free(zff->buffer); + free(zff->zstr); + + for (i=0; i<zff->zf->nfile; i++) { + if (zff->zf->file[i] == zff) { + zff->zf->file[i] = zff->zf->file[zff->zf->nfile-1]; + zff->zf->nfile--; + break; + } + } + + /* EOF is ok */ + ret = (zff->flags == -1 ? 0 : zff->flags); + if (!ret) + ret = (zff->crc_orig == zff->crc); + + free(zff); + return ret; +}
diff --git a/lib/zip_fread.c b/lib/zip_fread.c new file mode 100644 index 0000000..9837207 --- /dev/null +++ b/lib/zip_fread.c
@@ -0,0 +1,86 @@ +#include "zip.h" +#include "zipint.h" + + + +int +zip_fread(struct zip_file *zff, char *outbuf, int toread) +{ + int len, out_before, ret; + + if (!zff) + return -1; + + if (zff->flags != 0) + return -1; + + if (toread == 0) + return 0; + + if (zff->bytes_left == 0) { + zff->flags = -1; + if (zff->crc != zff->crc_orig) { + zff->flags = ZERR_CRC; + return -1; + } + return 0; + } + + if (zff->method == 0) { + ret = _zip_file_fillbuf(outbuf, toread, zff); + if (ret > 0) { + zff->crc = crc32(zff->crc, outbuf, ret); + zff->bytes_left -= ret; + } + return ret; + } + + zff->zstr->next_out = outbuf; + zff->zstr->avail_out = toread; + out_before = zff->zstr->total_out; + + /* endless loop until something has been accomplished */ + for (;;) { + ret = inflate(zff->zstr, Z_SYNC_FLUSH); + + switch (ret) { + case Z_OK: + case Z_STREAM_END: + /* all ok */ + /* XXX: STREAM_END probably won't happen, since we didn't + have a header */ + len = zff->zstr->total_out - out_before; + if (len >= zff->bytes_left || len >= toread) { + zff->crc = crc32(zff->crc, outbuf, len); + zff->bytes_left -= len; + return(len); + } + break; + + case Z_BUF_ERROR: + if (zff->zstr->avail_in == 0) { + /* read some more bytes */ + len = _zip_file_fillbuf(zff->buffer, BUFSIZE, zff); + if (len <= 0) { + /* XXX: error + myerror (ERRSTR, "read error"); + */ + return -1; + } + zff->zstr->next_in = zff->buffer; + zff->zstr->avail_in = len; + continue; + } + /* XXX: set error */ + myerror(ERRFILE, "zlib error: buf_err: %s", zff->zstr->msg); + return -1; + case Z_NEED_DICT: + case Z_DATA_ERROR: + case Z_STREAM_ERROR: + case Z_MEM_ERROR: + /* XXX: set error */ + myerror(ERRFILE, "zlib error: %s", zff->zstr->msg); + return -1; + } + } +}