[glib] g_get_current_dir(): consult PWD first



commit a22f77739dd4ec911d7bdc0f0fc61314e5f9f1cf
Author: Ryan Lortie <desrt desrt ca>
Date:   Sun Dec 8 18:18:16 2013 -0500

    g_get_current_dir(): consult PWD first
    
    Check if the current directory is the same as $PWD.  This matches the
    behaviour of the get_current_dir_name() function in glibc.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=705902

 glib/gfileutils.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)
---
diff --git a/glib/gfileutils.c b/glib/gfileutils.c
index 0db964a..6a8d194 100644
--- a/glib/gfileutils.c
+++ b/glib/gfileutils.c
@@ -2451,6 +2451,11 @@ g_path_get_dirname (const gchar *file_name)
  * The encoding of the returned string is system defined.
  * On Windows, it is always UTF-8.
  *
+ * Since GLib 2.40, this function will return the value of the "PWD"
+ * environment variable if it is set and it happens to be the same as
+ * the current directory.  This can make a difference in the case that
+ * the current directory is the target of a symbolic link.
+ *
  * Returns: the current directory
  */
 gchar *
@@ -2476,10 +2481,17 @@ g_get_current_dir (void)
   return dir;
 
 #else
-
+  const gchar *pwd;
   gchar *buffer = NULL;
   gchar *dir = NULL;
   static gulong max_len = 0;
+  struct stat pwdbuf, dotbuf;
+
+  pwd = g_getenv ("PWD");
+  if (pwd != NULL &&
+      g_stat (".", &dotbuf) == 0 && g_stat (pwd, &pwdbuf) == 0 &&
+      dotbuf.st_dev == pwdbuf.st_dev && dotbuf.st_ino == pwdbuf.st_ino)
+    return g_strdup (pwd);
 
   if (max_len == 0)
     max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH;


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