From 5d7ac19898a7bd54d20ac500d318c8f0b5f36051 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kempf Date: Fri, 16 Aug 2013 10:59:17 +0200 Subject: [PATCH] Revert "win32 opendir: remove broken and obsolete special mode" This reverts commit 5bb66d739c32023b033c6fde0cd7c807493f4fbf. --- src/win32/filesystem.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/win32/filesystem.c b/src/win32/filesystem.c index f20f7e4ff4..e1317a42a7 100644 --- a/src/win32/filesystem.c +++ b/src/win32/filesystem.c @@ -127,7 +127,11 @@ char *vlc_getcwd (void) typedef struct vlc_DIR { _WDIR *wdir; /* MUST be first, see */ - 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 (".."); } -- 2.39.5