SSH login takes very long time...sometimes

Yar Tikhiy yar at comp.chem.msu.su
Wed Mar 1 12:45:57 UTC 2006


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);
> +#endif
>  	}
>  
>  gotchild:

-- 
Yar


More information about the freebsd-stable mailing list