X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fbucket.c;h=4a5533cfa6ef19e485e8a50d6d43429799b540f1;hb=61da975c346c50ccf9bb9cb7271ef538dc15ab32;hp=f1e9e8b119fcb16baba7b65108d0830be0aa0e5b;hpb=42eeaeae10a36fe069defeb2c8e89d1029dfbe7c;p=libucw.git diff --git a/lib/bucket.c b/lib/bucket.c index f1e9e8b1..4a5533cf 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. @@ -79,8 +80,8 @@ obuck_broken(char *msg, sh_off_t pos) * byte0 byte1 * Read * Write - * Append - - * Scan - + * Append - + * Scan - */ static inline void @@ -130,6 +131,7 @@ obuck_unlock(void) struct fb_bucket { struct fastbuf fb; + int can_overwrite; sh_off_t start_pos; uns bucket_size; byte buffer[0]; @@ -300,6 +302,21 @@ obuck_find_next(struct obuck_header *hdrp, int full) } } +static int +obuck_bconfig(struct fastbuf *f, uns item, int value) +{ + switch (item) + { + case BCONFIG_CAN_OVERWRITE: ; + int old_value = FB_BUCKET(f)->can_overwrite; + if (value >= 0 && value <= 2) + FB_BUCKET(f)->can_overwrite = value; + return old_value; + default: + return -1; + } +} + struct fastbuf * obuck_fetch(void) { @@ -316,7 +333,7 @@ obuck_fetch(void) b->spout = NULL; b->seek = NULL; b->close = obuck_fb_close; - b->config = NULL; + b->config = obuck_bconfig; FB_BUCKET(b)->start_pos = bucket_find_pos; FB_BUCKET(b)->bucket_size = obuck_hdr.length; obuck_fb_count++; @@ -358,6 +375,7 @@ obuck_create(u32 type) b->config = NULL; FB_BUCKET(b)->start_pos = start; FB_BUCKET(b)->bucket_size = 0; + FB_BUCKET(b)->can_overwrite = 2; bwrite(b, &obuck_create_hdr, sizeof(obuck_create_hdr)); return b;