[PATCH setup 2/2] Improve file:// url handling
SZAVAI Gyula
szgyg@ludens.elte.hu
Wed Feb 28 11:54:00 GMT 2018
As a repo url, we're accepting
* raw windows paths (with both \ and /)
c:\cygwin repo
\\machine\share\cygwin repo
* proper file: urls
file:///c:/cygwin%20repo
file://machine/share/cygwin%20repo
Most non-standard urls accepted by the old code should work, too.
Paths longer than 260 characters are not supported anymore.
---
netio.cc | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/netio.cc b/netio.cc
index c8982de..1e784b1 100644
--- a/netio.cc
+++ b/netio.cc
@@ -25,6 +25,8 @@
#include <stdlib.h>
#include <string.h>
+#include <Shlwapi.h>
+
#include "resource.h"
#include "state.h"
#include "msg.h"
@@ -72,11 +74,24 @@ NetIO::open (char const *url, bool cachable)
else if (strncmp (url, "ftps://", 7) == 0)
proto = ftps;
else if (strncmp (url, "file://", 7) == 0)
- proto = file;
- else
{
proto = file;
- file_url = (std::string("file://") + url);
+
+ // WinInet expects a legacy file:// url
+ // (a windows path with "file://" prepended)
+ // https://blogs.msdn.microsoft.com/freeassociations/2005/05/19/the-bizarre-and-unhappy-story-of-file-urls/
+ char path[MAX_PATH];
+ DWORD len = MAX_PATH;
+ if (S_OK == PathCreateFromUrl(url, path, &len, 0))
+ {
+ file_url = std::string("file://") + path;
+ url = file_url.c_str();
+ }
+ }
+ else // treat everything else as a windows path
+ {
+ proto = file;
+ file_url = std::string("file://") + url;
url = file_url.c_str();
}
--
2.16.1
More information about the Cygwin-apps
mailing list