Dear diary, on Thu, Jul 21, 2005 at 03:10:49PM CEST, I got a letter
where "YOSHIFUJI Hideaki / ?$B5HF#1QL@" <[EMAIL PROTECTED]> told me that...
> Hello.

Hello from an IPv6 fan,

> Listen on IPv6 as well, if available.
> 
> Signed-off-by: Hideaki YOSHIFUJI <[EMAIL PROTECTED]>
> 
> diff --git a/daemon.c b/daemon.c
> --- a/daemon.c
> +++ b/daemon.c
> @@ -219,37 +219,102 @@ static void child_handler(int signo)
>  
>  static int serve(int port)
>  {
..snip..

this whole getaddrinfo() magic looks horribly complicated. What's wrong
on just adding a similar code (or factoring it out to a function) for
IPv6 as there is for IPv4, just s/INET/INET6/?

>       for (;;) {
> -             struct sockaddr_in in;
> -             socklen_t addrlen = sizeof(in);
> -             int incoming = accept(sockfd, (void *)&in, &addrlen);
> -
> -             if (incoming < 0) {
> -                     switch (errno) {
> -                     case EAGAIN:
> -                     case EINTR:
> -                     case ECONNABORTED:
> -                             continue;
> -                     default:
> -                             die("accept returned %s", strerror(errno));
> +             struct sockaddr_storage ss;
> +             socklen_t sslen = sizeof(ss);

Perhaps move those to the most inner block. (All right, I'm nitpicking
too much again, sorry.)

> +
> +             int i;
> +             fds = fds_init;
> +             
> +             if (select(maxfd + 1, &fds, NULL, NULL, NULL) == -1) {
> +                     /* warning? */

Certainly a warning and at least sleep(1) to avoid cpuburn-like
behaviour in case of anything going wrong.

> +                     continue;
> +             }
> +
> +             for (i = 0; i < socknum; i++) {
> +                     int sockfd = socklist[i];
> +
> +                     if (FD_ISSET(sockfd, &fds)) {
> +                             int incoming = accept(sockfd, (struct sockaddr 
> *)&ss, &sslen);
> +                             if (incoming < 0) {
> +                                     switch (errno) {
> +                                     case EAGAIN:
> +                                     case EINTR:
> +                                     case ECONNABORTED:
> +                                             continue;
> +                                     default:
> +                                             die("accept returned %s", 
> strerror(errno));
> +                                     }
> +                             }
> +                             handle(incoming, (struct sockaddr *)&ss, sslen);
>                       }
>               }
> -             handle(incoming, &in, addrlen);
>       }
>  }

-- 
                                Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
If you want the holes in your knowledge showing up try teaching
someone.  -- Alan Cox
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to