X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fdir.c;h=44729b436c01bab4303a7dbc6f6a65b3e81f7a86;hb=afdaf6a249027cccc296b8923dd95fd38736b70d;hp=82f3baa3f33b21dc62d97d6b84773566d8543115;hpb=1c01b8eab9e65d1e8856b9589413915e4cca8cac;p=bluesky.git diff --git a/bluesky/dir.c b/bluesky/dir.c index 82f3baa..44729b4 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. */ @@ -69,7 +69,8 @@ uint64_t bluesky_directory_ilookup(BlueSkyInode *inode, gchar *name) /* Insert a new entry into a directory. Should be called with the inode lock * already held. */ -gboolean bluesky_directory_insert(BlueSkyInode *dir, gchar *name, uint64_t inum) +gboolean bluesky_directory_insert(BlueSkyInode *dir, + const gchar *name, uint64_t inum) { g_return_val_if_fail(dir->type == BLUESKY_DIRECTORY, FALSE); @@ -120,8 +121,8 @@ gboolean bluesky_directory_insert(BlueSkyInode *dir, gchar *name, uint64_t inum) return TRUE; } -/* Remove an from a directory. Should be called with the inode lock already - * held. */ +/* Remove an entry from a directory. Should be called with the inode lock + * already held. */ gboolean bluesky_directory_remove(BlueSkyInode *dir, gchar *name) { g_return_val_if_fail(dir->type == BLUESKY_DIRECTORY, FALSE); @@ -149,6 +150,40 @@ gboolean bluesky_directory_remove(BlueSkyInode *dir, gchar *name) return TRUE; } +/* Rename a file. If desired (if overwrite is true) and if the target already + * exists, it will be unlinked first. */ +gboolean bluesky_rename(BlueSkyInode *dir1, gchar *name1, + BlueSkyInode *dir2, gchar *name2, + gboolean case_sensitive, + gboolean overwrite) +{ + g_return_val_if_fail(dir1->type == BLUESKY_DIRECTORY, FALSE); + g_return_val_if_fail(dir2->type == BLUESKY_DIRECTORY, FALSE); + + BlueSkyDirent *d1, *d2; + + d1 = g_hash_table_lookup(case_sensitive ? dir1->dirhash + : dir1->dirhash_folded, name1); + d2 = g_hash_table_lookup(case_sensitive ? dir2->dirhash + : dir2->dirhash_folded, name2); + + if (d1 == NULL) + return FALSE; + + /* 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. */ + /* TODO */ + + if (d2 != NULL) { + if (!overwrite) + return FALSE; + + bluesky_directory_remove(dir2, name2); + } + +} + /* Dump the contents of a directory to stdout. Debugging only. */ void bluesky_directory_dump(BlueSkyInode *dir) {