[vlc-commits] vlc_getcwd: return current directory as UTF-8

Rémi Denis-Courmont git at videolan.org
Mon Jul 11 17:52:25 CEST 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Jul 11 18:39:59 2011 +0300| [5110789433bedb1a3a495aa71bcfbe2934cefc2a] | committer: Rémi Denis-Courmont

vlc_getcwd: return current directory as UTF-8

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5110789433bedb1a3a495aa71bcfbe2934cefc2a
---

 include/vlc_fs.h       |    1 +
 src/libvlccore.sym     |    1 +
 src/posix/filesystem.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 src/win32/filesystem.c |   11 +++++++++++
 4 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/include/vlc_fs.h b/include/vlc_fs.h
index e3ab442..65cd4cb 100644
--- a/include/vlc_fs.h
+++ b/include/vlc_fs.h
@@ -43,6 +43,7 @@ VLC_API int vlc_mkdir( const char *filename, mode_t mode );
 
 VLC_API int vlc_unlink( const char *filename );
 VLC_API int vlc_rename( const char *oldpath, const char *newpath );
+VLC_API char *vlc_getcwd( void ) VLC_USED;
 
 #if defined( WIN32 )
 # ifndef UNDER_CE
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 4d937b9..3b6de36 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -467,6 +467,7 @@ vlc_stat
 vlc_strcasestr
 vlc_unlink
 vlc_rename
+vlc_getcwd
 vlc_dup
 vlc_pipe
 vlc_accept
diff --git a/src/posix/filesystem.c b/src/posix/filesystem.c
index aadf35b..3347496 100644
--- a/src/posix/filesystem.c
+++ b/src/posix/filesystem.c
@@ -307,6 +307,53 @@ error:
 }
 
 /**
+ * Determines the current working directory.
+ *
+ * @return the current working directory (must be free()'d)
+ *         or NULL on error
+ */
+char *vlc_getcwd (void)
+{
+    /* Try $PWD */
+    const char *pwd = getenv ("PWD");
+    if (pwd != NULL)
+    {
+        struct stat s1, s2;
+        /* Make sure $PWD is correct */
+        if (stat (pwd, &s1) == 0 && stat (".", &s2) == 0
+         && s1.st_dev == s2.st_dev && s1.st_ino == s2.st_ino)
+            return ToLocaleDup (pwd);
+    }
+
+    /* Otherwise iterate getcwd() until the buffer is big enough */
+    long path_max = pathconf (".", _PC_PATH_MAX);
+    size_t size = (path_max == -1 || path_max > 4096) ? 4096 : path_max;
+
+    for (;; size *= 2)
+    {
+        char *buf = malloc (size);
+        if (unlikely(buf == NULL))
+            break;
+
+        if (getcwd (buf, size) != NULL)
+#ifdef ASSUME_UTF8
+            return buf;
+#else
+        {
+            char *ret = ToLocaleDup (buf);
+            free (buf);
+            return ret; /* success */
+        }
+#endif
+        free (buf);
+
+        if (errno != ERANGE)
+            break;
+    }
+    return NULL;
+}
+
+/**
  * Duplicates a file descriptor. The new file descriptor has the close-on-exec
  * descriptor flag set.
  * @return a new file descriptor or -1
diff --git a/src/win32/filesystem.c b/src/win32/filesystem.c
index dfcaee8..0ba5e0a 100644
--- a/src/win32/filesystem.c
+++ b/src/win32/filesystem.c
@@ -108,6 +108,17 @@ int vlc_mkdir( const char *dirname, mode_t mode )
 #endif
 }
 
+char *vlc_getcwd (void)
+{
+    wchar_t *wdir = _wgetcwd (NULL, 0);
+    if (wdir == NULL)
+        return NULL;
+
+    char *dir = FromWide (wdir);
+    free (wdir);
+    return dir;
+}
+
 /* Under Windows, these wrappers return the list of drive letters
  * when called with an empty argument or just '\'. */
 typedef struct vlc_DIR



More information about the vlc-commits mailing list