[glib] glocalfileinfo: Stop using PATH_MAX for .hidden



commit 3902006a5b043ad418ff5ee1542d54c678280db8
Author: Ryan Lortie <desrt desrt ca>
Date:   Tue Mar 12 12:53:42 2013 -0400

    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

 gio/glocalfileinfo.c |   32 +++++++++++++-------------------
 1 files changed, 13 insertions(+), 19 deletions(-)
---
diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c
index 90a074b..92bd35f 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);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]