]> mj.ucw.cz Git - libucw.git/blobdiff - lib/bucket.c
`buckettool -c' (cat) now separates buckets by an empty line.
[libucw.git] / lib / bucket.c
index fa4f5dedd8a84dffd4394c110dd7dd234f90864a..f81f03e8d3f5444d0af9d3176edf932f0fe1b5a3 100644 (file)
@@ -154,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)
@@ -406,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;
@@ -433,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
@@ -470,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;
 }