Hi, Currently there is no IPv6 support in the ftp module[1]. It's quite annoying. I've made quick patch that works. The patch add a gconf key to use the old behaviour. The problem is that there still some protocol specific code (sockaddr_in and so on) in the kerberos code I cannot deal with. Could you give me a more informations about the best way to solve this problem Regards Laurent [1] http://bugzilla.gnome.org/show_bug.cgi?id=157457
Index: modules/ftp-method.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/modules/ftp-method.c,v
retrieving revision 1.129
diff -u -p -r1.129 ftp-method.c
--- modules/ftp-method.c 28 Sep 2006 17:40:17 -0000 1.129
+++ modules/ftp-method.c 19 Dec 2006 14:39:17 -0000
@@ -151,6 +151,7 @@ static const char USE_PROXY_KEY[] = "/sy
static const char PROXY_FTP_HOST_KEY[] = "/system/proxy/ftp_host";
static const char PROXY_FTP_PORT_KEY[] = "/system/proxy/ftp_port";
+static const char FTP_USE_OLD_PASV_KEY[] = "/system/ftp/use_old_pasv";
static GnomeVFSResult do_open (GnomeVFSMethod *method,
GnomeVFSMethodHandle **method_handle,
@@ -189,6 +190,9 @@ static const int control_port = 21;
static gchar *proxy_host = NULL;
static int proxy_port = 0;
+/* Old PASV command */
+static gboolean old_pasv = FALSE;
+
/* A GHashTable of FtpConnectionPool */
static GHashTable *connection_pools = NULL;
@@ -685,31 +689,55 @@ do_transfer_command (FtpConnection *conn
}
/* FIXME bugzilla.eazel.com 1464: implement non-PASV mode */
+ if (!old_pasv) {
+ /* send EPSV RFC 2428*/
+ result = do_basic_command (conn, "EPSV", cancellation);
- /* send PASV */
- result = do_basic_command (conn, "PASV", cancellation);
-
- if (result != GNOME_VFS_OK) {
- return result;
- }
+ if (result != GNOME_VFS_OK) {
+ return result;
+ }
+
+ host = g_strdup (conn->pool->ip);
+
+ {
+ gchar *ptr, *response = g_strdup (conn->response_message);
+ ptr = strchr (response, '(');
+ if (!ptr ||
+ (sscanf (ptr+1,"|||%d|",&port) != 1)) {
+ g_free (response);
+ return GNOME_VFS_ERROR_CORRUPTED_DATA;
+ }
- /* parse response */
- {
- gint a1, a2, a3, a4, p1, p2;
- gchar *ptr, *response = g_strdup (conn->response_message);
- ptr = strchr (response, '(');
- if (!ptr ||
- (sscanf (ptr+1,"%d,%d,%d,%d,%d,%d", &a1, &a2, &a3,
- &a4, &p1, &p2) != 6)) {
g_free (response);
- return GNOME_VFS_ERROR_CORRUPTED_DATA;
+
+ }
+ }
+ else {
+ /* send PASV */
+ result = do_basic_command (conn, "PASV", cancellation);
+
+ if (result != GNOME_VFS_OK) {
+ return result;
}
- host = g_strdup_printf ("%d.%d.%d.%d", a1, a2, a3, a4);
- port = p1*256 + p2;
+ /* parse response */
+ {
+ gint a1, a2, a3, a4, p1, p2;
+ gchar *ptr, *response = g_strdup (conn->response_message);
+ ptr = strchr (response, '(');
+ if (!ptr ||
+ (sscanf (ptr+1,"%d,%d,%d,%d,%d,%d", &a1, &a2, &a3,
+ &a4, &p1, &p2) != 6)) {
+ g_free (response);
+ return GNOME_VFS_ERROR_CORRUPTED_DATA;
+ }
+
+ host = g_strdup_printf ("%d.%d.%d.%d", a1, a2, a3, a4);
+ port = p1*256 + p2;
- g_free (response);
+ g_free (response);
+ }
}
/* connect */
@@ -3002,6 +3030,8 @@ vfs_module_init (const char *method_name
PROXY_FTP_PORT_KEY,
NULL);
} else proxy_host = NULL;
+
+ old_pasv = gconf_client_get_bool (gclient, FTP_USE_OLD_PASV_KEY, NULL);
}
return &method;
Attachment:
pgpBXkeoFb2lS.pgp
Description: PGP signature