diff options
author | Timo Teras <timo.teras@iki.fi> | 2008-11-07 19:18:53 +0200 |
---|---|---|
committer | Timo Teras <timo.teras@iki.fi> | 2008-11-07 19:18:53 +0200 |
commit | 791cf6f05bc71118925343528edd44fd4a671bb3 (patch) | |
tree | 5107b32f40d8100aeaea7ab7466338b6d9bae896 | |
parent | 0bf7a1a2cc45086d594e4af64e1e1a8c96274f47 (diff) | |
download | apk-tools-791cf6f05bc71118925343528edd44fd4a671bb3.tar.gz apk-tools-791cf6f05bc71118925343528edd44fd4a671bb3.tar.bz2 apk-tools-791cf6f05bc71118925343528edd44fd4a671bb3.tar.xz apk-tools-791cf6f05bc71118925343528edd44fd4a671bb3.zip |
pkg: speed up indexing of version 2 .apks
-rw-r--r-- | src/io.c | 18 | ||||
-rw-r--r-- | src/package.c | 8 |
2 files changed, 21 insertions, 5 deletions
@@ -183,12 +183,22 @@ static void is_bs_close(void *stream, csum_t csum) struct apk_istream_bstream *isbs = container_of(stream, struct apk_istream_bstream, bs); - if (csum != NULL) + if (csum != NULL) { + size_t size; + + do { + size = isbs->is->read(isbs->is, isbs->buffer, + sizeof(isbs->buffer)); + csum_process(&isbs->csum_ctx, isbs->buffer, size); + } while (size == sizeof(isbs->buffer)); + csum_finish(&isbs->csum_ctx, csum); + } isbs->is->close(isbs->is); free(isbs); } + struct apk_bstream *apk_bstream_from_istream(struct apk_istream *istream) { struct apk_istream_bstream *isbs; @@ -238,8 +248,12 @@ static void mmap_close(void *stream, csum_t csum) struct apk_mmap_bstream *mbs = container_of(stream, struct apk_mmap_bstream, bs); - if (csum != NULL) + if (csum != NULL) { + if (mbs->pos != mbs->size) + csum_process(&mbs->csum_ctx, &mbs->ptr[mbs->pos], + mbs->size - mbs->pos); csum_finish(&mbs->csum_ctx, csum); + } munmap(mbs->ptr, mbs->size); free(mbs); diff --git a/src/package.c b/src/package.c index 9132b18..44cc387 100644 --- a/src/package.c +++ b/src/package.c @@ -54,8 +54,10 @@ static apk_blob_t trim(apk_blob_t str) if (str.ptr == NULL || str.len < 1) return str; - if (str.ptr[str.len-2] == '\n') + if (str.ptr[str.len-1] == '\n') { + str.ptr[str.len-1] = 0; return APK_BLOB_PTR_LEN(str.ptr, str.len-1); + } return str; } @@ -281,9 +283,9 @@ static int read_info_entry(void *ctx, const struct apk_archive_entry *ae, apk_blob_t blob = apk_blob_from_istream(is, ae->size); apk_blob_for_each_segment(blob, "\n", read_info_line, ctx); free(blob.ptr); - /* FIXME: all done after checking if .INSTALL exists */ - return 0; + return 1; } + /* FIXME: Check for .INSTALL */ } else if (strncmp(ae->name, "var/db/apk/", 11) == 0) { /* APK 1.0 format */ if (!S_ISREG(ae->mode)) |