On Sat, Feb 25, 2006 at 04:28:50PM +0900, Hajimu UMEMOTO wrote:
> >>>>> On Sat, 25 Feb 2006 02:42:46 +0200
> >>>>> Rostislav Krasny <[EMAIL PROTECTED]> 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
_______________________________________________
freebsd-stable@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to