[PATCH setup 2/2] Improve file:// url handling
Jon Turney
jon.turney@dronecode.org.uk
Tue Mar 6 20:43:00 GMT 2018
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();
> }
More information about the Cygwin-apps
mailing list