diff options
author | Ryan Lortie <desrt@desrt.ca> | 2013-03-12 12:53:42 -0400 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2013-03-13 09:41:03 -0400 |
commit | 3902006a5b043ad418ff5ee1542d54c678280db8 (patch) | |
tree | 1325bc76fe52d0ae841d77c1f99c1e2efca1a1b1 /gio/glocalfileinfo.c | |
parent | 8028f54c9c66b7e483ff658e082062ad5275f264 (diff) | |
download | glib-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.c | 32 |
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); |