From a5518540fc603b4a5cba59a75870ec4e6e14db93 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Sat, 9 Nov 2002 11:54:12 +0000
Subject: [PATCH] Fixed active FTP transfer (broken in rev 1.11), was waiting
 for connection from server before sending LIST/RETR command.

---
 src/sbbs3/execnet.cpp | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/sbbs3/execnet.cpp b/src/sbbs3/execnet.cpp
index fac39ad119..6cdf9301c5 100644
--- a/src/sbbs3/execnet.cpp
+++ b/src/sbbs3/execnet.cpp
@@ -614,7 +614,7 @@ SOCKET sbbs_t::ftp_data_sock(csi_t* csi, SOCKET ctrl_sock, SOCKADDR_IN* addr)
 
 		ip_addr.dw=ntohl(ctrl_addr.sin_addr.s_addr);
 		port.w=ntohs(addr->sin_port);
-		sprintf(cmd,"PORT %u,%u,%u,%u,%hu,%hu"
+		sprintf(cmd,"PORT %u,%u,%u,%u,%u,%u"
 			,ip_addr.b[3]
 			,ip_addr.b[2]
 			,ip_addr.b[1]
@@ -666,8 +666,20 @@ bool sbbs_t::ftp_get(csi_t* csi, SOCKET ctrl_sock, char* src, char* dest, bool d
 			close_socket(data_sock);
 			return(false);
 		}
+	}
 
-	} else {	/* Normal (Active) FTP */
+	if(dir)
+		sprintf(cmd,"LIST %s",src);
+	else
+		sprintf(cmd,"RETR %s",src);
+
+	if(!ftp_cmd(csi,ctrl_sock,cmd,rsp) 
+		|| atoi(rsp)!=150 /* Open data connection */) {
+		close_socket(data_sock);
+		return(false);
+	}
+
+	if(!(csi->ftp_mode&CS_FTP_PASV)) {	/* Normal (Active) FTP */
 
 		/* Setup for select() */
 		tv.tv_sec=TIMEOUT_SOCK_LISTEN;
@@ -697,17 +709,6 @@ bool sbbs_t::ftp_get(csi_t* csi, SOCKET ctrl_sock, char* src, char* dest, bool d
 		data_sock=accept_sock;
 	}
 
-	if(dir)
-		sprintf(cmd,"LIST %s",src);
-	else
-		sprintf(cmd,"RETR %s",src);
-
-	if(!ftp_cmd(csi,ctrl_sock,cmd,rsp) 
-		|| atoi(rsp)!=150 /* Open data connection */) {
-		close_socket(data_sock);
-		return(false);
-	}
-
 	if(!dir)
 		if((fp=fopen(dest,"wb"))==NULL) {
 			close_socket(data_sock);
-- 
GitLab