static int64 MojoInput_xz_read(MojoInput *io, void *buf, uint32 bufsize) { XZinfo *info = (XZinfo *) io->opaque; MojoInput *origio = info->origio; int64 retval = 0; if (bufsize == 0) return 0; // quick rejection. info->stream.next_out = buf; info->stream.avail_out = bufsize; while (retval < ((int64) bufsize)) { const uint32 before = info->stream.total_out; lzma_ret rc; lzma_action action = LZMA_FINISH; if (info->stream.avail_in == 0) { int64 br = origio->length(origio) - origio->tell(origio); if (br > 0) { action = LZMA_RUN; if (br > XZ_READBUFSIZE) br = XZ_READBUFSIZE; br = origio->read(origio, info->buffer, (uint32) br); if (br <= 0) return -1; info->stream.next_in = info->buffer; info->stream.avail_in = (uint32) br; } // if } // if rc = lzma_code(&info->stream, LZMA_RUN); retval += (info->stream.total_out - before); if (rc != LZMA_OK) return -1; } // while assert(retval >= 0); info->uncompressed_position += (uint32) retval; return retval; } // MojoInput_xz_read
static int64 MojoInput_gzip_read(MojoInput *io, void *buf, uint32 bufsize) { GZIPinfo *info = (GZIPinfo *) io->opaque; MojoInput *origio = info->origio; int64 retval = 0; if (bufsize == 0) return 0; // quick rejection. info->stream.next_out = buf; info->stream.avail_out = bufsize; while (retval < ((int64) bufsize)) { const uint32 before = info->stream.total_out; int rc; if (info->stream.avail_in == 0) { int64 br = origio->length(origio) - origio->tell(origio); if (br > 0) { if (br > GZIP_READBUFSIZE) br = GZIP_READBUFSIZE; br = origio->read(origio, info->buffer, (uint32) br); if (br <= 0) return -1; info->stream.next_in = info->buffer; info->stream.avail_in = (uint32) br; } // if } // if rc = inflate(&info->stream, Z_SYNC_FLUSH); retval += (info->stream.total_out - before); if ((rc == Z_STREAM_END) && (retval == 0)) return 0; else if ((rc != Z_OK) && (rc != Z_STREAM_END)) return -1; } // while assert(retval >= 0); info->uncompressed_position += (uint32) retval; return retval; } // MojoInput_gzip_read
static int64 MojoInput_bzip2_read(MojoInput *io, void *buf, uint32 bufsize) { BZIP2info *info = (BZIP2info *) io->opaque; MojoInput *origio = info->origio; int64 retval = 0; if (bufsize == 0) return 0; // quick rejection. info->stream.next_out = buf; info->stream.avail_out = bufsize; while (retval < ((int64) bufsize)) { const uint32 before = info->stream.total_out_lo32; int rc; if (info->stream.avail_in == 0) { int64 br = origio->length(origio) - origio->tell(origio); if (br > 0) { if (br > BZIP2_READBUFSIZE) br = BZIP2_READBUFSIZE; br = origio->read(origio, info->buffer, (uint32) br); if (br <= 0) return -1; info->stream.next_in = (char *) info->buffer; info->stream.avail_in = (uint32) br; } // if } // if rc = BZ2_bzDecompress(&info->stream); retval += (info->stream.total_out_lo32 - before); if (rc != BZ_OK) return -1; } // while assert(retval >= 0); info->uncompressed_position += (uint32) retval; return retval; } // MojoInput_bzip2_read
int MojoSetup_testArchiveCode(int argc, char **argv) { int i; printf("Testing archiver code...\n\n"); for (i = 1; i < argc; i++) { MojoArchive *archive = MojoArchive_newFromDirectory(argv[i]); if (archive != NULL) printf("directory '%s'...\n", argv[i]); else { MojoInput *io = MojoInput_newFromFile(argv[i]); if (io != NULL) { archive = MojoArchive_newFromInput(io, argv[i]); if (archive != NULL) printf("archive '%s'...\n", argv[i]); } // if } // else if (archive == NULL) fprintf(stderr, "Couldn't handle '%s'\n", argv[i]); else { if (!archive->enumerate(archive)) fprintf(stderr, "enumerate() failed.\n"); else { const MojoArchiveEntry *ent; while ((ent = archive->enumNext(archive)) != NULL) { printf("%s ", ent->filename); if (ent->type == MOJOARCHIVE_ENTRY_FILE) { printf("(file, %d bytes, %o)\n", (int) ent->filesize, ent->perms); MojoInput *input = archive->openCurrentEntry(archive); if(&archive->prevEnum != ent) { fprintf(stderr, "Address of MojoArchiveEntry pointer differs\n"); exit(EXIT_FAILURE); } // if if(!input) { fprintf(stderr, "Could not open current entry\n"); exit(EXIT_FAILURE); } // if if(!input->ready(input)) { input->close(input); continue; } // if uint64 pos = input->tell(input); if(0 != pos) { fprintf(stderr, "position has to be 0 on start, is: %d\n", (int) pos); exit(EXIT_FAILURE); } // if int64 filesize = input->length(input); if(filesize != ent->filesize) { fprintf(stderr, "file size mismatch %d != %d\n", (int) filesize, (int) ent->filesize); exit(EXIT_FAILURE); } // if boolean ret = input->seek(input, filesize - 1); if(!ret) { fprintf(stderr, "seek() has to return 'true'.\n"); exit(EXIT_FAILURE); } // if ret = input->seek(input, filesize); if(ret) { fprintf(stderr, "seek() has to return 'false'.\n"); exit(EXIT_FAILURE); } // if pos = input->tell(input); if(filesize -1 != pos) { fprintf(stderr, "position should be %d after seek(), is: %d\n", (int) filesize - 1, (int) pos); exit(EXIT_FAILURE); } // if input->close(input); } // if else if (ent->type == MOJOARCHIVE_ENTRY_DIR) printf("(dir, %o)\n", ent->perms); else if (ent->type == MOJOARCHIVE_ENTRY_SYMLINK) printf("(symlink -> '%s')\n", ent->linkdest); else { printf("(UNKNOWN?!, %d bytes, -> '%s', %o)\n", (int) ent->filesize, ent->linkdest, ent->perms); } // else } // while } // else archive->close(archive); printf("\n\n"); } // else } // for return 0; } // MojoSetup_testArchiveCode