X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fdir.c;h=82f3baa3f33b21dc62d97d6b84773566d8543115;hb=54641cabe724241dc1a04b769e92a33ac99d640a;hp=269049874d7581bb9763fb8fa2401ad7a62f26ab;hpb=6357b9d1de3bfb09811297406688810b4900df7b;p=bluesky.git diff --git a/bluesky/dir.c b/bluesky/dir.c index 2690498..82f3baa 100644 --- a/bluesky/dir.c +++ b/bluesky/dir.c @@ -7,6 +7,7 @@ */ #include +#include #include #include "bluesky.h" @@ -17,6 +18,7 @@ void bluesky_dirent_destroy(gpointer data) { BlueSkyDirent *dirent = (BlueSkyDirent *)data; g_free(dirent->name); + g_free(dirent->name_folded); g_free(dirent); } @@ -49,6 +51,22 @@ uint64_t bluesky_directory_lookup(BlueSkyInode *inode, gchar *name) return d->inum; } +/* Case-insensitive lookup. */ +uint64_t bluesky_directory_ilookup(BlueSkyInode *inode, gchar *name) +{ + g_return_val_if_fail(inode->type == BLUESKY_DIRECTORY, 0); + g_return_val_if_fail(inode->dirhash_folded != NULL, 0); + + name = bluesky_lowercase(name); + BlueSkyDirent *d = g_hash_table_lookup(inode->dirhash_folded, name); + g_free(name); + + if (d == NULL) + return 0; + else + return d->inum; +} + /* 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) @@ -61,6 +79,7 @@ gboolean bluesky_directory_insert(BlueSkyInode *dir, gchar *name, uint64_t inum) BlueSkyDirent *d = g_new(BlueSkyDirent, 1); d->name = g_strdup(name); + d->name_folded = bluesky_lowercase(name); d->inum = inum; GSequence *dirents = dir->dirents; @@ -93,6 +112,7 @@ gboolean bluesky_directory_insert(BlueSkyInode *dir, gchar *name, uint64_t inum) /* Add the directory entry to both indices. */ g_sequence_insert_sorted(dirents, d, bluesky_dirent_compare, NULL); g_hash_table_insert(dir->dirhash, d->name, d); + g_hash_table_insert(dir->dirhash_folded, d->name_folded, d); bluesky_inode_update_ctime(dir, 1); bluesky_inode_flush(dir->fs, dir); @@ -111,7 +131,8 @@ gboolean bluesky_directory_remove(BlueSkyInode *dir, gchar *name) return FALSE; } - g_hash_table_remove(dir->dirhash, name); + g_hash_table_remove(dir->dirhash, d->name); + g_hash_table_remove(dir->dirhash_folded, d->name_folded); GSequenceIter *i = g_sequence_search(dir->dirents, d, bluesky_dirent_compare, NULL); @@ -122,9 +143,8 @@ gboolean bluesky_directory_remove(BlueSkyInode *dir, gchar *name) g_sequence_remove(i); - bluesky_dirent_destroy(d); - bluesky_inode_update_ctime(dir, 1); + bluesky_inode_flush(dir->fs, dir); return TRUE; } @@ -138,7 +158,8 @@ void bluesky_directory_dump(BlueSkyInode *dir) while (!g_sequence_iter_is_end(i)) { BlueSkyDirent *d = g_sequence_get(i); - g_print(" 0x%08x [inum=%lld] %s\n", d->cookie, d->inum, d->name); + g_print(" 0x%08x [inum=%"PRIu64"] %s\n", + d->cookie, d->inum, d->name); i = g_sequence_iter_next(i); } }