cak@Purdue.ARPA (03/26/84)
From: Christopher A Kent <cak@Purdue.ARPA> Description: On multi-homed hosts, ftpd won't always work because the code to anchor the reply socket is incorrect; the getsockname() call has a bad argument, thus the filled in address is always 0. Repeat-By: ftp to a multi-homed host on the same net as yours, but specify the alternate address as the host to connect to. Fix: getsockname() wants an int *, not an int, for the namelen. I did it this way (don't trust the line numbers): *** ftpd.c.old --- ftpd.c *************** *** 168,173 continue; } if (fork() == 0) { signal (SIGCHLD, SIG_IGN); openlog("ftpd", LOG_PID); dolog(&his_addr); --- 168,175 ----- continue; } if (fork() == 0) { + int addrsize; + signal (SIGCHLD, SIG_IGN); openlog("ftpd", LOG_PID); dolog(&his_addr); *************** *** 183,189 form = FORM_N; stru = STRU_F; mode = MODE_S; ! (void) getsockname(0, &ctrl_addr, sizeof (ctrl_addr)); gethostname(hostname, sizeof (hostname)); reply(220, "%s FTP server (%s) ready.", hostname, version); --- 185,192 ----- form = FORM_N; stru = STRU_F; mode = MODE_S; ! addrsize = sizeof(ctrl_addr); ! (void) getsockname(0, &ctrl_addr, &addrsize); gethostname(hostname, sizeof (hostname)); reply(220, "%s FTP server (%s) ready.", hostname, version); ----------