src/dirbuf.h
author Tero Marttila <terom@fixme.fi>
Sat, 13 Dec 2008 19:55:50 +0200
branchnew-evsql
changeset 53 0d6e07f4c9a1
parent 27 461be4cd34a3
permissions -rw-r--r--
separate evsql documentation
#ifndef DIRBUF_H
#define DIRBUF_H

/*
 * Simple dirent building
 */

#include "evfuse.h"

/*
 * Holds the dir entries
 */ 
struct dirbuf {
    char *buf;
    size_t len;
    off_t off, req_off;
};

// maximum length for a dirbuf name, including NUL byte
#define DIRBUF_NAME_MAX 256

/*
 * Initialize a dirbuf for a request. The dirbuf will be filled with at most req_size bytes of dir entries.
 *
 *  req_size    - how many bytes of dirbuf data we want, at most 
 *  req_off     - the offset of the first dirent to include
 */
int dirbuf_init (struct dirbuf *buf, size_t req_size, off_t req_off);

/*
 * Estimate how many dir entries will, at most, fit into a difbuf of the given size, based on a minimum filename size.
 */
size_t dirbuf_estimate (struct dirbuf *buf, size_t min_namelen);

/*
 * Add an dir entry to the dirbuf. The dirbuf should not be full.
 *
 * Offsets are followed:
 *  ent_off     - the offset of this dirent
 *  next_off    - the offset of the next dirent
 *
 * Only the S_IFMT bits of ent_mode are relevant.
 *
 * Returns 0 if the ent was added or skipped, -1 on error, 1 if the dirbuf is full (no more ents should be added).
 */
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);

/*
 * Attempt to send the readdir reply, free the buf, and return the error code from fuse_reply_buf
 */
int dirbuf_done (fuse_req_t req, struct dirbuf *buf);

/*
 * Release the dirop without sending any reply back.
 *
 * This is safe to be called multiple times.
 */
void dirbuf_release (struct dirbuf *buf);

#endif /* DIRBUF_H */