| diff -c -r ./ftp-gw/ftp-gw.c ../../fwtk-2.1-violated/fwtk/ftp-gw/ftp-gw.c |
| *** ./ftp-gw/ftp-gw.c Thu Feb 5 19:05:43 1998 |
| --- ../../fwtk-2.1-violated/fwtk/ftp-gw/ftp-gw.c Thu May 21 17:36:09 1998 |
| *************** |
| *** 44,49 **** |
| --- 44,51 ---- |
| |
| extern char *optarg; |
| |
| + char *getdsthost(); |
| + |
| #include "firewall.h" |
| |
| |
| *************** |
| *** 88,93 **** |
| --- 90,97 ---- |
| static int cmdcnt = 0; |
| static int timeout = PROXY_TIMEOUT; |
| |
| + static int do_transparent = 0; |
| + |
| |
| static int cmd_user(); |
| static int cmd_authorize(); |
| *************** |
| *** 101,106 **** |
| --- 105,111 ---- |
| static int cmd_passthru(); |
| static void saveline(); |
| static void flushsaved(); |
| + static int connectdest(); |
| |
| #define OP_CONN 001 /* only valid if connected */ |
| #define OP_WCON 002 /* writethrough if connected */ |
| *************** |
| *** 173,178 **** |
| --- 178,184 ---- |
| char xuf[1024]; |
| char huf[512]; |
| char *passuser = (char *)0; /* passed user as av */ |
| + char *psychic, *hotline; |
| |
| #ifndef LOG_DAEMON |
| openlog("ftp-gw",LOG_PID); |
| *************** |
| *** 317,322 **** |
| --- 323,332 ---- |
| } else |
| timeout = PROXY_TIMEOUT; |
| |
| + psychic = getdsthost(0, NULL); |
| + if (psychic) |
| + do_transparent++; |
| + |
| /* display a welcome file or message */ |
| if(passuser == (char *)0) { |
| if((cf = cfg_get("welcome-msg",confp)) != (Cfg *)0) { |
| *************** |
| *** 324,329 **** |
| --- 334,345 ---- |
| 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 %.512s: %m",cf->argv[0]); |
| + exit(1); |
| + } |
| + } else |
| if(sayfile(0,cf->argv[0],220)) { |
| syslog(LLEV,"fwtksyserr: cannot display welcome %.512s: %m",cf->argv[0]); |
| exit(1); |
| *************** |
| *** 336,341 **** |
| --- 352,360 ---- |
| if(say(0,"220-Proxy first requires authentication")) |
| exit(1); |
| |
| + 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); |
| if(say(0,xuf)) |
| exit(1); |
| *************** |
| *** 357,362 **** |
| --- 376,384 ---- |
| exit(1); |
| } |
| |
| + if (do_transparent) |
| + connectdest(psychic, 21); |
| + |
| /* main loop */ |
| while(1) { |
| FD_ZERO(&rdy); |
| *************** |
| *** 653,658 **** |
| --- 675,696 ---- |
| 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"; |
| |
| *************** |
| *** 694,705 **** |
| char ebuf[512]; |
| |
| strcpy(ebuf,buf); |
| ! sprintf(buf,"521 %s: %s",dest,ebuf); |
| rfd = -1; |
| return(say(0,buf)); |
| } |
| ! 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); |
| --- 732,748 ---- |
| 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)); |
| } |
| ! 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); |
| *************** |
| *** 1889,1891 **** |
| --- 1932,2050 ---- |
| dup(nread); |
| } |
| #endif |
| + |
| + 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); |
| + 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)); |
| + } |
| + 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; |
| + } |
| + |
| + /* quick hack */ |
| + 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); |
| + } |
| diff -c -r ./http-gw/http-gw.c ../../fwtk-2.1-violated/fwtk/http-gw/http-gw.c |
| *** ./http-gw/http-gw.c Fri Feb 6 18:32:25 1998 |
| --- ../../fwtk-2.1-violated/fwtk/http-gw/http-gw.c Thu May 21 17:00:47 1998 |
| *************** |
| *** 27,32 **** |
| --- 27,35 ---- |
| static char http_buffer[8192]; |
| static char reason[8192]; |
| static int checkBrowserType = 1; |
| + static int do_transparent = 0; |
| + |
| + char * getdsthost(); |
| |
| static void do_logging() |
| { char *proto = "GOPHER"; |
| *************** |
| *** 473,478 **** |
| --- 476,490 ---- |
| /*(NOT A SPECIAL FORM)*/ |
| |
| if((rem_type & TYPE_LOCAL)== 0){ |
| + 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)); |
| + } |
| + } |
| + |
| /* See if it can be forwarded */ |
| |
| if( can_forward(buf)){ |
| *************** |
| *** 1564,1570 **** |
| 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, |
| --- 1576,1589 ---- |
| parse_vec[0], |
| parse_vec[1], |
| ourname, ourport); |
| ! } |
| ! 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]); |
| ! } |
| ! 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 ../../fwtk-2.1-violated/fwtk/lib/hnam.c |
| *** ./lib/hnam.c Tue Dec 10 13:08:48 1996 |
| --- ../../fwtk-2.1-violated/fwtk/lib/hnam.c Thu May 21 17:10:00 1998 |
| *************** |
| *** 23,28 **** |
| --- 23,33 ---- |
| |
| #include "firewall.h" |
| |
| + #ifdef __FreeBSD__ /* or OpenBSD, NetBSD, BSDI, etc. Fix this for your system. */ |
| + #include <net/if.h> |
| + #include "ip_nat.h" |
| + #endif /* __FreeBSD__ */ |
| + |
| |
| char * |
| maphostname(name) |
| *************** |
| *** 49,52 **** |
| --- 54,132 ---- |
| } |
| 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 |
| + 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) |
| + 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("/dev/ipl",O_RDONLY)) < 0) |
| + return NULL; |
| + |
| + if (ioctl(natfd, SIOCGNATL,&natlookup) == (-1)) |
| + return NULL; |
| + |
| + close(natfd); |
| + |
| + if (ptr) |
| + *ptr = ntohs(natlookup.nl_inport); |
| + |
| + sprintf(buf, "%s", inet_ntoa(natlookup.nl_inip)); |
| + #endif |
| + |
| + /* No transparent proxy support */ |
| + return(NULL); |
| } |
| diff -c -r ./plug-gw/plug-gw.c ../../fwtk-2.1-violated/fwtk/plug-gw/plug-gw.c |
| *** ./plug-gw/plug-gw.c Thu Feb 5 19:07:35 1998 |
| --- ../../fwtk-2.1-violated/fwtk/plug-gw/plug-gw.c Thu May 21 17:29:01 1998 |
| *************** |
| *** 43,48 **** |
| --- 43,50 ---- |
| static char **validdests = (char **)0; |
| static int net_write(); |
| |
| + static int do_transparent = 0; |
| + |
| main(ac,av) |
| int ac; |
| char *av[]; |
| *************** |
| *** 198,206 **** |
| --- 200,220 ---- |
| char *ptr; |
| int state = 0; |
| int ssl_plug = 0; |
| + char * getdsthost(); |
| + int pport = 0; |
| |
| struct timeval timo; |
| |
| + /* Transparent plug-gw is probably a bad idea, but then, plug-gw is a bad |
| + * idea .. |
| + */ |
| + dhost = getdsthost(0, &pport); |
| + if (dhost) { |
| + do_transparent++; |
| + portid = pport; |
| + } |
| + |
| + |
| if(c->flags & PERM_DENY) { |
| if (p == -1) |
| syslog(LLEV,"deny host=%.512s/%.20s port=any",rhost,raddr); |
| *************** |
| *** 220,226 **** |
| syslog(LLEV,"fwtkcfgerr: -plug-to takes an argument, line %d",c->ln); |
| exit (1); |
| } |
| ! dhost = av[x]; |
| continue; |
| } |
| |
| --- 234,241 ---- |
| syslog(LLEV,"fwtkcfgerr: -plug-to takes an argument, line %d",c->ln); |
| exit (1); |
| } |
| ! if (!dhost) |
| ! dhost = av[x]; |
| continue; |
| } |
| |
| diff -c -r ./rlogin-gw/rlogin-gw.c ../../fwtk-2.1-violated/fwtk/rlogin-gw/rlogin-gw.c |
| *** ./rlogin-gw/rlogin-gw.c Thu Feb 5 19:08:38 1998 |
| --- ../../fwtk-2.1-violated/fwtk/rlogin-gw/rlogin-gw.c Thu May 21 17:20:25 1998 |
| *************** |
| *** 103,108 **** |
| --- 103,111 ---- |
| static int trusted = 0; |
| static int doX = 0; |
| static char *prompt; |
| + static int do_transparent = 0; |
| + |
| + char * getdsthost(); |
| |
| main(ac,av) |
| int ac; |
| *************** |
| *** 123,128 **** |
| --- 126,132 ---- |
| static char *tokav[56]; |
| int tokac; |
| struct timeval timo; |
| + char * psychic; |
| |
| #ifndef LOG_NDELAY |
| openlog("rlogin-gw",LOG_PID); |
| *************** |
| *** 188,194 **** |
| xforwarder = cf->argv[0]; |
| } |
| |
| ! |
| |
| if((cf = cfg_get("directory",confp)) != (Cfg *)0) { |
| if(cf->argc != 1) { |
| --- 192,203 ---- |
| xforwarder = cf->argv[0]; |
| } |
| |
| ! psychic = getdsthost(0, NULL); |
| ! if (psychic) { |
| ! do_transparent++; |
| ! strncpy(dest, psychic, 511); |
| ! dest[511] = '\0'; |
| ! } |
| |
| if((cf = cfg_get("directory",confp)) != (Cfg *)0) { |
| if(cf->argc != 1) { |
| *************** |
| *** 266,271 **** |
| --- 275,281 ---- |
| if((p = index(rusername,'@')) != (char *)0) { |
| char *namp; |
| |
| + dest[0] = '\0'; |
| *p++ = '\0'; |
| if(*p == '\0') |
| p = "localhost"; |
| *************** |
| *** 297,302 **** |
| --- 307,326 ---- |
| |
| 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); |
| + } |
| + } |
| + |
| + /* Hey fwtk developer people -- this connect_dest thing is *nasty!* */ |
| + |
| sprintf(buf,"connect %.1000s",dest); |
| tokac = enargv(buf, tokav, 56, tokbuf, sizeof(tokbuf)); |
| if (cmd_connect(tokac, tokav, buf) != 2) |
| *************** |
| *** 535,548 **** |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%.512s/%.20s connect to %.512s",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=%.512s/%.20s connect to %.512s",rhost,raddr,av[1]); |
| if((serfd = conn_server(av[1],RLOGINPORT,1,buf)) < 0) { |
| --- 559,574 ---- |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%.512s/%.20s connect to %.512s",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=%.512s/%.20s connect to %.512s",rhost,raddr,av[1]); |
| if((serfd = conn_server(av[1],RLOGINPORT,1,buf)) < 0) { |
| diff -c -r ./tn-gw/tn-gw.c ../../fwtk-2.1-violated/fwtk/tn-gw/tn-gw.c |
| *** ./tn-gw/tn-gw.c Thu Feb 5 19:11:36 1998 |
| --- ../../fwtk-2.1-violated/fwtk/tn-gw/tn-gw.c Thu May 21 17:25:06 1998 |
| *************** |
| *** 91,96 **** |
| --- 91,100 ---- |
| static int cmd_xforward(); |
| static int cmd_timeout(); |
| |
| + char * getdsthost(); |
| + |
| + static int do_transparent = 0; |
| + |
| static int tn3270 = 1; /* don't do tn3270 stuff */ |
| static int doX; |
| |
| *************** |
| *** 144,149 **** |
| --- 148,155 ---- |
| char tokbuf[BSIZ]; |
| char *tokav[56]; |
| int tokac; |
| + int port; |
| + char * psychic; |
| |
| #ifndef LOG_DAEMON |
| openlog("tn-gw",LOG_PID); |
| *************** |
| *** 325,330 **** |
| --- 331,362 ---- |
| } |
| } |
| |
| + 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++; |
| *************** |
| *** 947,955 **** |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%.512s/%.20s destination=%.512s",rladdr,riaddr,namp); |
| ! sprintf(ebuf,"Trying %.100s port %d...",namp,port); |
| ! if(say(0,ebuf)) |
| ! return(1); |
| } else |
| syslog(LLEV,"permit host=%.512s/%.20s destination=%.512s",rladdr,riaddr,av[1]); |
| |
| --- 979,989 ---- |
| char ebuf[512]; |
| |
| syslog(LLEV,"permit host=%.512s/%.20s destination=%.512s",rladdr,riaddr,namp); |
| ! if (!do_transparent) { |
| ! sprintf(ebuf,"Trying %.100s port %d...",namp,port); |
| ! if(say(0,ebuf)) |
| ! return(1); |
| ! } |
| } else |
| syslog(LLEV,"permit host=%.512s/%.20s destination=%.512s",rladdr,riaddr,av[1]); |
| |
| *************** |
| *** 991,998 **** |
| |
| syslog(LLEV,"connected host=%.512s/%.20s destination=%.512s",rladdr,riaddr,av[1]); |
| strncpy(dest,av[1], 511); |
| ! sprintf(buf, "Connected to %.512s.", dest); |
| ! say(0, buf); |
| return(2); |
| } |
| |
| --- 1025,1034 ---- |
| |
| syslog(LLEV,"connected host=%.512s/%.20s destination=%.512s",rladdr,riaddr,av[1]); |
| strncpy(dest,av[1], 511); |
| ! if (!do_transparent) { |
| ! sprintf(buf, "Connected to %.512s.", dest); |
| ! say(0, buf); |
| ! } |
| return(2); |
| } |
| |