[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#743866: getaddrinfo(3) failure for zeroconf (avahi)



Package: libc6
Version: 2.18-4

Sometimes avahi-resolve-host-name and getaddrinfo(3) disagree about
DNS. Sample:

% avahi-resolve-host-name pepe.local; ./getaddrinfo pepe.local
pepe.local      10.42.100.198
getaddrinfo: Name or service not known


nscd is not running. /etc/nsswitch.conf says

hosts:          files mdns4_minimal [NOTFOUND=return] dns


getaddrinfo.c is attached.

Regards
Harri
/* 
 * getaddrinfo.c - Simple example of using getaddrinfo(3) function.
 * 
 * Michal Ludvig <michal@logix.cz> (c) 2002, 2003
 * http://www.logix.cz/michal/devel/
 *
 * License: public domain.
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int
lookup_host (const char *host)
{
	struct addrinfo hints, *res;
	int errcode;
	char addrstr[100];
	void *ptr;

	memset (&hints, 0, sizeof (hints));
	hints.ai_family = PF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags |= AI_CANONNAME;

	errcode = getaddrinfo (host, NULL, &hints, &res);
	if (errcode != 0)
	{
		fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(errcode));
		exit(EXIT_FAILURE);
	}

	printf ("Host: %s\n", host);
	while (res)
	{
		inet_ntop (res->ai_family, res->ai_addr->sa_data, addrstr, 100);

		switch (res->ai_family)
		{
		case AF_INET:
			ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
			break;
		case AF_INET6:
			ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
			break;
		}
		inet_ntop (res->ai_family, ptr, addrstr, 100);
		printf ("IPv%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4,
			addrstr, res->ai_canonname);
		res = res->ai_next;
	}

	return 0;
}

int
main (int argc, char *argv[])
{
	if (argc < 2)
		exit (1);
	return lookup_host (argv[1]);
}

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: