aboutsummaryrefslogtreecommitdiffstats
path: root/ext/socket/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/socket/socket.c')
-rw-r--r--ext/socket/socket.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 17aa3661c5..230966bae4 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -1611,7 +1611,7 @@ unix_send_io(sock, val)
fd = FIX2INT(val);
}
else {
- rb_raise(rb_eTypeError, "IO nor file descriptor");
+ rb_raise(rb_eTypeError, "neither IO nor file descriptor");
}
GetOpenFile(sock, fptr);
@@ -1728,7 +1728,7 @@ unix_recv_io(argc, argv, sock)
msg.msg_accrightslen != sizeof(fd)
#endif
) {
- rb_raise(rb_eSocket, "File descriptor was not passed");
+ rb_raise(rb_eSocket, "file descriptor was not passed");
}
#if FD_PASSING_BY_MSG_CONTROL
@@ -1880,7 +1880,7 @@ setup_domain_and_type(domain, dv, type, tv)
*dv = PF_IPX;
#endif
else
- rb_raise(rb_eSocket, "Unknown socket domain %s", ptr);
+ rb_raise(rb_eSocket, "unknown socket domain %s", ptr);
}
else {
*dv = NUM2INT(domain);
@@ -1911,7 +1911,7 @@ setup_domain_and_type(domain, dv, type, tv)
*tv = SOCK_PACKET;
#endif
else
- rb_raise(rb_eSocket, "Unknown socket type %s", ptr);
+ rb_raise(rb_eSocket, "unknown socket type %s", ptr);
}
else {
*tv = NUM2INT(type);
@@ -2215,7 +2215,7 @@ sock_s_gethostbyaddr(argc, argv)
}
static VALUE
-sock_s_getservbyaname(argc, argv)
+sock_s_getservbyname(argc, argv)
int argc;
VALUE *argv;
{
@@ -2245,6 +2245,25 @@ sock_s_getservbyaname(argc, argv)
}
static VALUE
+sock_s_getservbyport(argc, argv)
+ int argc;
+ VALUE *argv;
+{
+ VALUE port, proto;
+ struct servent *sp;
+
+ rb_scan_args(argc, argv, "11", &port, &proto);
+ if (NIL_P(proto)) proto = rb_str_new2("tcp");
+ StringValue(proto);
+
+ sp = getservbyport(NUM2INT(port), StringValueCStr(proto));
+ if (!sp) {
+ rb_raise(rb_eSocket, "no such service for port %d/%s", NUM2INT(port), RSTRING(proto)->ptr);
+ }
+ return rb_tainted_str_new2(sp->s_name);
+}
+
+static VALUE
sock_s_getaddrinfo(argc, argv)
int argc;
VALUE *argv;
@@ -2629,7 +2648,8 @@ Init_socket()
rb_define_singleton_method(rb_cSocket, "gethostname", sock_gethostname, 0);
rb_define_singleton_method(rb_cSocket, "gethostbyname", sock_s_gethostbyname, 1);
rb_define_singleton_method(rb_cSocket, "gethostbyaddr", sock_s_gethostbyaddr, -1);
- rb_define_singleton_method(rb_cSocket, "getservbyname", sock_s_getservbyaname, -1);
+ rb_define_singleton_method(rb_cSocket, "getservbyname", sock_s_getservbyname, -1);
+ rb_define_singleton_method(rb_cSocket, "getservbyport", sock_s_getservbyport, -1);
rb_define_singleton_method(rb_cSocket, "getaddrinfo", sock_s_getaddrinfo, -1);
rb_define_singleton_method(rb_cSocket, "getnameinfo", sock_s_getnameinfo, -1);
rb_define_singleton_method(rb_cSocket, "sockaddr_in", sock_s_pack_sockaddr_in, 2);