static struct fastbuf *obuck_fb;
static struct obuck_header obuck_hdr;
static sh_off_t bucket_start;
-static char *obuck_name = "db/objects"; /* FIXME */
+byte *obuck_name = "db/objects"; /* FIXME */
/*** Internal operations ***/
if (!limit)
return 0;
- l = pread(f->fd, f->buffer, size, f->fdpos);
+ l = sh_pread(f->fd, f->buffer, size, f->fdpos);
if (l < 0)
die("Error reading bucket: %m");
if ((unsigned) l != size)
while (l)
{
- int z = pwrite(f->fd, c, l, f->fdpos);
+ int z = sh_pwrite(f->fd, c, l, f->fdpos);
if (z <= 0)
die("Error writing bucket: %m");
f->fdpos += z;
/* If the bucket pool is not empty, check consistency of its end */
u32 check;
bucket_start = size - 4; /* for error reporting */
- if (pread(obuck_fd, &check, 4, size-4) != 4 ||
+ if (sh_pread(obuck_fd, &check, 4, size-4) != 4 ||
check != OBUCK_TRAILER)
obuck_broken("Missing trailer of last object");
}
bucket_start = ((sh_off_t) oid) << OBUCK_SHIFT;
bflush(b);
- if (pread(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start) != sizeof(obuck_hdr))
+ if (sh_pread(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start) != sizeof(obuck_hdr))
obuck_broken("Short header read");
b->fdpos = bucket_start + sizeof(obuck_hdr);
if (obuck_hdr.magic != OBUCK_MAGIC)
}
int
-obuck_find_first(struct obuck_header *hdrp)
+obuck_find_first(struct obuck_header *hdrp, int full)
{
bucket_start = 0;
obuck_hdr.magic = 0;
- return obuck_find_next(hdrp);
+ return obuck_find_next(hdrp, full);
}
int
-obuck_find_next(struct obuck_header *hdrp)
+obuck_find_next(struct obuck_header *hdrp, int full)
{
int c;
struct fastbuf *b = obuck_fb;
4 + OBUCK_ALIGN - 1) & ~((sh_off_t)(OBUCK_ALIGN - 1));
bflush(b);
obuck_lock_read();
- c = pread(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start);
+ c = sh_pread(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start);
obuck_unlock();
if (!c)
return 0;
b->fdpos = bucket_start + sizeof(obuck_hdr);
if (obuck_hdr.magic != OBUCK_MAGIC)
obuck_broken("Missing magic number");
- if (obuck_hdr.oid != OBUCK_OID_DELETED)
+ if (obuck_hdr.oid != OBUCK_OID_DELETED || full)
{
memcpy(hdrp, &obuck_hdr, sizeof(obuck_hdr));
return 1;
bucket_start = sh_seek(obuck_fd, 0, SEEK_END);
if (bucket_start & (OBUCK_ALIGN - 1))
obuck_broken("Misaligned file");
- obuck_hdr.magic = 0;
+ obuck_hdr.magic = OBUCK_INCOMPLETE_MAGIC;
obuck_hdr.oid = bucket_start >> OBUCK_SHIFT;
obuck_hdr.length = obuck_hdr.orig_length = 0;
obuck_fb->fdpos = obuck_fb->pos = bucket_start;
bputl(obuck_fb, OBUCK_TRAILER);
bflush(obuck_fb);
ASSERT(!(btell(obuck_fb) & (OBUCK_ALIGN - 1)));
- pwrite(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start);
+ sh_pwrite(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start);
obuck_unlock();
memcpy(hdrp, &obuck_hdr, sizeof(obuck_hdr));
}
obuck_lock_write();
obuck_get(oid);
obuck_hdr.oid = OBUCK_OID_DELETED;
- pwrite(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start);
+ sh_pwrite(obuck_fd, &obuck_hdr, sizeof(obuck_hdr), bucket_start);
obuck_unlock();
}
die("EOF mismatch");
obuck_fetch_end(b);
}
- if (obuck_find_first(&h))
+ if (obuck_find_first(&h, 0))
do
{
printf("<<< %08x\t%d\n", h.oid, h.orig_length);
cnt--;
}
- while (obuck_find_next(&h));
+ while (obuck_find_next(&h, 0));
if (cnt)
die("Walk mismatch");
obuck_cleanup();
* fork()'ing if you don't have any bucket open is safe.
*/
+extern byte *obuck_name; /* Internal, for use by buckettool only! */
+
#define OBUCK_SHIFT 7
#define OBUCK_ALIGN (1<<OBUCK_SHIFT)
#define OBUCK_MAGIC 0xdeadf00d
+#define OBUCK_INCOMPLETE_MAGIC 0xdeadfeel
#define OBUCK_TRAILER 0xfeedcafe
#define OBUCK_OID_DELETED (~(oid_t)0)
/* Searching for buckets */
void obuck_find_by_oid(struct obuck_header *hdrp);
-int obuck_find_first(struct obuck_header *hdrp);
-int obuck_find_next(struct obuck_header *hdrp);
+int obuck_find_first(struct obuck_header *hdrp, int full);
+int obuck_find_next(struct obuck_header *hdrp, int full);
/* Reading current bucket */
struct fastbuf *obuck_fetch(void);