[#14922] alias $gvar — Koji Arai <JCA02266@...>

新井です。

19 messages 2001/10/14

[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error — Shugo Maeda <shugo@...> 2001/10/26

前田です。

[ruby-dev:14914] Re: ext/socket h_addr_list

From: WATANABE Tetsuya <tetsu@...>
Date: 2001-10-12 04:06:11 UTC
List: ruby-dev #14914
渡辺哲也です。

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, "<broadcast>") == 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
------------------------------

In This Thread