|  | *** ftp-gw.c.orig	Sun Jun 22 16:27:42 1997 | 
|  | --- ftp-gw.c	Sun Jun 22 17:02:16 1997 | 
|  | *************** | 
|  | *** 11,31 **** | 
|  | --- 11,41 ---- | 
|  | */ | 
|  | static	char	RcsId[] = "$Header$"; | 
|  |  | 
|  | + /* | 
|  | +  * Patches for IP Filter NAT extensions written by Darren Reed, 7/7/96 | 
|  | +  * darrenr@cyber.com.au | 
|  | +  */ | 
|  | + static	char	vIpFilter[] = "v3.1.11"; | 
|  |  | 
|  | #include	<stdio.h> | 
|  | #include	<ctype.h> | 
|  | #include	<syslog.h> | 
|  | + #include	<unistd.h> | 
|  | + #include	<fcntl.h> | 
|  | #include	<sys/signal.h> | 
|  | #include	<sys/ioctl.h> | 
|  | #include	<sys/errno.h> | 
|  | extern	int	errno; | 
|  | + #ifdef	sun | 
|  | extern	char	*sys_errlist[]; | 
|  | + #endif | 
|  | #include	<arpa/ftp.h> | 
|  | #include	<arpa/telnet.h> | 
|  | #include	<sys/time.h> | 
|  | #include	<sys/types.h> | 
|  | #include	<sys/socket.h> | 
|  | #include	<netinet/in.h> | 
|  | + #include	<net/if.h> | 
|  |  | 
|  | extern	char	*rindex(); | 
|  | extern	char	*index(); | 
|  | *************** | 
|  | *** 36,41 **** | 
|  | --- 46,54 ---- | 
|  |  | 
|  | #include	"firewall.h" | 
|  |  | 
|  | + #include	"ip_compat.h" | 
|  | + #include	"ip_fil.h" | 
|  | + #include	"ip_nat.h" | 
|  |  | 
|  | #ifndef	BSIZ | 
|  | #define	BSIZ	2048 | 
|  | *************** | 
|  | *** 83,88 **** | 
|  | --- 96,103 ---- | 
|  | static	int	cmd_noop(); | 
|  | static	int	cmd_abor(); | 
|  | static	int	cmd_passthru(); | 
|  | + static	int	nat_destination(); | 
|  | + static	int	connectdest(); | 
|  | static	void	saveline(); | 
|  | static	void	flushsaved(); | 
|  | static	void	trap_sigurg(); | 
|  | *************** | 
|  | *** 317,323 **** | 
|  | if(authallflg) | 
|  | if(say(0,"220-Proxy first requires authentication")) | 
|  | exit(1); | 
|  | ! 			sprintf(xuf,"220 %s FTP proxy (Version %s) ready.",huf,FWTK_VERSION_MINOR); | 
|  | if(say(0,xuf)) | 
|  | exit(1); | 
|  | } | 
|  | --- 332,341 ---- | 
|  | if(authallflg) | 
|  | if(say(0,"220-Proxy first requires authentication")) | 
|  | exit(1); | 
|  | ! 			sprintf(xuf,"220-%s FTP proxy (Version %s) ready.",huf,FWTK_VERSION_MINOR); | 
|  | ! 			if(say(0,xuf)) | 
|  | ! 				exit(1); | 
|  | ! 			sprintf(xuf,"220-%s TIS ftp-gw with IP Filter %s NAT extensions",huf,vIpFilter); | 
|  | if(say(0,xuf)) | 
|  | exit(1); | 
|  | } | 
|  | *************** | 
|  | *** 338,343 **** | 
|  | --- 356,363 ---- | 
|  | exit(1); | 
|  | } | 
|  |  | 
|  | + 	nat_destination(0); | 
|  | + | 
|  | /* main loop */ | 
|  | while(1) { | 
|  | FD_ZERO(&rdy); | 
|  | *************** | 
|  | *** 608,619 **** | 
|  | static char	narg[] = "501 Missing or extra username"; | 
|  | static char	noad[] = "501 Use user@site to connect via proxy"; | 
|  | char		buf[1024]; | 
|  | - 	char 		mbuf[512]; | 
|  | char		*p; | 
|  | char		*dest; | 
|  | char		*user; | 
|  | int		x; | 
|  | - 	int		msg_int; | 
|  | short		port = FTPPORT; | 
|  |  | 
|  | /* kludgy but effective. if authorizing everything call auth instead */ | 
|  | --- 628,637 ---- | 
|  | *************** | 
|  | *** 643,648 **** | 
|  | --- 661,687 ---- | 
|  | return(sayn(0,noad,sizeof(noad))); | 
|  | } | 
|  |  | 
|  | + 	if((rfd == -1) && (x = connectdest(dest,port))) | 
|  | + 		return x; | 
|  | + 	sprintf(buf,"USER %s",user); | 
|  | + 	if(say(rfd,buf)) | 
|  | + 		return(1); | 
|  | + 	x = getresp(rfd,buf,sizeof(buf),1); | 
|  | + 	if(sendsaved(0,x)) | 
|  | + 		return(1); | 
|  | + 	return(say(0,buf)); | 
|  | + } | 
|  | + | 
|  | + static int | 
|  | + connectdest(dest,port) | 
|  | + char *dest; | 
|  | + short port; | 
|  | + { | 
|  | + 	char		buf[1024]; | 
|  | + 	char 		mbuf[512]; | 
|  | + 	int		msg_int; | 
|  | + 	int		x; | 
|  | + | 
|  | if(*dest == '\0') | 
|  | dest = "localhost"; | 
|  |  | 
|  | *************** | 
|  | *** 685,693 **** | 
|  | char	ebuf[512]; | 
|  |  | 
|  | strcpy(ebuf,buf); | 
|  | ! 		sprintf(buf,"521 %s: %s",dest,ebuf); | 
|  | return(say(0,buf)); | 
|  | } | 
|  | sprintf(buf,"----GATEWAY CONNECTED TO %s----",dest); | 
|  | saveline(buf); | 
|  |  | 
|  | --- 724,733 ---- | 
|  | char	ebuf[512]; | 
|  |  | 
|  | strcpy(ebuf,buf); | 
|  | ! 		sprintf(buf,"521 %s,%d: %s",dest,ntohs(port),ebuf); | 
|  | return(say(0,buf)); | 
|  | } | 
|  | + | 
|  | sprintf(buf,"----GATEWAY CONNECTED TO %s----",dest); | 
|  | saveline(buf); | 
|  |  | 
|  | *************** | 
|  | *** 698,711 **** | 
|  | return(say(0,buf)); | 
|  | } | 
|  | saveline(buf); | 
|  | ! | 
|  | ! 	sprintf(buf,"USER %s",user); | 
|  | ! 	if(say(rfd,buf)) | 
|  | ! 		return(1); | 
|  | ! 	x = getresp(rfd,buf,sizeof(buf),1); | 
|  | ! 	if(sendsaved(0,x)) | 
|  | ! 		return(1); | 
|  | ! 	return(say(0,buf)); | 
|  | } | 
|  |  | 
|  |  | 
|  | --- 738,745 ---- | 
|  | return(say(0,buf)); | 
|  | } | 
|  | saveline(buf); | 
|  | ! 	sendsaved(0,-1); | 
|  | ! 	return 0; | 
|  | } | 
|  |  | 
|  |  | 
|  | *************** | 
|  | *** 1591,1593 **** | 
|  | --- 1625,1671 ---- | 
|  | dup(nread); | 
|  | } | 
|  | #endif | 
|  | + | 
|  | + | 
|  | + static int | 
|  | + nat_destination(fd) | 
|  | + int fd; | 
|  | + { | 
|  | + 	struct	sockaddr_in	laddr, faddr; | 
|  | + 	struct	natlookup	natlookup; | 
|  | + 	char	*dest; | 
|  | + 	int	slen, natfd; | 
|  | + | 
|  | + 	bzero((char *)&laddr, sizeof(laddr)); | 
|  | + 	bzero((char *)&faddr, sizeof(faddr)); | 
|  | + 	slen = sizeof(laddr); | 
|  | + 	if(getsockname(fd,(struct sockaddr *)&laddr,&slen) < 0) { | 
|  | + 		perror("getsockname"); | 
|  | + 		exit(1); | 
|  | + 	} | 
|  | + 	slen = sizeof(faddr); | 
|  | + 	if(getpeername(fd,(struct sockaddr *)&faddr,&slen) < 0) { | 
|  | + 		perror("getsockname"); | 
|  | + 		exit(1); | 
|  | + 	} | 
|  | + | 
|  | + 	natlookup.nl_inport = laddr.sin_port; | 
|  | + 	natlookup.nl_outport = faddr.sin_port; | 
|  | + 	natlookup.nl_inip = laddr.sin_addr; | 
|  | + 	natlookup.nl_outip = faddr.sin_addr; | 
|  | + 	natlookup.nl_flags = IPN_TCP; | 
|  | + 	if((natfd = open(IPL_NAT, O_RDONLY)) < 0) { | 
|  | + 		perror("open"); | 
|  | + 		exit(1); | 
|  | + 	} | 
|  | + 	if(ioctl(natfd, SIOCGNATL, &natlookup) == -1) { | 
|  | + 		syslog(LOG_ERR, "SIOCGNATL failed: %m\n"); | 
|  | + 		close(natfd); | 
|  | + 		if(say(0,"220 Ready")) | 
|  | + 			exit(1); | 
|  | + 		return 0; | 
|  | + 	} | 
|  | + 	close(natfd); | 
|  | + 	return connectdest(inet_ntoa(natlookup.nl_realip), | 
|  | + 			   ntohs(natlookup.nl_realport)); | 
|  | + } |