#include <inttypes.h>
#include <glib.h>
-#include "bluesky.h"
+#include "bluesky-private.h"
/* Core filesystem: handling of directories. */
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,
if (d1 == NULL)
return FALSE;
+ uint64_t inum = d1->inum;
+
/* Check that this rename does not cause a directory to be moved into one
* of its descendants, as that would create a loop of directories
* disconnected from the root. */
return FALSE;
bluesky_directory_remove(dir2, name2);
+
+ // TODO: Drop inode reference
}
+ bluesky_directory_remove(dir1, name1);
+ bluesky_directory_insert(dir2, name2, inum);
+
+ return TRUE;
}
/* Dump the contents of a directory to stdout. Debugging only. */