On 28/02/2018 11:51, SZAVAI Gyula wrote:
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.
Great, thanks! I applied these patches.
---
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>
This needs to be lower-case to compile on a case-sensitive system
(I think all w32api headers have lower-case names, notwithstanding MS's
use of random case on a non-case-sensitive system)
+
#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();
+ }
If PathCreateFromUrl fails (longer than PATH_MAX?), how intelligibly is
that failure reported?
I suspect PathCreateFromUrlA is being called here. What happens if
there is a non-ascii character in the URL?
+ }
+ else // treat everything else as a windows path
+ {
+ proto = file;
+ file_url = std::string("file://") + url;
url = file_url.c_str();
}