diff options
-rw-r--r-- | client/gvfsuriutils.c | 20 | ||||
-rw-r--r-- | common/gvfsutils.c | 20 | ||||
-rw-r--r-- | common/gvfsutils.h | 2 | ||||
-rw-r--r-- | daemon/gvfsbackenddav.c | 3 | ||||
-rw-r--r-- | daemon/gvfsbackendsmb.c | 2 |
5 files changed, 39 insertions, 8 deletions
diff --git a/client/gvfsuriutils.c b/client/gvfsuriutils.c index 58a71e19..57ad5f16 100644 --- a/client/gvfsuriutils.c +++ b/client/gvfsuriutils.c @@ -22,6 +22,7 @@ #include <config.h> #include "gvfsuriutils.h" +#include "gvfsutils.h" #include <string.h> #include <stdlib.h> @@ -264,12 +265,19 @@ g_vfs_encode_uri (GDecodedUri *decoded, gboolean allow_utf8) G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO, allow_utf8); g_string_append_c (uri, '@'); } - - g_string_append_uri_escaped (uri, decoded->host, - /* Allowed unescaped in hostname / ip address */ - G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":[]" , - allow_utf8); - + + if (gvfs_is_ipv6 (decoded->host)) + { + g_string_append (uri, decoded->host); + } + else + { + g_string_append_uri_escaped (uri, decoded->host, + /* Allowed unescaped in hostname / ip address */ + G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, + allow_utf8); + } + if (decoded->port != -1) { g_string_append_c (uri, ':'); diff --git a/common/gvfsutils.c b/common/gvfsutils.c index 1c5c2e3a..cb994e4f 100644 --- a/common/gvfsutils.c +++ b/common/gvfsutils.c @@ -125,3 +125,23 @@ gvfs_setup_debug_handler (void) sa.sa_flags = 0; sigaction (SIGUSR2, &sa, NULL); } + +gboolean +gvfs_is_ipv6 (const char *host) +{ + const char *p = host; + + g_return_val_if_fail (host != NULL, FALSE); + + if (*p != '[') + return FALSE; + + while (++p) + if (!g_ascii_isxdigit (*p) && *p != ':') + break; + + if (*p != ']' || *(p + 1) != '\0') + return FALSE; + + return TRUE; +} diff --git a/common/gvfsutils.h b/common/gvfsutils.h index 2c2146c8..acaea9d2 100644 --- a/common/gvfsutils.h +++ b/common/gvfsutils.h @@ -30,6 +30,8 @@ gboolean gvfs_get_debug (void); void gvfs_set_debug (gboolean debugging); void gvfs_setup_debug_handler (void); +gboolean gvfs_is_ipv6 (const char *host); + G_END_DECLS #endif /* __G_VFS_UTILS_H__ */ diff --git a/daemon/gvfsbackenddav.c b/daemon/gvfsbackenddav.c index 89fe54e2..e8a39030 100644 --- a/daemon/gvfsbackenddav.c +++ b/daemon/gvfsbackenddav.c @@ -59,6 +59,7 @@ #include "gvfsjobpush.h" #include "gvfsdaemonprotocol.h" #include "gvfsdaemonutils.h" +#include "gvfsutils.h" #ifdef HAVE_AVAHI #include "gvfsdnssdutils.h" @@ -1654,7 +1655,7 @@ g_mount_spec_to_dav_uri (GMountSpec *spec) soup_uri_set_user (uri, user); /* IPv6 host does not include brackets in SoupURI, but GMountSpec host does */ - if (host[0] == '[') + if (gvfs_is_ipv6 (host)) uri->host = g_strndup (host + 1, strlen (host) - 2); else soup_uri_set_host (uri, host); diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c index be648dcf..305c8853 100644 --- a/daemon/gvfsbackendsmb.c +++ b/daemon/gvfsbackendsmb.c @@ -326,7 +326,7 @@ create_smb_uri_string (const char *server, return uri; /* IPv6 server includes brackets in GMountSpec, smbclient doesn't */ - if (server[0] == '[') + if (gvfs_is_ipv6 (server)) { g_string_append_uri_escaped (uri, server + 1, NULL, FALSE); g_string_truncate (uri, uri->len - 3); |