diff -r 61668c57f4bb -r 461be4cd34a3 src/dirbuf.c --- a/src/dirbuf.c Sun Oct 12 21:59:52 2008 +0300 +++ b/src/dirbuf.c Mon Oct 13 02:27:59 2008 +0300 @@ -5,11 +5,11 @@ #include "lib/log.h" #include "lib/math.h" -int dirbuf_init (struct dirbuf *buf, size_t req_size) { +int dirbuf_init (struct dirbuf *buf, size_t req_size, off_t req_off) { buf->len = req_size; - buf->off = 0; + buf->req_off = req_off; - INFO("\tdirbuf.init: req_size=%zu", req_size); + DEBUG("\tdirbuf.init: req_size=%zu", req_size); // allocate the mem if ((buf->buf = malloc(buf->len)) == NULL) @@ -22,7 +22,7 @@ return -1; } -size_t difbuf_estimate (size_t req_size, size_t min_namelen) { +size_t dirbuf_estimate (struct dirbuf *buf, size_t min_namelen) { char namebuf[DIRBUF_NAME_MAX]; int i; @@ -32,18 +32,18 @@ namebuf[i] = '\0'; - return req_size / (fuse_add_direntry(NULL, NULL, 0, namebuf, NULL, 0)); + return buf->len / (fuse_add_direntry(NULL, NULL, 0, namebuf, NULL, 0)); } -int dirbuf_add (fuse_req_t req, off_t req_off, struct dirbuf *buf, off_t ent_off, off_t next_off, const char *ent_name, fuse_ino_t ent_ino, mode_t ent_mode) { +int dirbuf_add (fuse_req_t req, struct dirbuf *buf, off_t ent_off, off_t next_off, const char *ent_name, fuse_ino_t ent_ino, mode_t ent_mode) { struct stat stbuf; size_t ent_size; - INFO("\tdirbuf.add: req_off=%zu, buf->len=%zu, buf->off=%zu, ent_off=%zu, next_off=%zu, ent_name=`%s`, ent_ino=%lu, ent_mode=%07o", + DEBUG("\tdirbuf.add: req_off=%zu, buf->len=%zu, buf->off=%zu, ent_off=%zu, next_off=%zu, ent_name=`%s`, ent_ino=%lu, ent_mode=%07o", req_off, buf->len, buf->off, ent_off, next_off, ent_name, ent_ino, ent_mode); // skip entries as needed - if (ent_off < req_off) + if (ent_off < buf->req_off) return 0; // set ino @@ -70,12 +70,16 @@ // send the reply, return the error later err = fuse_reply_buf(req, buf->buf, buf->off); - INFO("\tdirbuf.done: size=%zu/%zu, err=%d", buf->off, buf->len, err); + DEBUG("\tdirbuf.done: size=%zu/%zu, err=%d", buf->off, buf->len, err); // free the dirbuf - free(buf->buf); + dirbuf_release(buf); // return the error code return err; } +void dirbuf_release (struct dirbuf *buf) { + free(buf->buf); buf->buf = NULL; +} +