[Joachim Breitner]
> it was reported that libnss-myhostname may report an IPv6 address
> for the local hostname that is not pingable, as it is a link scoped
> address, and it was suggested that it not do that. Do you agree and
> can you fix it?
Here is a simple patch to make sure link local addresses are no longer
returned by libnss-myhostname.
The alternative would be to return addresses with %interface appended,
but I did not investigate how to do that.
The attached and tested patch solve my problem, making the command
'ping6 $(hostname)' work again. I choose to work on the string
representation of the address, to avoid having to add endian specific
code to look in the "raw" address. Perhaps there is a better and
still portable way to do this?
--
Happy hacking
Petter Reinholdtsen
diff -ur libnss-myhostname-0.3/netlink.c libnss-myhostname-0.3-pere/netlink.c
--- libnss-myhostname-0.3/netlink.c 2013-04-27 09:32:28.000000000 +0200
+++ libnss-myhostname-0.3-pere/netlink.c 2013-04-27 09:33:39.000000000
+0200
@@ -34,9 +34,26 @@
#include <unistd.h>
#include <inttypes.h>
#include <stdlib.h>
+#include <stdbool.h>
#include "ifconf.h"
+bool is_ipv6_link_local(unsigned short family, void *address) {
+ char str_buffer[INET6_ADDRSTRLEN];
+ if (AF_INET6 != family)
+ return false;
+
+ if (NULL == inet_ntop(AF_INET6, address, str_buffer, INET6_ADDRSTRLEN))
+ return false;
+
+ if (0 == strncmp("fe", str_buffer, 2)) {
+ char c = str_buffer[2];
+ if (c == '8' || c == '9' || c == 'a' || c == 'b')
+ return true;
+ }
+ return false;
+}
+
int ifconf_acquire_addresses(struct address **_list, unsigned *_n_list) {
struct {
@@ -177,6 +194,9 @@
if (!address)
continue;
+ /* Skip link local ipV6 addresses */
+ if (is_ipv6_link_local(ifaddrmsg->ifa_family, address))
+ continue;
list = realloc(list, (n_list+1) * sizeof(struct
address));
if (!list) {