SSH login takes very long time...sometimes
Rostislav Krasny
rosti.bsd at gmail.com
Wed Mar 1 14:42:29 UTC 2006
On Wed, 1 Mar 2006 15:45:13 +0300
Yar Tikhiy <yar at comp.chem.msu.su> wrote:
> On Sat, Feb 25, 2006 at 04:28:50PM +0900, Hajimu UMEMOTO wrote:
> > >>>>> On Sat, 25 Feb 2006 02:42:46 +0200
> > >>>>> Rostislav Krasny <rosti.bsd at gmail.com> said:
> >
> > rosti> I've found the problem in both: ftpd(8) and ftp(1). In the ftpd(8) a
> > rosti> getaddrinfo() is called in two places with hints.ai_socktype == 0 and
> > rosti> hints.ai_family == PF_UNSPEC. In the ftp(1) a command reply timeout is
> > rosti> only 60 seconds. Those things are what I've changed to fix the problem.
> > rosti> Two diffs are attached to this email. The ftpd.c.diff extends -4 and -6
> > rosti> ftpd options. So if this patch is good, the ftpd(8) manual page and the
> > rosti> default /etc/inetd.conf should also be changed appropriately.
> >
> > For your ftpd.c.diff, I like your idea to reduce redundant query. It
> > is enough to query just appropriate address family. In inetd mode, we
> > know the address family already. So, we don't need to rely on the
> > -4/-6 option. The following diff is against ftpd.c with your patch
> > applied:
>
> I finally tried the proposed patches for ftpd and really liked the
> idea of reducing the name queries made to only one address family
> if it's known. Thank you both!
>
> I've got only one small remark on style, see below.
>
> > --- ftpd.c.rosti Sat Feb 25 15:41:52 2006
> > +++ ftpd.c Sat Feb 25 16:01:46 2006
> > @@ -423,10 +423,6 @@ main(int argc, char *argv[], char **envp
> > }
> > }
> >
> > -#ifdef VIRTUAL_HOSTING
> > - inithosts(family);
> > -#endif
> > -
> > if (daemon_mode) {
> > int *ctl_sock, fd, maxfd = -1, nfds, i;
> > fd_set defreadfds, readfds;
> > @@ -456,6 +452,10 @@ main(int argc, char *argv[], char **envp
> > sa.sa_handler = reapchild;
> > (void)sigaction(SIGCHLD, &sa, NULL);
> >
> > +#ifdef VIRTUAL_HOSTING
> > + inithosts(family);
> > +#endif
> > +
> > /*
> > * Open a socket, bind it to the FTP port, and start
> > * listening.
> > @@ -525,6 +525,14 @@ main(int argc, char *argv[], char **envp
> > syslog(LOG_ERR, "getpeername (%s): %m",argv[0]);
> > exit(1);
> > }
> > +
> > +#ifdef VIRTUAL_HOSTING
> > + family = his_addr.su_family;
> > + if (his_addr.su_family == AF_INET6 &&
> > + IN6_IS_ADDR_V4MAPPED(&his_addr.su_sin6.sin6_addr))
> > + family = AF_INET;
>
> Perheps a better style here would be to use if/else:
>
> if (his_addr.su_family == AF_INET6 &&
> IN6_IS_ADDR_V4MAPPED(&his_addr.su_sin6.sin6_addr))
> family = AF_INET;
> else
> family = his_addr.su_family;
>
> > + inithosts(family);
Or even shorter:
if (his_addr.su_family == AF_INET6 &&
IN6_IS_ADDR_V4MAPPED(&his_addr.su_sin6.sin6_addr))
inithosts(AF_INET);
else
inithosts(his_addr.su_family);
The 'family' variable isn't used in the inetd mode.
More information about the freebsd-stable
mailing list