SCCS-vsn: libexec/ftpd/ftpd.c 4.13
-static char sccsid[] = "@(#)ftpd.c 4.12 (Berkeley) %G%";
+static char sccsid[] = "@(#)ftpd.c 4.13 (Berkeley) %G%";
getdatasock(mode)
char *mode;
{
getdatasock(mode)
char *mode;
{
if (data >= 0)
return (fdopen(data, mode));
if (data >= 0)
return (fdopen(data, mode));
- retrytime = 1;
- while ((s = socket(AF_INET, SOCK_STREAM, 0, 0)) < 0) {
- if (retrytime < 5) {
- sleep(retrytime);
- retrytime <<= 1;
- continue;
- }
+ s = socket(AF_INET, SOCK_STREAM, 0, 0);
+ if (s < 0)
- while (bind(s, &data_source, sizeof (data_source), 0) < 0) {
- if (retrytime < 5) {
- sleep(retrytime);
- retrytime <<= 1;
- continue;
- }
- seteuid(pw->pw_uid);
- close(s);
- return (NULL);
- }
+ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, 0, 0) < 0)
+ goto bad;
+ if (bind(s, &data_source, sizeof (data_source), 0) < 0)
+ goto bad;
seteuid(pw->pw_uid);
return (fdopen(s, mode));
seteuid(pw->pw_uid);
return (fdopen(s, mode));
+bad:
+ seteuid(pw->pw_uid);
+ close(s);
+ return (NULL);
if (usedefault)
data_dest = his_addr;
usedefault = 1;
if (usedefault)
data_dest = his_addr;
usedefault = 1;
- reply(150, "Opening data connection for %s (%s,%d)%s.",
- name, ntoa(data_dest.sin_addr.s_addr),
- ntohs(data_dest.sin_port), sizebuf);
file = getdatasock(mode);
if (file == NULL) {
reply(425, "Can't create data socket (%s,%d): %s.",
file = getdatasock(mode);
if (file == NULL) {
reply(425, "Can't create data socket (%s,%d): %s.",
sys_errlist[errno]);
return (NULL);
}
sys_errlist[errno]);
return (NULL);
}
+ reply(150, "Opening data connection for %s (%s,%d)%s.",
+ name, ntoa(data_dest.sin_addr.s_addr),
+ ntohs(data_dest.sin_port), sizebuf);
data = fileno(file);
if (connect(data, &data_dest, sizeof (data_dest), 0) < 0) {
reply(425, "Can't build data connection: %s.",
data = fileno(file);
if (connect(data, &data_dest, sizeof (data_dest), 0) < 0) {
reply(425, "Can't build data connection: %s.",