]> mj.ucw.cz Git - libucw.git/blobdiff - lib/bucket.c
BCONFIG_CAN_OVERWRITE is a read/write parameter, i.e. the used can
[libucw.git] / lib / bucket.c
index f1e9e8b119fcb16baba7b65108d0830be0aa0e5b..4a5533cfa6ef19e485e8a50d6d43429799b540f1 100644 (file)
@@ -2,6 +2,7 @@
  *     Sherlock Library -- Object Buckets
  *
  *     (c) 2001--2004 Martin Mares <mj@ucw.cz>
+ *     (c) 2004 Robert Spalek <robert@ucw.cz>
  *
  *     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            <read>          <read>
  *     Write           <write>         <write>
- *     Append          -               <write>
- *     Scan            <read>          -
+ *     Append          <write>         -
+ *     Scan            -               <read>
  */
 
 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;