梅本です。

>>> 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 :-)

メールによる返信