X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fdir.c;h=f279eb6838290748fb9b74805e6b4b0fd415bfd0;hb=ccd8dcd110e04b43ae1d04a3b1ab058cc1761d8b;hp=724320a5830afc719f5a66fc69a7c9964a8d02f4;hpb=45f3ec339de4b7efa9ef5978b79148c25e0c49b2;p=bluesky.git diff --git a/bluesky/dir.c b/bluesky/dir.c index 724320a..f279eb6 100644 --- a/bluesky/dir.c +++ b/bluesky/dir.c @@ -10,7 +10,7 @@ #include #include -#include "bluesky.h" +#include "bluesky-private.h" /* Core filesystem: handling of directories. */ @@ -67,6 +67,22 @@ uint64_t bluesky_directory_ilookup(BlueSkyInode *inode, gchar *name) return d->inum; } +/* Iterate through a directory listing. This returns one directory entry at a + * time, finding the first entry with a directory cookie value larger than the + * supplied one. Use a cookie of 0 to start reading from the start of a + * directory. */ +BlueSkyDirent *bluesky_directory_read(BlueSkyInode *dir, uint32_t cookie) +{ + BlueSkyDirent start = {NULL, NULL, cookie, 0}; + GSequenceIter *i = g_sequence_search(dir->dirents, &start, + bluesky_dirent_compare, NULL); + + if (g_sequence_iter_is_end(i)) + return NULL; + else + return g_sequence_get(i); +} + /* Insert a new entry into a directory. Should be called with the inode lock * already held. */ gboolean bluesky_directory_insert(BlueSkyInode *dir,