mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/socket/socket.c (sock_s_getaddrinfo): refactored to remove
code duplication regarding getaddrinfo. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20387 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3c6b1bfbe4
commit
46e431e3eb
2 changed files with 23 additions and 37 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Fri Nov 28 18:31:21 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/socket/socket.c (sock_s_getaddrinfo): refactored to remove
|
||||||
|
code duplication regarding getaddrinfo.
|
||||||
|
|
||||||
Fri Nov 28 17:52:26 2008 Keiju Ishitsuka <keiju@ruby-lang.org>
|
Fri Nov 28 17:52:26 2008 Keiju Ishitsuka <keiju@ruby-lang.org>
|
||||||
|
|
||||||
* lib/forwardable.rb: should be usable def_single_delegator for
|
* lib/forwardable.rb: should be usable def_single_delegator for
|
||||||
|
|
|
@ -926,9 +926,8 @@ port_str(VALUE port, char *pbuf, size_t len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct addrinfo*
|
static struct addrinfo*
|
||||||
sock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
|
sock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints)
|
||||||
{
|
{
|
||||||
struct addrinfo hints;
|
|
||||||
struct addrinfo* res = NULL;
|
struct addrinfo* res = NULL;
|
||||||
char *hostp, *portp;
|
char *hostp, *portp;
|
||||||
int error;
|
int error;
|
||||||
|
@ -937,15 +936,11 @@ sock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
|
||||||
hostp = host_str(host, hbuf, sizeof(hbuf));
|
hostp = host_str(host, hbuf, sizeof(hbuf));
|
||||||
portp = port_str(port, pbuf, sizeof(pbuf));
|
portp = port_str(port, pbuf, sizeof(pbuf));
|
||||||
|
|
||||||
if (socktype == 0 && flags == 0 && str_isnumber(portp)) {
|
if (hints->ai_socktype == 0 && hints->ai_flags == 0 && str_isnumber(portp)) {
|
||||||
socktype = SOCK_DGRAM;
|
hints->ai_socktype = SOCK_DGRAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
MEMZERO(&hints, struct addrinfo, 1);
|
error = getaddrinfo(hostp, portp, hints, &res);
|
||||||
hints.ai_family = AF_UNSPEC;
|
|
||||||
hints.ai_socktype = socktype;
|
|
||||||
hints.ai_flags = flags;
|
|
||||||
error = getaddrinfo(hostp, portp, &hints, &res);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
if (hostp && hostp[strlen(hostp)-1] == '\n') {
|
if (hostp && hostp[strlen(hostp)-1] == '\n') {
|
||||||
rb_raise(rb_eSocket, "newline at the end of hostname");
|
rb_raise(rb_eSocket, "newline at the end of hostname");
|
||||||
|
@ -974,6 +969,18 @@ sock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct addrinfo*
|
||||||
|
sock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
|
||||||
|
{
|
||||||
|
struct addrinfo hints;
|
||||||
|
|
||||||
|
MEMZERO(&hints, struct addrinfo, 1);
|
||||||
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_socktype = socktype;
|
||||||
|
hints.ai_flags = flags;
|
||||||
|
return sock_getaddrinfo(host, port, &hints);
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
ipaddr(struct sockaddr *sockaddr, int norevlookup)
|
ipaddr(struct sockaddr *sockaddr, int norevlookup)
|
||||||
{
|
{
|
||||||
|
@ -3271,33 +3278,10 @@ static VALUE
|
||||||
sock_s_getaddrinfo(int argc, VALUE *argv)
|
sock_s_getaddrinfo(int argc, VALUE *argv)
|
||||||
{
|
{
|
||||||
VALUE host, port, family, socktype, protocol, flags, ret;
|
VALUE host, port, family, socktype, protocol, flags, ret;
|
||||||
char hbuf[1024], pbuf[1024];
|
char *ap;
|
||||||
char *hptr, *pptr, *ap;
|
|
||||||
struct addrinfo hints, *res;
|
struct addrinfo hints, *res;
|
||||||
int error;
|
|
||||||
|
|
||||||
host = port = family = socktype = protocol = flags = Qnil;
|
|
||||||
rb_scan_args(argc, argv, "24", &host, &port, &family, &socktype, &protocol, &flags);
|
rb_scan_args(argc, argv, "24", &host, &port, &family, &socktype, &protocol, &flags);
|
||||||
if (NIL_P(host)) {
|
|
||||||
hptr = NULL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
strncpy(hbuf, StringValuePtr(host), sizeof(hbuf));
|
|
||||||
hbuf[sizeof(hbuf) - 1] = '\0';
|
|
||||||
hptr = hbuf;
|
|
||||||
}
|
|
||||||
if (NIL_P(port)) {
|
|
||||||
pptr = NULL;
|
|
||||||
}
|
|
||||||
else if (FIXNUM_P(port)) {
|
|
||||||
snprintf(pbuf, sizeof(pbuf), "%ld", FIX2LONG(port));
|
|
||||||
pptr = pbuf;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
strncpy(pbuf, StringValuePtr(port), sizeof(pbuf));
|
|
||||||
pbuf[sizeof(pbuf) - 1] = '\0';
|
|
||||||
pptr = pbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
MEMZERO(&hints, struct addrinfo, 1);
|
MEMZERO(&hints, struct addrinfo, 1);
|
||||||
if (NIL_P(family)) {
|
if (NIL_P(family)) {
|
||||||
|
@ -3326,10 +3310,7 @@ sock_s_getaddrinfo(int argc, VALUE *argv)
|
||||||
if (!NIL_P(flags)) {
|
if (!NIL_P(flags)) {
|
||||||
hints.ai_flags = NUM2INT(flags);
|
hints.ai_flags = NUM2INT(flags);
|
||||||
}
|
}
|
||||||
error = getaddrinfo(hptr, pptr, &hints, &res);
|
res = sock_getaddrinfo(host, port, &hints);
|
||||||
if (error) {
|
|
||||||
raise_socket_error("getaddrinfo", error);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = make_addrinfo(res);
|
ret = make_addrinfo(res);
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
|
|
Loading…
Reference in a new issue