diff -ru frox-0.6.7-orig/src/common.h frox-0.6.7/src/common.h --- frox-0.6.7-orig/src/common.h Sat May 12 17:23:05 2001 +++ frox-0.6.7/src/common.h Wed Dec 12 21:40:43 2001 @@ -57,6 +57,8 @@ #include "systwrap.h" +#define DEBUG 1 + /* Defines */ #ifdef DEBUG #define debug(S) fprintf(stderr,S) @@ -198,7 +200,7 @@ int transdata_needprivs(void); int transp_connect(struct sockaddr_in dest, struct sockaddr_in src); int intercept_listen(struct sockaddr_in intercept, - struct sockaddr_in listen_on, socketuse use); + struct sockaddr_in *listen_on, socketuse use); int il_free(void); #else static inline int transdata_setup(void){return -1;}; diff -ru frox-0.6.7-orig/src/ftp-cmds.c frox-0.6.7/src/ftp-cmds.c --- frox-0.6.7-orig/src/ftp-cmds.c Wed Apr 18 20:46:28 2001 +++ frox-0.6.7/src/ftp-cmds.c Wed Dec 12 21:49:08 2001 @@ -170,7 +170,7 @@ { char newbuf[60]; int a1,a2,a3,a4,p1,p2; - struct sockaddr_in tmp; + struct sockaddr_in tmp, tmp2; int code; char msg[MAX_LINE_LEN]; @@ -193,11 +193,24 @@ if(config_transdata()){ get_local_address(&tmp); - info->listen=intercept_listen(info->server_data.address, tmp, PASV); + /* modified by hzd */ + tmp2 = info->server_data.address; + tmp2.sin_port = htons(0); + + info->listen=intercept_listen(tmp2, &tmp, PASV); if(info->listen!=-1) { - send_message(227, msg); - info->mode = PASSIVE; - return; + tmp2.sin_port = tmp.sin_port; + n2com(tmp2,&a1,&a2,&a3,&a4,&p1,&p2); + + snprintf(newbuf,60,"Entering Passive Mode (%d,%d,%d,%d,%d,%d)", + a1,a2,a3,a4,p1,p2); + + debug(" Rewritten transparent 227 reply:\n"); + + send_message(227, newbuf); + info->mode = PASSIVE; + + return; } debug("Intercept_listen failed. Rewriting 227 reply instead\n"); } diff -ru frox-0.6.7-orig/src/linux.c frox-0.6.7/src/linux.c --- frox-0.6.7-orig/src/linux.c Tue Jul 10 18:06:34 2001 +++ frox-0.6.7/src/linux.c Wed Dec 12 21:49:11 2001 @@ -241,7 +241,7 @@ ** means you can only have one intercept_listening socket per ** process. ** ------------------------------------------------------------- */ -int intercept_listen(struct sockaddr_in intercept, struct sockaddr_in listen_on, socketuse use) +int intercept_listen(struct sockaddr_in intercept, struct sockaddr_in *listen_on, socketuse use) { int i, sockfd; @@ -261,7 +261,7 @@ if(sufd<1) return -1; lo=config_loport(use); hi=config_hiport(use); - i=bind_me(sockfd, &listen_on, lo, hi, hi-lo); + i=bind_me(sockfd, listen_on, lo, hi, hi-lo); } if(i){ @@ -286,7 +286,9 @@ req.src.sin_addr.s_addr=INADDR_ANY; req.dest=intercept; - req.to=listen_on; + /* modified by hzd */ + req.dest.sin_port=listen_on->sin_port; + req.to=*listen_on; req.type=DNAT; req.pid=getpid(); Only in frox-0.6.7: stamp-h