glocalfileinfo: Stop using PATH_MAX for .hidden
authorRyan Lortie <desrt@desrt.ca>
Tue, 12 Mar 2013 16:53:42 +0000 (12:53 -0400)
committerRyan Lortie <desrt@desrt.ca>
Wed, 13 Mar 2013 13:41:03 +0000 (09:41 -0400)
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

gio/glocalfileinfo.c

index 90a074b..92bd35f 100644 (file)
@@ -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);