[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