X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fbucket.c;h=f81f03e8d3f5444d0af9d3176edf932f0fe1b5a3;hb=0d56b467cc2184f00a4e390f95596704d819dfa3;hp=2b7dc27a2e69129fd8878181242421709f6563ba;hpb=e6eea48b5e628e7f26b7461e6d15d77d5b5d5394;p=libucw.git diff --git a/lib/bucket.c b/lib/bucket.c index 2b7dc27a..f81f03e8 100644 --- a/lib/bucket.c +++ b/lib/bucket.c @@ -2,6 +2,7 @@ * Sherlock Library -- Object Buckets * * (c) 2001--2004 Martin Mares + * (c) 2004 Robert Spalek * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -153,9 +154,10 @@ obuck_fb_refill(struct fastbuf *f) uns remains, bufsize, size, datasize; remains = FB_BUCKET(f)->bucket_size - (uns)f->pos; - bufsize = f->bufend - f->buffer; if (!remains) return 0; + f->buffer = FB_BUCKET(f)->buffer; /* Could have been trimmed by bdirect_read_commit_modified() */ + bufsize = f->bufend - f->buffer; sh_off_t start = FB_BUCKET(f)->start_pos; sh_off_t pos = start + sizeof(struct obuck_header) + f->pos; if (remains <= bufsize) @@ -300,18 +302,6 @@ obuck_find_next(struct obuck_header *hdrp, int full) } } -static int -obuck_bconfig(struct fastbuf *f UNUSED, uns item, int value UNUSED) -{ - switch (item) - { - case BCONFIG_CAN_OVERWRITE: - return 2; - default: - return -1; - } -} - struct fastbuf * obuck_fetch(void) { @@ -328,7 +318,8 @@ obuck_fetch(void) b->spout = NULL; b->seek = NULL; b->close = obuck_fb_close; - b->config = obuck_bconfig; + b->config = NULL; + b->can_overwrite_buffer = 2; FB_BUCKET(b)->start_pos = bucket_find_pos; FB_BUCKET(b)->bucket_size = obuck_hdr.length; obuck_fb_count++; @@ -368,6 +359,7 @@ obuck_create(u32 type) b->seek = NULL; b->close = NULL; b->config = NULL; + b->can_overwrite_buffer = 0; FB_BUCKET(b)->start_pos = start; FB_BUCKET(b)->bucket_size = 0; bwrite(b, &obuck_create_hdr, sizeof(obuck_create_hdr)); @@ -415,14 +407,15 @@ static sh_off_t slurp_start, slurp_current, slurp_end; static int obuck_slurp_refill(struct fastbuf *f) { - uns l; - if (!slurp_remains) return 0; - l = bdirect_read_prepare(obuck_rpf, &f->buffer); + uns l = bdirect_read_prepare(obuck_rpf, &f->buffer); if (!l) obuck_broken("Incomplete object", slurp_start); l = MIN(l, slurp_remains); + /* XXX: This probably should be bdirect_read_commit_modified() in some cases, + * but it doesn't hurt since we aren't going to seek. + */ bdirect_read_commit(obuck_rpf, f->buffer + l); slurp_remains -= l; f->bptr = f->buffer; @@ -442,9 +435,7 @@ obuck_slurp_pool(struct obuck_header *hdrp) { obuck_lock_read(); obuck_rpf = bopen(obuck_name, O_RDONLY, obuck_slurp_buflen); - bseek(obuck_rpf, 0, SEEK_END); - slurp_end = btell(obuck_rpf); - bsetpos(obuck_rpf, 0); + slurp_end = bfilesize(obuck_rpf); obuck_lock_read_to_scan(); } else @@ -479,6 +470,7 @@ obuck_slurp_pool(struct obuck_header *hdrp) limiter.name = "Bucket"; limiter.pos = 0; limiter.refill = obuck_slurp_refill; + limiter.can_overwrite_buffer = obuck_rpf->can_overwrite_buffer; return &limiter; }