From 644185a5fe78fff280bbb35deb2f4e4ab51ad143 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 12 Jul 2009 20:04:06 +0300 Subject: [PATCH] make_URI: handle Windows UNC paths --- src/test/url.c | 3 ++- src/text/strings.c | 34 ++++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/test/url.c b/src/test/url.c index 875c9a5f7b..64060b5c2e 100644 --- a/src/test/url.c +++ b/src/test/url.c @@ -117,7 +117,8 @@ int main (void) test_path ("/", "file:///"); test_path ("/home/john/", "file:///home/john/"); test_path ("/home/john/music.ogg", "file:///home/john/music.ogg"); - //test_path ("\\\\server/pub/music.ogg", "file://server/pub/music.ogg"); + test_path ("\\\\server/pub/music.ogg", "smb://server/pub/music.ogg"); + test_path ("\\\\server\\pub\\music.ogg", "smb://server/pub/music.ogg"); /*int fd = open (".", O_RDONLY); assert (fd != -1);*/ diff --git a/src/text/strings.c b/src/text/strings.c index 1b42933d43..c2ab87bdda 100644 --- a/src/text/strings.c +++ b/src/text/strings.c @@ -1079,15 +1079,37 @@ char *make_URI (const char *path) } else #endif -#if 0 - /* Windows UNC paths (file://host/share/path instead of file:///path) */ if (!strncmp (path, "\\\\", 2)) - { - path += 2; - buf = strdup ("file://"); + { /* Windows UNC paths */ +#ifndef WIN32 + /* \\host\share\path -> smb://host/share/path */ + if (strchr (path + 2, '\\') != NULL) + { /* Convert antislashes to slashes */ + char *dup = strdup (path); + if (dup == NULL) + return NULL; + for (size_t i = 2; dup[i]; i++) + if (dup[i] == '\\') + dup[i] = DIR_SEP_CHAR; + + char *ret = make_URI (dup); + free (dup); + return ret; + } +# define SMB_SCHEME "smb" +#else + /* \\host\share\path -> file://host/share/path */ +# define SMB_SCHEME "file" +#endif + size_t hostlen = strcspn (path + 2, DIR_SEP); + + buf = malloc (sizeof (SMB_SCHEME) + 3 + hostlen); + if (buf != NULL) + snprintf (buf, sizeof (SMB_SCHEME) + 3 + hostlen, + SMB_SCHEME"://%s", path + 2); + path += 2 + hostlen; } else -#endif if (path[0] != DIR_SEP_CHAR) { /* Relative path: prepend the current working directory */ char cwd[PATH_MAX]; -- 2.39.5