]> git.sesse.net Git - vlc/commitdiff
Revert "win32 opendir: remove broken and obsolete special mode"
authorJean-Baptiste Kempf <jb@videolan.org>
Fri, 16 Aug 2013 08:59:17 +0000 (10:59 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 16 Aug 2013 08:59:17 +0000 (10:59 +0200)
This reverts commit 5bb66d739c32023b033c6fde0cd7c807493f4fbf.

src/win32/filesystem.c

index f20f7e4ff4db6e0d95d613aac1e5ef0805a91487..e1317a42a7c573de4eb78b25235e4668b80c2c50 100644 (file)
@@ -127,7 +127,11 @@ char *vlc_getcwd (void)
 typedef struct vlc_DIR
 {
     _WDIR *wdir; /* MUST be first, see <vlc_fs.h> */
-    bool insert_dot_dot;
+    union
+    {
+        DWORD drives;
+        bool insert_dot_dot;
+    } u;
 } vlc_DIR;
 
 
@@ -144,8 +148,17 @@ DIR *vlc_opendir (const char *dirname)
         return NULL;
     }
 
+    if (wpath[0] == L'\0' || (wcscmp (wpath, L"\\") == 0))
+    {
+        free (wpath);
+        /* Special mode to list drive letters */
+        p_dir->wdir = NULL;
+        p_dir->u.drives = GetLogicalDrives ();
+        return (void *)p_dir;
+    }
+
     assert (wpath[0]); // wpath[1] is defined
-    p_dir->insert_dot_dot = !wcscmp (wpath + 1, L":\\");
+    p_dir->u.insert_dot_dot = !wcscmp (wpath + 1, L":\\");
 
     _WDIR *wdir = _wopendir (wpath);
     free (wpath);
@@ -162,10 +175,29 @@ char *vlc_readdir (DIR *dir)
 {
     vlc_DIR *p_dir = (vlc_DIR *)dir;
 
-    if (p_dir->insert_dot_dot)
+    if (p_dir->wdir == NULL)
+    {
+        /* Drive letters mode */
+        DWORD drives = p_dir->u.drives;
+        if (drives == 0)
+            return NULL; /* end */
+
+        unsigned int i;
+        for (i = 0; !(drives & 1); i++)
+            drives >>= 1;
+        p_dir->u.drives &= ~(1UL << i);
+        assert (i < 26);
+
+        char *ret;
+        if (asprintf (&ret, "%c:\\", 'A' + i) == -1)
+            return NULL;
+        return ret;
+    }
+
+    if (p_dir->u.insert_dot_dot)
     {
         /* Adds "..", gruik! */
-        p_dir->insert_dot_dot = false;
+        p_dir->u.insert_dot_dot = false;
         return strdup ("..");
     }