diff -r 40a3b13ffc9d -r 9dfc861273e5 src/dirbuf.c --- a/src/dirbuf.c Tue Nov 18 02:06:52 2008 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ - -#include - -#include "dirbuf.h" -#include "lib/log.h" -#include "lib/math.h" - -int dirbuf_init (struct dirbuf *buf, size_t req_size, off_t req_off) { - buf->buf = NULL; - buf->len = req_size; - buf->off = 0; - buf->req_off = req_off; - - DEBUG("\tdirbuf.init: req_size=%zu", req_size); - - // allocate the mem - if ((buf->buf = malloc(buf->len)) == NULL) - ERROR("malloc"); - - // ok - return 0; - -error: - return -1; -} - -size_t dirbuf_estimate (struct dirbuf *buf, size_t min_namelen) { - char namebuf[DIRBUF_NAME_MAX]; - int i; - - // build a dummy string of the right length - for (i = 0; i < min_namelen && i < DIRBUF_NAME_MAX - 1; i++) - namebuf[i] = 'x'; - - namebuf[i] = '\0'; - - return buf->len / (fuse_add_direntry(NULL, NULL, 0, namebuf, NULL, 0)); -} - -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; - - 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", - buf->req_off, buf->len, buf->off, ent_off, next_off, ent_name, ent_ino, ent_mode); - - // skip entries as needed - if (ent_off < buf->req_off) - return 0; - - // set ino - stbuf.st_ino = ent_ino; - stbuf.st_mode = ent_mode; - - // try and add the dirent, and see if it fits - if ((ent_size = fuse_add_direntry(req, buf->buf + buf->off, buf->len - buf->off, ent_name, &stbuf, next_off)) > (buf->len - buf->off)) { - // 'tis full - return 1; - - } else { - // it fit - buf->off += ent_size; - } - - // success - return 0; -} - -int dirbuf_done (fuse_req_t req, struct dirbuf *buf) { - int err; - - // send the reply, return the error later - err = -fuse_reply_buf(req, buf->buf, buf->off); - - DEBUG("\tdirbuf.done: size=%zu/%zu, err=%d", buf->off, buf->len, err); - - // free the dirbuf - dirbuf_release(buf); - - // return the error code - return err; -} - -void dirbuf_release (struct dirbuf *buf) { - free(buf->buf); buf->buf = NULL; -} -