Re: syslog-ng-2.0rc1 doesn't log hostaddress using ipv6
On Mon, 11 Sep 2006 12:00:09 +0200 (CEST), syslog-ng-request@lists.balabit.hu wrote:
On Thu, 2006-08-10 at 19:06 -0700, Bruce Penrod wrote:
I'm using the unpatched syslog-ng-2.0rc1. When logging messages sent from another machine over udp6, the hostname of the sending machine is not logged and the receiving host's name is logged instead, so that it looks like the message was generated locally. When using udp, it works fine.
Can you check if the patch below works for you? It seems to work for me, however I don't have a live IPv6 environment.
--- orig/src/misc.c +++ mod/src/misc.c @@ -127,37 +127,56 @@ gboolean resolve_hostname(GString *result, GSockAddr *saddr, gboolean usedns, gboolean usefqdn) { static gchar local_hostname[256] = ""; - char *hname, *p; + char *hname, *p, buf[256];
- if (saddr && saddr->sa.sa_family == AF_INET) + if (saddr) { - struct sockaddr_in *inet_addr = (struct sockaddr_in *) &saddr->sa; - - /* FIXME: add nscache support here */ - - if (usedns) - { - struct hostent *hp; - - hp = gethostbyaddr((char *) &(inet_addr->sin_addr), - sizeof(struct in_addr), AF_INET); - hname = (hp && hp->h_name) ? hp->h_name : NULL; - } + if (saddr->sa.sa_family == AF_INET || saddr->sa.sa_family == AF_INET6) + { + void *addr; + socklen_t addr_len; + + if (saddr->sa.sa_family == AF_INET) + { + addr = &((struct sockaddr_in *) &saddr->sa)->sin_addr; + addr_len = sizeof(struct in_addr); + } + else + { + addr = &((struct sockaddr_in6 *) &saddr->sa)->sin6_addr; + addr_len = sizeof(struct in6_addr); + } + + /* FIXME: add nscache support here */ + + if (usedns) + { + struct hostent *hp; + + hp = gethostbyaddr(addr, addr_len, saddr->sa.sa_family); + hname = (hp && hp->h_name) ? hp->h_name : NULL; + } + else + hname = NULL; + + if (!hname) + { + inet_ntop(saddr->sa.sa_family, addr, buf, sizeof(buf)); + hname = buf; + } + else + { + if (!usefqdn) + { + p = strchr(hname, '.'); + if (p) *p = 0; + } + } + } else - hname = NULL; - - if (!hname) - { - hname = inet_ntoa(inet_addr->sin_addr); - } - else - { - if (!usefqdn) - { - p = strchr(hname, '.'); - if (p) *p = 0; - } - } + { + g_assert_not_reached(); + } } else {
-- Bazsi
Yes, it works, but only for about a minute and terminates silently. Prior to that, it does indeed log an ipv6 address properly for the sending host. I haven't scrutinized your patch yet to see if there is an obvious pointer problem.
Thanks for getting it this far.
Bruce
Apparently the patch to rc1 did not take well, because I am now running the rc2 code (which seems to have the same ipv6 patch included) and everything seems OK so far. -- Bruce Penrod
participants (1)
-
Bruce Penrod