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]

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


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


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