summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/socket/socket.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 6ef0b3d4d8..db27a1154b 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -19,7 +19,7 @@ setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv)
/*
* call-seq:
- * Socket.new(domain, socktype, protocol) => socket
+ * Socket.new(domain, socktype [, protocol]) => socket
*
* Creates a new socket object.
*
@@ -28,19 +28,25 @@ setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv)
* _socktype_ should be a socket type such as: :STREAM, :DGRAM, :RAW, etc.
*
* _protocol_ should be a protocol defined in the domain.
- * 0 is default protocol for the domain.
+ * This is optional.
+ * If it is not given, 0 is used internally.
*
- * Socket.new(:INET, :STREAM, 0) # TCP socket
- * Socket.new(:INET, :DGRAM, 0) # UDP socket
- * Socket.new(:UNIX, :STREAM, 0) # UNIX stream socket
- * Socket.new(:UNIX, :DGRAM, 0) # UNIX datagram socket
+ * Socket.new(:INET, :STREAM) # TCP socket
+ * Socket.new(:INET, :DGRAM) # UDP socket
+ * Socket.new(:UNIX, :STREAM) # UNIX stream socket
+ * Socket.new(:UNIX, :DGRAM) # UNIX datagram socket
*/
static VALUE
-sock_initialize(VALUE sock, VALUE domain, VALUE type, VALUE protocol)
+sock_initialize(int argc, VALUE *argv, VALUE sock)
{
+ VALUE domain, type, protocol;
int fd;
int d, t;
+ rb_scan_args(argc, argv, "21", &domain, &type, &protocol);
+ if (NIL_P(protocol))
+ protocol = INT2FIX(0);
+
rb_secure(3);
setup_domain_and_type(domain, &d, type, &t);
fd = ruby_socket(d, t, NUM2INT(protocol));
@@ -1742,7 +1748,7 @@ Init_socket()
Init_socket_init();
- rb_define_method(rb_cSocket, "initialize", sock_initialize, 3);
+ rb_define_method(rb_cSocket, "initialize", sock_initialize, -1);
rb_define_method(rb_cSocket, "connect", sock_connect, 1);
rb_define_method(rb_cSocket, "connect_nonblock", sock_connect_nonblock, 1);
rb_define_method(rb_cSocket, "bind", sock_bind, 1);