X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fdir.c;h=82f3baa3f33b21dc62d97d6b84773566d8543115;hb=1c01b8eab9e65d1e8856b9589413915e4cca8cac;hp=14eb6eb13fb4a78cb477cce7a61ae2580247e18f;hpb=92a6fa8cd45e12f70f65f9d9fc6d1cdd6592878a;p=bluesky.git diff --git a/bluesky/dir.c b/bluesky/dir.c index 14eb6eb..82f3baa 100644 --- a/bluesky/dir.c +++ b/bluesky/dir.c @@ -18,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); } @@ -50,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) @@ -62,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; @@ -94,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); @@ -112,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);