summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/socket/mkconstants.rb12
-rw-r--r--ext/socket/socket.c14
3 files changed, 17 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 0058f90ae18..0de1edbdf31 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Jan 1 19:53:33 2009 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/mkconstants.rb: add valp argument for family_to_int and
+ socktype_to_int.
+
+ * ext/socket/socket.c (setup_domain_and_type): use valp argument.
+
Thu Jan 1 19:36:57 2009 Tanaka Akira <akr@fsij.org>
* ext/socket/mkconstants.rb: generate family_to_str.
diff --git a/ext/socket/mkconstants.rb b/ext/socket/mkconstants.rb
index 09f0f030c7d..3b3492b5c26 100644
--- a/ext/socket/mkconstants.rb
+++ b/ext/socket/mkconstants.rb
@@ -75,14 +75,14 @@ def each_names_with_len(pat)
}
end
-ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int(str_var, len_var, pat)")
+ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int(str_var, len_var, retp_var, pat)")
switch (<%=len_var%>) {
% each_names_with_len(pat) {|names, len|
case <%=len%>:
% names.each {|name|
#ifdef <%=name%>
% size = name.bytesize
- if (memcmp(<%=str_var%>, <%=c_str name%>, <%=size%>) == 0) return <%=name%>;
+ if (memcmp(<%=str_var%>, <%=c_str name%>, <%=size%>) == 0) { *<%=retp_var%> = <%=name%>; return 0; }
#endif
% }
return -1;
@@ -153,15 +153,15 @@ init_constants(VALUE mConst)
}
static int
-family_to_int(char *str, int len)
+family_to_int(char *str, int len, int *valp)
{
-<%= gen_name_to_int("str", "len", /\A[AP]F_/) %>
+<%= gen_name_to_int("str", "len", "valp", /\A[AP]F_/) %>
}
static int
-socktype_to_int(char *str, int len)
+socktype_to_int(char *str, int len, int *valp)
{
-<%= gen_name_to_int("str", "len", /\ASOCK_/) %>
+<%= gen_name_to_int("str", "len", "valp", /\ASOCK_/) %>
}
static char *
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index f6fe3955fb1..90ce5af3479 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -2264,8 +2264,8 @@ unix_peeraddr(VALUE sock)
}
#endif
-static int family_to_int(char *str, int len);
-static int socktype_to_int(char *str, int len);
+static int family_to_int(char *str, int len, int *valp);
+static int socktype_to_int(char *str, int len, int *valp);
static void
setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv)
@@ -2275,28 +2275,22 @@ setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv)
tmp = rb_check_string_type(domain);
if (!NIL_P(tmp)) {
- int family;
domain = tmp;
rb_check_safe_obj(domain);
ptr = RSTRING_PTR(domain);
- family = family_to_int(ptr, RSTRING_LEN(domain));
- if (family == -1)
+ if (family_to_int(ptr, RSTRING_LEN(domain), dv) == -1)
rb_raise(rb_eSocket, "unknown socket domain %s", ptr);
- *dv = family;
}
else {
*dv = NUM2INT(domain);
}
tmp = rb_check_string_type(type);
if (!NIL_P(tmp)) {
- int socktype;
type = tmp;
rb_check_safe_obj(type);
ptr = RSTRING_PTR(type);
- socktype = socktype_to_int(ptr, RSTRING_LEN(type));
- if (socktype == -1)
+ if (socktype_to_int(ptr, RSTRING_LEN(type), tv) == -1)
rb_raise(rb_eSocket, "unknown socket type %s", ptr);
- *tv = socktype;
}
else {
*tv = NUM2INT(type);