summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/gvfsuriutils.c20
-rw-r--r--common/gvfsutils.c20
-rw-r--r--common/gvfsutils.h2
-rw-r--r--daemon/gvfsbackenddav.c3
-rw-r--r--daemon/gvfsbackendsmb.c2
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);