praszyk 653c60b
--- netkit-ftp-0.17/ftp/ftp_var.h.rasold	2006-01-12 11:23:16.000000000 +0100
praszyk 653c60b
+++ netkit-ftp-0.17/ftp/ftp_var.h	2006-01-12 11:24:06.000000000 +0100
praszyk 653c60b
@@ -69,6 +69,7 @@
praszyk 653c60b
 Extern int	bell;		/* ring bell on cmd completion */
praszyk 653c60b
 Extern int	doglob;		/* glob local file names */
praszyk 653c60b
 Extern int	autologin;	/* establish user account on connection */
praszyk 653c60b
+Extern int	multihome;	/* multi homed host, use same interface for cmd and data channels */
praszyk 653c60b
 Extern int	proxy;		/* proxy server connection active */
praszyk 653c60b
 Extern int	proxflag;	/* proxy connection exists */
praszyk 653c60b
 Extern int	sunique;	/* store files on server with unique name */
praszyk 653c60b
--- netkit-ftp-0.17/ftp/ftp.c.rasold	2006-01-12 11:14:55.000000000 +0100
praszyk 653c60b
+++ netkit-ftp-0.17/ftp/ftp.c	2006-01-12 11:22:42.000000000 +0100
praszyk 653c60b
@@ -132,6 +132,7 @@
praszyk 653c60b
 static sigjmp_buf ptabort;
praszyk 653c60b
 static int ptabflg = 0;
praszyk 653c60b
 static int abrtflag = 0;
praszyk 653c60b
+struct sockaddr_in source;
praszyk 653c60b
 
praszyk 653c60b
 void lostpeer(int);
praszyk 653c60b
 extern int connected;
praszyk 653c60b
@@ -153,7 +154,7 @@
praszyk 653c60b
 char *
praszyk 653c60b
 hookup(const char *host, const char *port)
praszyk 653c60b
 {
praszyk 653c60b
-	int s, tos, error;
praszyk 653c60b
+	int s, tos, error, alen;
praszyk 653c60b
 	socklen_t len;
praszyk 653c60b
 	static char hostnamebuf[256];
praszyk 653c60b
 	struct addrinfo hints, *res, *res0;
praszyk 653c60b
@@ -278,7 +279,11 @@
praszyk 653c60b
 	}
praszyk 653c60b
 	if (verbose)
praszyk 653c60b
 		printf("Connected to %s (%s).\n", hostname, hbuf);
praszyk 653c60b
-	if (getreply(0) > 2) { 	/* read startup message from server */
praszyk 653c60b
+	alen = sizeof(source);
praszyk 653c60b
+	getsockname(s,(struct sockaddr*)&source, &alen;;
praszyk 653c60b
+	source.sin_port = 0;    /* We just want the addr, not the port */
praszyk 653c60b
+
praszyk 653c60b
+	if (getreply(0) > 2) { 	/* read startup message from server    */
praszyk 653c60b
 		if (cin)
praszyk 653c60b
 			(void) fclose(cin);
praszyk 653c60b
 		if (cout)
praszyk 653c60b
@@ -1254,6 +1259,13 @@
praszyk 653c60b
 			perror("ftp: socket");
praszyk 653c60b
 			return(1);
praszyk 653c60b
 		}
praszyk 653c60b
+		if((multihome) &&
praszyk 653c60b
+			bind(data, (struct sockaddr*)&source, sizeof(source)) == -1) {
praszyk 653c60b
+			close(data);
praszyk 653c60b
+			data = -1;
praszyk 653c60b
+			perror("ftp multihome bind");
praszyk 653c60b
+			return(1);
praszyk 653c60b
+                }
praszyk 653c60b
 		if (options & SO_DEBUG &&
praszyk 653c60b
 		    setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
praszyk 653c60b
 			       sizeof (on)) < 0)
praszyk 653c60b
--- netkit-ftp-0.17/ftp/main.c.rasold	2006-01-12 11:24:27.000000000 +0100
praszyk 653c60b
+++ netkit-ftp-0.17/ftp/main.c	2006-01-12 11:27:20.000000000 +0100
praszyk 653c60b
@@ -93,6 +93,7 @@
praszyk 653c60b
 	printf("\t   -n: inhibit auto-login\n");
praszyk 653c60b
 	printf("\t   -e: disable readline support, if present\n");
praszyk 653c60b
 	printf("\t   -g: disable filename globbing\n");
praszyk 653c60b
+	printf("\t   -m: don't force data channel interface to the same as control channel\n");
praszyk 653c60b
 	printf("\t   -v: verbose mode\n");
praszyk 653c60b
 	printf("\t   -t: enable packet tracing [nonfunctional]\n");
praszyk 653c60b
 	printf("\t   -d: enable debugging\n");
praszyk 653c60b
@@ -120,6 +121,7 @@
praszyk 653c60b
 	doglob = 1;
praszyk 653c60b
 	interactive = 1;
praszyk 653c60b
 	autologin = 1;
praszyk 653c60b
+	multihome = 1;
praszyk 653c60b
 	passivemode = 1;
praszyk 653c60b
 
praszyk 653c60b
         cp = strrchr(argv[0], '/');
praszyk 653c60b
@@ -172,6 +174,10 @@
praszyk 653c60b
 				rl_inhibit = 1;
praszyk 653c60b
 				break;
praszyk 653c60b
 				
praszyk 653c60b
+			case 'm':
praszyk 653c60b
+				multihome = 0;
praszyk 653c60b
+				break;
praszyk 653c60b
+
praszyk 653c60b
 			case 'h':
praszyk 653c60b
 				usage();
praszyk 653c60b
 				exit(0);
praszyk 653c60b
--- netkit-ftp-0.17/ftp/ftp.1.rasold	2006-01-12 11:14:09.000000000 +0100
praszyk 653c60b
+++ netkit-ftp-0.17/ftp/ftp.1	2006-01-12 11:15:48.000000000 +0100
praszyk 653c60b
@@ -92,6 +92,10 @@
praszyk 653c60b
 executable. Otherwise, does nothing.
praszyk 653c60b
 .It Fl g
praszyk 653c60b
 Disables file name globbing.
praszyk 653c60b
+.It Fl m
praszyk 653c60b
+The default requires that ftp explicitly binds to the same interface for the data
praszyk 653c60b
+channel as the control channel in passive mode. Useful on multi-homed
praszyk 653c60b
+clients. This option disables this behavior.
praszyk 653c60b
 .It Fl v
praszyk 653c60b
 Verbose option forces
praszyk 653c60b
 .Nm ftp