梅本です。 >>> Tue, 17 Nov 2009 16:47:14 +0900 の刻に「candy」、すなわち >>> ca...@kgc.co.jp 氏曰く
candy> ただ、先のメールに書いた通り、4.11 の w.c には candy> 「ホスト名っぽかったら正引きする」 candy> コードが入っているので IP address 表示されます。 なるほど、気づきませんでした。 http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/w/w.c#rev1.48 による と、ホスト名からだと IPv4 か IPv6 か分からないから正引き止めますという ことですね。 確かに address family が分からないのはその通りですが、そもそも A RR ま たは AAAA RR が一つしか付いてないのであれば、表示しても良さげな気がしま すね。 ということで、こんな感じでどうでしょう? テスト不十分につき注意。(__) Index: usr.bin/w/w.c diff -u -p usr.bin/w/w.c.orig usr.bin/w/w.c --- usr.bin/w/w.c.orig 2009-10-25 10:10:29.000000000 +0900 +++ usr.bin/w/w.c 2009-11-17 17:10:17.188486703 +0900 @@ -348,6 +348,7 @@ main(int argc, char *argv[]) for (ep = ehead; ep != NULL; ep = ep->next) { char host_buf[UT_HOSTSIZE + 1]; + struct addrinfo hints, *res; struct sockaddr_storage ss; struct sockaddr *sa = (struct sockaddr *)&ss; struct sockaddr_in *lsin = (struct sockaddr_in *)&ss; @@ -365,23 +366,37 @@ main(int argc, char *argv[]) else x_suffix = NULL; } + + isaddr = 0; + memset(&ss, '\0', sizeof(ss)); + if (inet_pton(AF_INET6, p, &lsin6->sin6_addr) == 1) { + lsin6->sin6_len = sizeof(*lsin6); + lsin6->sin6_family = AF_INET6; + isaddr = 1; + } else if (inet_pton(AF_INET, p, &lsin->sin_addr) == 1) { + lsin->sin_len = sizeof(*lsin); + lsin->sin_family = AF_INET; + isaddr = 1; + } if (!nflag) { /* Attempt to change an IP address into a name */ - isaddr = 0; - memset(&ss, '\0', sizeof(ss)); - if (inet_pton(AF_INET6, p, &lsin6->sin6_addr) == 1) { - lsin6->sin6_len = sizeof(*lsin6); - lsin6->sin6_family = AF_INET6; - isaddr = 1; - } else if (inet_pton(AF_INET, p, &lsin->sin_addr) == 1) { - lsin->sin_len = sizeof(*lsin); - lsin->sin_family = AF_INET; - isaddr = 1; - } if (isaddr && realhostname_sa(fn, sizeof(fn), sa, sa->sa_len) == HOSTNAME_FOUND) p = fn; + } else if (!isaddr) { + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if (getaddrinfo(p, NULL, &hints, &res) == 0) { + if (res->ai_next == NULL && + getnameinfo(res->ai_addr, res->ai_addrlen, + fn, sizeof(fn), NULL, 0, + NI_NUMERICHOST) == 0) + p = fn; + freeaddrinfo(res); + } } + if (x_suffix) { (void)snprintf(buf, sizeof(buf), "%s:%s", p, x_suffix); p = buf; -- 梅本 肇 @ インターネット互助会横浜 http://www.imasy.org/~ume/ u...@mahoroba.org u...@{,jp.}FreeBSD.org プログラムは書いた人の意図ではなく書かれた通り動く I hate Modula-3 :-)