From: WATANABE Tetsuya Date: 2001-10-12T13:06:11+09:00 Subject: [ruby-dev:14914] Re: ext/socket h_addr_list 渡辺哲也です。 In message "[ruby-dev:14913] Re: ext/socket h_addr_list" on 01/10/12, WATANABE Tetsuya writes: |このパッチですが、文字列表記の IP address |('128.168.10.10' など) からホスト名をとりだしたい場 |合に失敗するので、もっと条件チェックしなければなら |ないようです。うーん こんな感じにしてしまいました... これでいいかは不明だったりします。しばらく 使ってみようと思っています。 ------------------------------ --- socket.c.org Thu Oct 4 20:37:49 2001 +++ socket.c Fri Oct 12 12:11:39 2001 @@ -960,6 +960,32 @@ #endif #endif +static int +ck_addr(host) + VALUE host; +{ + char *name; + int i; + + if (rb_obj_is_kind_of(host, rb_cInteger)) + return 1; + + name = RSTRING(host)->ptr; + + if (*name == 0) + return 1; + + if (RSTRING(host)->ptr[0] == '<' && strcmp(RSTRING(host)->ptr, "") == 0) + return 1; + + for (i = 0; i < RSTRING(host)->len; i++) { + if (! ISDIGIT(name[i]) || name[i] == '.' || ISXDIGIT(name[i]) || name[i] == ':') + return 1; + } + + return 0; +} + /* * NOTE: using gethostbyname() against AF_INET6 is a bad idea, as it * does not initialize sin_flowinfo nor sin_scope_id properly. @@ -992,9 +1018,13 @@ { struct sockaddr_in *sin; sin = (struct sockaddr_in *)&addr; - h = gethostbyaddr((char *)&sin->sin_addr, - sizeof(sin->sin_addr), - sin->sin_family); + if (ck_addr(host)) { + h = gethostbyaddr((char *)&sin->sin_addr, + sizeof(sin->sin_addr), + sin->sin_family); + } else { + h = gethostbyname(RSTRING(host)->ptr); + } break; } #ifdef INET6 @@ -1783,9 +1813,13 @@ { struct sockaddr_in *sin; sin = (struct sockaddr_in *)&addr; - h = gethostbyaddr((char *)&sin->sin_addr, - sizeof(sin->sin_addr), - sin->sin_family); + if (ck_addr(host)) { + h = gethostbyaddr((char *)&sin->sin_addr, + sizeof(sin->sin_addr), + sin->sin_family); + } else { + h = gethostbyname(RSTRING(host)->ptr); + } break; } #ifdef INET6 ------------------------------