| diff -c -r ./ftp-gw/ftp-gw.c ../../NEW/fwtk/ftp-gw/ftp-gw.c |
| *** ./ftp-gw/ftp-gw.c Fri Sep 6 12:55:05 1996 |
| --- ../../NEW/fwtk/ftp-gw/ftp-gw.c Wed Oct 9 02:51:35 1996 |
| *************** |
| *** 40,47 **** |
| |
| extern char *optarg; |
| |
| ! #include "firewall.h" |
| |
| |
| #ifndef BSIZ |
| #define BSIZ 2048 |
| --- 40,48 ---- |
| |
| extern char *optarg; |
| |
| ! char *getdsthost(); |
| |
| + #include "firewall.h" |
| |
| #ifndef BSIZ |
| #define BSIZ 2048 |
| *************** |
| *** 84,89 **** |
| --- 85,92 ---- |
| static int cmdcnt = 0; |
| static int timeout = PROXY_TIMEOUT; |
| |
| + static int do_transparent=0; |
| + |
| |
| static int cmd_user(); |
| static int cmd_authorize(); |
| *************** |
| *** 98,103 **** |
| --- 101,107 ---- |
| static void saveline(); |
| static void flushsaved(); |
| static void trap_sigurg(); |
| + static int connectdest(); |
| |
| #define OP_CONN 001 /* only valid if connected */ |
| #define OP_WCON 002 /* writethrough if connected */ |
| *************** |
| *** 170,175 **** |
| --- 174,180 ---- |
| char xuf[1024]; |
| char huf[128]; |
| char *passuser = (char *)0; /* passed user as av */ |
| + char *psychic, *hotline; |
| |
| #ifndef LOG_DAEMON |
| openlog("ftp-gw",LOG_PID); |
| *************** |
| *** 314,319 **** |
| --- 319,326 ---- |
| } else |
| timeout = 60*60; |
| |
| + psychic=getdsthost(0,NULL); |
| + if(psychic) { do_transparent++; } |
| |
| /* display a welcome file or message */ |
| if(passuser == (char *)0) { |
| *************** |
| *** 322,327 **** |
| --- 329,340 ---- |
| syslog(LLEV,"fwtkcfgerr: welcome-msg must have one parameter, line %d",cf->ln); |
| exit(1); |
| } |
| + if(do_transparent) { |
| + if(sayfile2(0,cf->argv[0],220)) { |
| + syslog(LLEV,"fwtksyserr: cannot display welcome %s: %m",cf->argv[0]); |
| + exit(1); |
| + } |
| + } else |
| if(sayfile(0,cf->argv[0],220)) { |
| syslog(LLEV,"fwtksyserr: cannot display welcome %s: %m",cf->argv[0]); |
| exit(1); |
| *************** |
| *** 332,338 **** |
| 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); |
| } |
| --- 345,357 ---- |
| if(authallflg) |
| if(say(0,"220-Proxy first requires authentication")) |
| exit(1); |
| ! /* foo */ |
| ! if(do_transparent) |
| ! sprintf(xuf,"220-%s FTP proxy (Version %s) ready.",huf,FWTK_VERSION_MINOR); |
| ! else |
| ! sprintf(xuf,"220 %s FTP Proxy (Version %s) ready.",huf,FWTK_VERSION_MINOR); |
| ! /* foo */ |
| ! |
| if(say(0,xuf)) |
| exit(1); |
| } |
| *************** |
| *** 353,358 **** |
| --- 372,381 ---- |
| exit(1); |
| } |
| |
| + if(do_transparent) { |
| + connectdest(psychic,21); |
| + } |
| + |
| /* main loop */ |
| while(1) { |
| FD_ZERO(&rdy); |
| *************** |
| *** 676,681 **** |
| --- 699,713 ---- |
| return(sayn(0,noad,sizeof(noad)-1)); |
| } |
| |
| + if(do_transparent) { |
| + 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)); |
| + } |
| + |
| if(*dest == '\0') |
| dest = "localhost"; |
| |
| *************** |
| *** 701,708 **** |
| if(msg_int == 1) { |
| sprintf(mbuf,"Permission denied for user %s to connect to %s",authuser,dest); |
| syslog(LLEV,"deny host=%s/%s connect to %s user=%s",rladdr,riaddr,dest,authuser); |
| ! say(0,mbuf); |
| ! return(1); |
| } else { |
| if(msg_int == -1) { |
| sprintf(mbuf,"No match in netperm-table for %s to ftp to %s",authuser,dest); |
| --- 733,740 ---- |
| if(msg_int == 1) { |
| sprintf(mbuf,"Permission denied for user %s to connect to %s",authuser,dest); |
| syslog(LLEV,"deny host=%s/%s connect to %s user=%s",rladdr,riaddr,dest,authuser); |
| ! say(0,mbuf); |
| ! return(1); |
| } else { |
| if(msg_int == -1) { |
| sprintf(mbuf,"No match in netperm-table for %s to ftp to %s",authuser,dest); |
| *************** |
| *** 717,723 **** |
| char ebuf[512]; |
| |
| strcpy(ebuf,buf); |
| ! sprintf(buf,"521 %s: %s",dest,ebuf); |
| rfd = -1; |
| return(say(0,buf)); |
| } |
| --- 749,759 ---- |
| char ebuf[512]; |
| |
| strcpy(ebuf,buf); |
| ! if(do_transparent) { |
| ! sprintf(buf,"521 %s,%d: %s",dest,ntohs(port),ebuf); |
| ! } else { |
| ! sprintf(buf,"521 %s: %s",dest,ebuf); |
| ! } |
| rfd = -1; |
| return(say(0,buf)); |
| } |
| *************** |
| *** 732,737 **** |
| --- 768,778 ---- |
| } |
| saveline(buf); |
| |
| + /* if(do_transparent) { |
| + sendsaved(0,-1); |
| + return(0); |
| + } /* EEEk. I can't remember what this does. */ |
| + |
| sprintf(buf,"USER %s",user); |
| if(say(rfd,buf)) |
| return(1); |
| *************** |
| *** 744,749 **** |
| --- 785,860 ---- |
| return 0; |
| } |
| |
| + static int connectdest(dest, port) |
| + char *dest; |
| + short port; |
| + { |
| + char buf[1024], mbuf[512]; |
| + int msg_int, x; |
| + |
| + if(*dest == '\0') |
| + dest = "localhost"; |
| + |
| + if(validests != (char **)0) { |
| + char **xp; |
| + int x; |
| + |
| + for(xp = validests; *xp != (char *)0; xp++) { |
| + if(**xp == '!' && hostmatch(*xp + 1,dest)) { |
| + return(baddest(0,dest)); |
| + } else { |
| + if(hostmatch(*xp,dest)) |
| + break; |
| + } |
| + } |
| + if(*xp == (char *)0) |
| + return(baddest(0,dest)); |
| + } |
| + |
| + /* Extended permissions processing goes in here for destination */ |
| + if(extendperm) { |
| + msg_int = auth_perm(confp, authuser, "ftp-gw", dest,(char *)0); |
| + if(msg_int == 1) { |
| + sprintf(mbuf,"Permission denied for user %s to connect to %s",authuser,dest); |
| + syslog(LLEV,"deny host=%s/%s connect to %s user=%s",rladdr,riaddr,dest,authuser); |
| + say(0,mbuf); |
| + return(1); |
| + } else { |
| + if(msg_int == -1) { |
| + sprintf(mbuf,"No match in netperm-table for %s to ftp to %s",authuser,dest); |
| + say(0,mbuf); |
| + return(1); |
| + } |
| + } |
| + } |
| + |
| + syslog(LLEV,"permit host=%s/%s connect to %s",rladdr,riaddr,dest); |
| + |
| + if((rfd = conn_server(dest,port,0,buf)) < 0) { |
| + char ebuf[512]; |
| + |
| + strcpy(ebuf,buf); |
| + sprintf(buf,"521 %s: %s",dest,ebuf); |
| + rfd = -1; |
| + return(say(0,buf)); |
| + } |
| + if(!do_transparent) { |
| + sprintf(buf,"----GATEWAY CONNECTED TO %s----",dest); |
| + saveline(buf); |
| + } |
| + |
| + /* we are now connected and need to try the autologin thing */ |
| + x = getresp(rfd,buf,sizeof(buf),1); |
| + if(x / 100 != COMPLETE) { |
| + sendsaved(0,-1); |
| + return(say(0,buf)); |
| + } |
| + saveline(buf); |
| + |
| + sendsaved(0,-1); |
| + return 0; |
| + } |
| + |
| |
| |
| static int |
| *************** |
| *** 1053,1058 **** |
| --- 1164,1171 ---- |
| static char nprn[] = "500 cannot get peername"; |
| char buf[512]; |
| |
| + /* syslog(LLEV,"DEBUG: port cmd"); */ |
| + |
| if(ac < 2) |
| return(sayn(0,narg,sizeof(narg)-1)); |
| |
| *************** |
| *** 1119,1124 **** |
| --- 1232,1238 ---- |
| #define UC(c) (((int)c) & 0xff) |
| sprintf(buf,"PORT %d,%d,%d,%d,%d,%d\r\n",UC(k[0]),UC(k[1]),UC(k[2]), |
| UC(k[3]),UC(l[0]),UC(l[1])); |
| + /* syslog(LLEV,"DEBUG: %s",buf); */ |
| s = strlen(buf); |
| if (write(rfd, buf, s) != s) |
| return 1; |
| *************** |
| *** 1330,1335 **** |
| --- 1444,1450 ---- |
| callback() |
| { |
| /* if we haven't gotten a valid PORT scrub the connection */ |
| + /* syslog(LLEV,"DEBUG: callback()."); */ |
| if((outgoing = accept(boundport,(struct sockaddr *)0,(int *)0)) < 0 || clntport.sin_port == 0) |
| goto bomb; |
| if(pasvport != -1) { /* incoming handled by PASVcallback */ |
| *************** |
| *** 1796,1801 **** |
| --- 1911,1960 ---- |
| } |
| return(0); |
| } |
| + |
| + /* ok, so i'm in a hurry. english paper due RSN. */ |
| + sayfile2(fd,fn,code) |
| + int fd; |
| + char *fn; |
| + int code; |
| + { |
| + FILE *f; |
| + char buf[BUFSIZ]; |
| + char yuf[BUFSIZ]; |
| + char *c; |
| + int x; |
| + int saidsomething = 0; |
| + |
| + if((f = fopen(fn,"r")) == (FILE *)0) |
| + return(1); |
| + while(fgets(buf,sizeof(buf),f) != (char *)0) { |
| + if((c = index(buf,'\n')) != (char *)0) |
| + *c = '\0'; |
| + x = fgetc(f); |
| + if(feof(f)) |
| + sprintf(yuf,"%3.3d-%s",code,buf); |
| + else { |
| + sprintf(yuf,"%3.3d-%s",code,buf); |
| + ungetc(x,f); |
| + } |
| + if(say(fd,yuf)) { |
| + fclose(f); |
| + return(1); |
| + } |
| + saidsomething++; |
| + } |
| + fclose(f); |
| + if (!saidsomething) { |
| + syslog(LLEV,"fwtkcfgerr: sayfile for %d is empty",code); |
| + sprintf(yuf, "%3.3d The file to display is empty",code); |
| + if(say(fd,yuf)) { |
| + fclose(f); |
| + return(1); |
| + } |
| + } |
| + return(0); |
| + } |
| + |
| |
| |
| porttoaddr(s,a) |
| diff -c -r ./http-gw/http-gw.c ../../NEW/fwtk/http-gw/http-gw.c |
| *** ./http-gw/http-gw.c Mon Sep 9 14:40:53 1996 |
| --- ../../NEW/fwtk/http-gw/http-gw.c Wed Oct 9 02:51:57 1996 |
| *************** |
| *** 27,32 **** |
| --- 27,37 ---- |
| static char http_buffer[8192]; |
| static char reason[8192]; |
| static int checkBrowserType = 1; |
| + /* foo */ |
| + static int do_transparent=0; |
| + /* foo */ |
| + |
| + char *getdsthost(); |
| |
| static void do_logging() |
| { char *proto = "GOPHER"; |
| *************** |
| *** 422,427 **** |
| --- 427,443 ---- |
| /*(NOT A SPECIAL FORM)*/ |
| |
| if((rem_type & TYPE_LOCAL)== 0){ |
| + /* foo */ |
| + char *psychic=getdsthost(sockfd,&def_port); |
| + if(psychic) { |
| + if(strlen(psychic)<=MAXHOSTNAMELEN) { |
| + do_transparent++; |
| + strncpy(def_httpd,psychic,strlen(psychic)); |
| + strncpy(def_server,psychic,strlen(psychic)); |
| + } |
| + } |
| + |
| + /* foo */ |
| /* See if it can be forwarded */ |
| |
| if( can_forward(buf)){ |
| *************** |
| *** 1513,1519 **** |
| parse_vec[0], |
| parse_vec[1], |
| ourname, ourport); |
| ! }else{ |
| sprintf(new_reply,"%s\tgopher://%s:%s/%c%s\t%s\t%u", |
| parse_vec[0], parse_vec[2], |
| parse_vec[3], chk_type_ch, |
| --- 1529,1541 ---- |
| parse_vec[0], |
| parse_vec[1], |
| ourname, ourport); |
| ! } |
| ! /* FOO */ |
| ! else if(do_transparent) { |
| ! sprintf(new_reply,"%s\t%s\t%s\t%s",parse_vec[0],parse_vec[1],parse_vec[2],parse_vec[3]); |
| ! } |
| ! /* FOO */ |
| ! else{ |
| sprintf(new_reply,"%s\tgopher://%s:%s/%c%s\t%s\t%u", |
| parse_vec[0], parse_vec[2], |
| parse_vec[3], chk_type_ch, |
| diff -c -r ./lib/hnam.c ../../NEW/fwtk/lib/hnam.c |
| *** ./lib/hnam.c Fri Nov 4 18:30:19 1994 |
| --- ../../NEW/fwtk/lib/hnam.c Wed Oct 9 02:34:13 1996 |
| *************** |
| *** 22,27 **** |
| --- 22,31 ---- |
| |
| |
| #include "firewall.h" |
| + #ifdef __FreeBSD__ |
| + #include <net/if.h> |
| + #include "ip_nat.h" |
| + #endif /* __FreeBSD__ */ |
| |
| |
| char * |
| *************** |
| *** 44,47 **** |
| --- 48,115 ---- |
| |
| bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); |
| return(inet_ntoa(sin.sin_addr)); |
| + } |
| + |
| + char *getdsthost(fd, ptr) |
| + int fd; |
| + int *ptr; |
| + { |
| + struct sockaddr_in sin; |
| + struct hostent *hp; |
| + int sl=sizeof(struct sockaddr_in), err=0, local_h=0, i=0; |
| + char buf[255], hostbuf[255]; |
| + #ifdef __FreeBSD__ |
| + struct sockaddr_in rsin; |
| + struct natlookup natlookup; |
| + #endif |
| + |
| + #ifdef linux |
| + /* This should also work for UDP. Unfortunately, it doesn't. |
| + Maybe when the Linux UDP proxy code gets a little cleaner. |
| + */ |
| + if(!(err=getsockname(0,&sin,&sl))) { |
| + if(ptr) *ptr=ntohs(sin.sin_port); |
| + sprintf(buf,"%s",inet_ntoa(sin.sin_addr)); |
| + gethostname(hostbuf,254); |
| + hp=gethostbyname(hostbuf); |
| + while(hp->h_addr_list[i]) { |
| + bzero(&sin,&sl); |
| + memcpy(&sin.sin_addr,hp->h_addr_list[i++],sizeof(hp->h_addr_list[i++])); |
| + if(!strcmp(buf,inet_ntoa(sin.sin_addr))) local_h++; |
| + } |
| + if(local_h) { /* syslog(LLEV,"DEBUG: hnam.c: non-transparent."); */ return(NULL); } |
| + else { return(buf); } |
| + } |
| + #endif |
| + |
| + #ifdef __FreeBSD__ |
| + /* The basis for this block of code is Darren Reed's |
| + patches to the TIS ftwk's ftp-gw. |
| + */ |
| + bzero((char*)&sin,sizeof(sin)); |
| + bzero((char*)&rsin,sizeof(rsin)); |
| + if(getsockname(fd,(struct sockaddr*)&sin,&sl)<0) { |
| + return NULL; |
| + } |
| + sl=sizeof(rsin); |
| + if(getpeername(fd,(struct sockaddr*)&rsin,&sl)<0) { |
| + return NULL; |
| + } |
| + natlookup.nl_inport=sin.sin_port; |
| + natlookup.nl_outport=rsin.sin_port; |
| + natlookup.nl_inip=sin.sin_addr; |
| + natlookup.nl_outip=rsin.sin_addr; |
| + if((natfd=open(IPL_NAT,O_RDONLY))<0) { |
| + return(NULL); |
| + } |
| + if(ioctl(natfd,SIOCGNATL,&natlookup)==(-1)) { |
| + return(NULL); |
| + } |
| + close(natfd); |
| + if(ptr) *ptr=ntohs(natlookup.nl_realport); |
| + sprintf(buf,"%s",inet_ntoa(natlookup.nl_realip)); |
| + #endif |
| + |
| + /* No transparent proxy support */ |
| + return(NULL); |
| } |
| Only in ./lib: hnam.c.orig |
| diff -c -r ./plug-gw/plug-gw.c ../../NEW/fwtk/plug-gw/plug-gw.c |
| *** ./plug-gw/plug-gw.c Thu Sep 5 15:36:33 1996 |
| --- ../../NEW/fwtk/plug-gw/plug-gw.c Wed Oct 9 02:46:48 1996 |
| *************** |
| *** 39,44 **** |
| --- 39,48 ---- |
| static char **validdests = (char **)0; |
| static Cfg *confp; |
| |
| + int do_transparent=0; |
| + |
| + char *getdsthost(); |
| + |
| main(ac,av) |
| int ac; |
| char *av[]; |
| *************** |
| *** 193,201 **** |
| --- 197,213 ---- |
| char *ptr; |
| int state = 0; |
| int ssl_plug = 0; |
| + int pport=0; |
| |
| struct timeval timo; |
| |
| + /* Transparent plug-gw is probably a bad idea, but hey .. */ |
| + dhost=getdsthost(0,&pport); |
| + if(dhost) { |
| + do_transparent++; |
| + portid=pport; |
| + } |
| + |
| if(c->flags & PERM_DENY) { |
| if (p == -1) |
| syslog(LLEV,"deny host=%s/%s port=any",rhost,raddr); |
| *************** |
| *** 215,221 **** |
| syslog(LLEV,"fwtkcfgerr: -plug-to takes an argument, line %d",c->ln); |
| exit (1); |
| } |
| ! dhost = av[x]; |
| continue; |
| } |
| |
| --- 227,234 ---- |
| syslog(LLEV,"fwtkcfgerr: -plug-to takes an argument, line %d",c->ln); |
| exit (1); |
| } |
| ! if(!dhost) dhost = av[x]; |
| ! /* syslog(LLEV,"DEBUG: dhost now is [%s]",dhost); */ |
| continue; |
| } |
| |
| diff -c -r ./rlogin-gw/rlogin-gw.c ../../NEW/fwtk/rlogin-gw/rlogin-gw.c |
| *** ./rlogin-gw/rlogin-gw.c Fri Sep 6 12:56:33 1996 |
| --- ../../NEW/fwtk/rlogin-gw/rlogin-gw.c Wed Oct 9 02:49:04 1996 |
| *************** |
| *** 39,45 **** |
| --- 39,47 ---- |
| |
| |
| extern char *maphostname(); |
| + char *getdsthost(); |
| |
| + int do_transparent=0; |
| |
| static int cmd_quit(); |
| static int cmd_help(); |
| *************** |
| *** 120,125 **** |
| --- 122,130 ---- |
| static char *tokav[56]; |
| int tokac; |
| struct timeval timo; |
| + /* foo */ |
| + char *psychic; |
| + /* foo */ |
| |
| #ifndef LOG_NDELAY |
| openlog("rlogin-gw",LOG_PID); |
| *************** |
| *** 185,191 **** |
| xforwarder = cf->argv[0]; |
| } |
| |
| ! |
| |
| if((cf = cfg_get("directory",confp)) != (Cfg *)0) { |
| if(cf->argc != 1) { |
| --- 190,203 ---- |
| xforwarder = cf->argv[0]; |
| } |
| |
| ! /* foo */ |
| ! psychic=getdsthost(0,NULL); |
| ! if(psychic) { |
| ! do_transparent++; |
| ! strncpy(dest,psychic,511); |
| ! dest[511]='\0'; |
| ! } |
| ! /* foo */ |
| |
| if((cf = cfg_get("directory",confp)) != (Cfg *)0) { |
| if(cf->argc != 1) { |
| *************** |
| *** 260,269 **** |
| } |
| |
| /* if present a host name, chop and save username and hostname */ |
| ! dest[0] = '\0'; |
| if((p = index(rusername,'@')) != (char *)0) { |
| char *namp; |
| |
| *p++ = '\0'; |
| if(*p == '\0') |
| p = "localhost"; |
| --- 272,282 ---- |
| } |
| |
| /* if present a host name, chop and save username and hostname */ |
| ! /* dest[0] = '\0'; */ |
| if((p = index(rusername,'@')) != (char *)0) { |
| char *namp; |
| |
| + dest[0] = '\0'; |
| *p++ = '\0'; |
| if(*p == '\0') |
| p = "localhost"; |
| *************** |
| *** 293,300 **** |
| --- 306,326 ---- |
| goto leave; |
| } |
| |
| + /* syslog(LLEV,"DEBUG: Uh-oh, $dest = %s\n",dest); */ |
| + |
| if(dest[0] != '\0') { |
| /* Setup connection directly to remote machine */ |
| + if((cf = cfg_get("welcome-msg",confp)) != (Cfg *)0) { |
| + if(cf->argc != 1) { |
| + syslog(LLEV,"fwtkcfgerr: welcome-msg must have one parameter, line %d",cf->ln); |
| + exit(1); |
| + } |
| + if(sayfile(0,cf->argv[0])) { |
| + syslog(LLEV,"fwtksyserr: cannot display welcome %s: %m",cf->argv[0]); |
| + exit(1); |
| + } |
| + } |
| + /* Does this cmd_connect thing feel like a kludge or what? */ |
| sprintf(buf,"connect %.1000s",dest); |
| tokac = enargv(buf, tokav, 56, tokbuf, sizeof(tokbuf)); |
| if (cmd_connect(tokac, tokav, buf) != 2) |
| *************** |
| *** 526,539 **** |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%s/%s connect to %s",rhost,raddr,namp); |
| if(strlen(namp) > 20) |
| namp[20] = '\0'; |
| if(rusername[0] != '\0') |
| sprintf(ebuf,"Trying %s@%s...",rusername,namp); |
| else |
| sprintf(ebuf,"Trying %s...",namp); |
| ! if(say(0,ebuf)) |
| ! return(1); |
| } else |
| syslog(LLEV,"permit host=%s/%s connect to %s",rhost,raddr,av[1]); |
| if((serfd = conn_server(av[1],RLOGINPORT,1,buf)) < 0) { |
| --- 552,567 ---- |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%s/%s connect to %s",rhost,raddr,namp); |
| + if(!do_transparent) { |
| if(strlen(namp) > 20) |
| namp[20] = '\0'; |
| if(rusername[0] != '\0') |
| sprintf(ebuf,"Trying %s@%s...",rusername,namp); |
| else |
| sprintf(ebuf,"Trying %s...",namp); |
| ! if(say(0,ebuf)) |
| ! return(1); |
| ! } |
| } else |
| syslog(LLEV,"permit host=%s/%s connect to %s",rhost,raddr,av[1]); |
| if((serfd = conn_server(av[1],RLOGINPORT,1,buf)) < 0) { |
| diff -c -r ./tn-gw/tn-gw.c ../../NEW/fwtk/tn-gw/tn-gw.c |
| *** ./tn-gw/tn-gw.c Fri Sep 6 12:55:48 1996 |
| --- ../../NEW/fwtk/tn-gw/tn-gw.c Wed Oct 9 02:50:17 1996 |
| *************** |
| *** 87,92 **** |
| --- 87,94 ---- |
| static int cmd_xforward(); |
| static int cmd_timeout(); |
| |
| + char *getdsthost(); |
| + |
| static int tn3270 = 1; /* don't do tn3270 stuff */ |
| static int doX; |
| |
| *************** |
| *** 97,102 **** |
| --- 99,106 ---- |
| static int timeout = PROXY_TIMEOUT; |
| static char timed_out_msg[] = "\r\nConnection closed due to inactivity"; |
| |
| + int do_transparent=0; |
| + |
| typedef struct { |
| char *name; |
| char *hmsg; |
| *************** |
| *** 140,145 **** |
| --- 144,151 ---- |
| char tokbuf[BSIZ]; |
| char *tokav[56]; |
| int tokac; |
| + int port; |
| + char *psychic; |
| |
| #ifndef LOG_DAEMON |
| openlog("tn-gw",LOG_PID); |
| *************** |
| *** 308,313 **** |
| --- 314,346 ---- |
| } |
| } |
| |
| + psychic=getdsthost(0,&port); |
| + if(psychic) { |
| + if((strlen(psychic) + 10) < 510) { |
| + do_transparent++; |
| + if(port) |
| + sprintf(dest,"%s:%d",psychic,port); |
| + else |
| + sprintf(dest,"%s",psychic); |
| + |
| + |
| + if(!welcomedone) |
| + if((cf = cfg_get("welcome-msg",confp)) != (Cfg *)0) { |
| + if(cf->argc != 1) { |
| + syslog(LLEV,"fwtkcfgerr: welcome-msg must have one parameter, line %d",cf->ln); |
| + exit(1); |
| + } |
| + if(sayfile(0,cf->argv[0])) { |
| + syslog(LLEV,"fwtksyserr: cannot display welcome %s:%m",cf->argv[0]); |
| + exit(1); |
| + } |
| + welcomedone = 1; |
| + } |
| + |
| + |
| + } |
| + } |
| + |
| while (argc > 1) { |
| argc--; |
| argv++; |
| *************** |
| *** 864,877 **** |
| } |
| } |
| |
| - |
| if((namp = maphostname(av[1])) != (char *)0) { |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,namp); |
| ! sprintf(ebuf,"Trying %s port %d...",namp,port); |
| ! if(say(0,ebuf)) |
| ! return(1); |
| } else |
| syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,av[1]); |
| |
| --- 897,911 ---- |
| } |
| } |
| |
| if((namp = maphostname(av[1])) != (char *)0) { |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,namp); |
| ! if(!do_transparent) { |
| ! sprintf(ebuf,"Trying %s port %d...",namp,port); |
| ! if(say(0,ebuf)) |
| ! return(1); |
| ! } |
| } else |
| syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,av[1]); |
| |
| *************** |
| *** 903,910 **** |
| |
| syslog(LLEV,"connected host=%s/%s destination=%s",rladdr,riaddr,av[1]); |
| strncpy(dest,av[1], 511); |
| ! sprintf(buf, "Connected to %s.", dest); |
| ! say(0, buf); |
| return(2); |
| } |
| |
| --- 937,946 ---- |
| |
| syslog(LLEV,"connected host=%s/%s destination=%s",rladdr,riaddr,av[1]); |
| strncpy(dest,av[1], 511); |
| ! if(!do_transparent) { |
| ! sprintf(buf, "Connected to %s.", dest); |
| ! say(0, buf); |
| ! } |
| return(2); |
| } |
| |
| |
| |