This is the mail archive of the cygwin-apps mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH setup 2/2] Improve file:// url handling


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();
      }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]