summaryrefslogtreecommitdiff
path: root/gio/glocalfileinfo.c
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2013-03-12 12:53:42 -0400
committerRyan Lortie <desrt@desrt.ca>2013-03-13 09:41:03 -0400
commit3902006a5b043ad418ff5ee1542d54c678280db8 (patch)
tree1325bc76fe52d0ae841d77c1f99c1e2efca1a1b1 /gio/glocalfileinfo.c
parent8028f54c9c66b7e483ff658e082062ad5275f264 (diff)
downloadglib-3902006a5b043ad418ff5ee1542d54c678280db8.tar.gz
glocalfileinfo: Stop using PATH_MAX for .hidden
We were using PATH_MAX to size a static array for reading lines from the .hidden file. Some platforms (Hurd) don't declare a PATH_MAX. Switch to using g_file_get_contents() and g_str_split('\n') instead. Also take the time to clean up a bit with a switch to using a 'set mode' GHashTable (since this code was originally written before we had those). This patch is largely based on a patch from Emilio Pozuelo Monfort (who also reported the bug). https://bugzilla.gnome.org/show_bug.cgi?id=695147
Diffstat (limited to 'gio/glocalfileinfo.c')
-rw-r--r--gio/glocalfileinfo.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c
index 90a074b6d..92bd35fac 100644
--- a/gio/glocalfileinfo.c
+++ b/gio/glocalfileinfo.c
@@ -1437,35 +1437,30 @@ remove_from_hidden_cache (gpointer user_data)
static GHashTable *
read_hidden_file (const gchar *dirname)
{
+ gchar *contents = NULL;
gchar *filename;
- FILE *hidden;
filename = g_build_path ("/", dirname, ".hidden", NULL);
- hidden = fopen (filename, "r");
+ g_file_get_contents (filename, &contents, NULL, NULL);
g_free (filename);
- if (hidden != NULL)
+ if (contents != NULL)
{
- gchar buffer[PATH_MAX + 2]; /* \n\0 */
GHashTable *table;
+ gchar **lines;
+ gint i;
table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
- while (fgets (buffer, sizeof buffer, hidden))
- {
- gchar *newline;
-
- if ((newline = strchr (buffer, '\n')) != NULL)
- {
- *newline++ = '\0';
+ lines = g_strsplit (contents, "\n", 0);
+ g_free (contents);
- g_hash_table_insert (table,
- g_memdup (buffer, newline - buffer),
- GINT_TO_POINTER (TRUE));
- }
- }
+ for (i = 0; lines[i]; i++)
+ /* hash table takes the individual strings... */
+ g_hash_table_add (table, lines[i]);
- fclose (hidden);
+ /* ... so we only free the container. */
+ g_free (lines);
return table;
}
@@ -1517,8 +1512,7 @@ file_is_hidden (const gchar *path,
g_source_unref (remove_from_cache_source);
}
- result = table != NULL &&
- GPOINTER_TO_INT (g_hash_table_lookup (table, basename));
+ result = table != NULL && g_hash_table_contains (table, basename);
G_UNLOCK (hidden_cache);