Commit 5d7ac198 authored by Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf

Revert "win32 opendir: remove broken and obsolete special mode"

This reverts commit 5bb66d73.
parent dc894c97
...@@ -127,7 +127,11 @@ char *vlc_getcwd (void) ...@@ -127,7 +127,11 @@ char *vlc_getcwd (void)
typedef struct vlc_DIR typedef struct vlc_DIR
{ {
_WDIR *wdir; /* MUST be first, see <vlc_fs.h> */ _WDIR *wdir; /* MUST be first, see <vlc_fs.h> */
bool insert_dot_dot; union
{
DWORD drives;
bool insert_dot_dot;
} u;
} vlc_DIR; } vlc_DIR;
...@@ -144,8 +148,17 @@ DIR *vlc_opendir (const char *dirname) ...@@ -144,8 +148,17 @@ DIR *vlc_opendir (const char *dirname)
return NULL; 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 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); _WDIR *wdir = _wopendir (wpath);
free (wpath); free (wpath);
...@@ -162,10 +175,29 @@ char *vlc_readdir (DIR *dir) ...@@ -162,10 +175,29 @@ char *vlc_readdir (DIR *dir)
{ {
vlc_DIR *p_dir = (vlc_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! */ /* Adds "..", gruik! */
p_dir->insert_dot_dot = false; p_dir->u.insert_dot_dot = false;
return strdup (".."); return strdup ("..");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment