Hi, I'm maintaining syslog-ng as part of the Cygwin net distro. Today I tried to build 2.0.7 and came across a couple of problems, which were mostly due to the fact that the current Cygwin release 1.5.25 is not ipv6 aware. While this is rectified in Cygwin's CVS, the current release is still based on older code. Below you find a patch which solves the following problems: - Two functions in src/afsocket.c use AF_INET6 even if ENABLED_IPV6 is not defined. - The new loggen tool has a typo in usage(), printing -i instead of -I for the interval arg. - loggen has a bug in the option handling. Due to a missing colon in the option string, it crashes when using the -s option. - loggen uses getaddrinfo/freeaddrinfo even on systems on which HAVE_GETADDRINFO is undefined. I created replacement code using gethostbyname/gertservbyname on systems lacking getaddrinfo. ChangeLog and diff below. Another problem I have is this: Given that loggen is in the tests subdir, I'm wondering if it's correct that loggen is installed to ${bindir} when running `make install'. Is that really supposed to happen or should `make install' skip loggen? Thanks, Corinna * src/afsocket.c (afsocket_sd_process_connection): Allow building with tcp_wrappers if AF_INET6 is unknown. (afsocket_dd_format_stats_name): Guard AF_INET6 case with ENABLE_IPV6. * tests/loggen/loggen.c diff -rup syslog-ng-2.0.7/src/afsocket.c syslog-ng-2.0.7-1/src/afsocket.c --- syslog-ng-2.0.7/src/afsocket.c 2007-11-26 09:26:38.000000000 +0100 +++ syslog-ng-2.0.7-1/src/afsocket.c 2008-01-07 18:38:31.088449800 +0100 @@ -359,7 +359,11 @@ gboolean afsocket_sd_process_connection(AFSocketSourceDriver *self, GSockAddr *peer_addr, gint fd) { #if ENABLE_TCP_WRAPPER - if (peer_addr && (peer_addr->sa.sa_family == AF_INET || peer_addr->sa.sa_family == AF_INET6)) + if (peer_addr && (peer_addr->sa.sa_family == AF_INET +#if ENABLE_IPV6 + || peer_addr->sa.sa_family == AF_INET6 +#endif + )) { struct request_info req; @@ -693,9 +697,11 @@ afsocket_dd_format_stats_name(AFSocketDe case AF_INET: driver_name = !!(self->flags & AFSOCKET_STREAM) ? "tcp" : "udp"; break; +#if ENABLE_IPV6 case AF_INET6: driver_name = !!(self->flags & AFSOCKET_STREAM) ? "tcp6" : "udp6"; break; +#endif } g_snprintf(stats_name, sizeof(stats_name), "%s(%s)", diff -rup syslog-ng-2.0.7/tests/loggen/loggen.c syslog-ng-2.0.7-1/tests/loggen/loggen.c --- syslog-ng-2.0.7/tests/loggen/loggen.c 2008-01-03 07:29:56.000000000 +0100 +++ syslog-ng-2.0.7-1/tests/loggen/loggen.c 2008-01-07 19:42:46.720451400 +0100 @@ -147,7 +147,7 @@ usage() " --stream, or -S Use stream socket (TCP and unix-stream)\n" " --dgram, or -D Use datagram socket (UDP and unix-dgram)\n" " --size, or -s Specify the size of the syslog message\n" - " --interval, or -i <sec> Number of seconds to run the test for\n"); + " --interval, or -I <sec> Number of seconds to run the test for\n"); exit(0); } @@ -176,9 +176,9 @@ main(int argc, char *argv[]) int opt; #if HAVE_GETOPT_LONG - while ((opt = getopt_long(argc, argv, "r:I:ixsSDh", syslog_ng_options, NULL)) != -1) + while ((opt = getopt_long(argc, argv, "r:I:ixs:SDh", syslog_ng_options, NULL)) != -1) #else - while ((opt = getopt(argc, argv, "r:I:ixsSDh")) != -1) + while ((opt = getopt(argc, argv, "r:I:ixs:SDh")) != -1) #endif { switch (opt) @@ -211,6 +211,7 @@ main(int argc, char *argv[]) } if (!unix_socket) { +#if HAVE_GETADDRINFO struct addrinfo hints; struct addrinfo *res, *rp; @@ -250,6 +251,53 @@ main(int argc, char *argv[]) fprintf(stderr, "Error connecting to target server: %s\n", strerror(errno)); return 2; } +#else + struct hostent *host; + struct servent *serv = NULL; + struct sockaddr_in saddr; + + if (argc - optind < 2) + { + fprintf(stderr, "No target server specified\n"); + usage(); + } + + host = gethostbyname (argv[optind]); + if (!host) + { + fprintf(stderr, "Name lookup error"); + return 2; + } + memcpy (&saddr.sin_addr, host->h_addr_list[0], host->h_length); + serv = getservbyname (argv[optind + 1], + sock_type == SOCK_STREAM ? "tcp" : "udp"); + if (!serv) + { + char *c; + + saddr.sin_port = htons (strtol (argv[optind + 1], &c, 10)); + if (c == argv[optind + 1]) + { + fprintf(stderr, "Service lookup error"); + return 2; + } + } + else + saddr.sin_port = serv->s_port; + saddr.sin_family = AF_INET; + sock = socket (AF_INET, sock_type, 0); + if (sock != -1 + && connect(sock, (struct sockaddr *) &saddr, sizeof saddr) == -1) + { + close (sock); + sock = -1; + } + if (sock == -1) + { + fprintf(stderr, "Error connecting to target server: %s\n", strerror(errno)); + return 2; + } +#endif } else { -- Corinna Vinschen Cygwin Project Co-Leader Red Hat