X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fdir.c;h=cd4ee1dd798ff74822ccca911722b446c587b2b6;hb=0e3a9c0defb08f388fea2c2eb393dd39d9e95e45;hp=44729b436c01bab4303a7dbc6f6a65b3e81f7a86;hpb=afdaf6a249027cccc296b8923dd95fd38736b70d;p=bluesky.git diff --git a/bluesky/dir.c b/bluesky/dir.c index 44729b4..cd4ee1d 100644 --- a/bluesky/dir.c +++ b/bluesky/dir.c @@ -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, @@ -170,6 +186,8 @@ gboolean bluesky_rename(BlueSkyInode *dir1, gchar *name1, 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. */ @@ -180,8 +198,14 @@ gboolean bluesky_rename(BlueSkyInode *dir1, gchar *name1, 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. */