summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-28 09:17:54 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-28 09:17:54 +0000
commitcc38f5f090797b332633f8ead2dc1d34601fb03e (patch)
treec85f1303d657551e9717c9f2acd0bfaa9cccc6d8 /ext
parentff95039936708914c3f973ce26f1991382b2c358 (diff)
* ext/socket/socket.c (sock_addrinfo): should specify socktype
from outside. * io.c (argf_binmode): should call next_argv() to initialize ARGF. * io.c (argf_filename): ditto. * io.c (argf_file): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/socket/socket.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 601455e878..b3cdf6248a 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -540,11 +540,11 @@ mkinetaddr(host, buf, len)
}
static struct addrinfo*
-sock_addrinfo(host, port, flags)
+sock_addrinfo(host, port, socktype, flags)
VALUE host, port;
- int flags;
+ int socktype, flags;
{
- struct addrinfo hints, *res;
+ struct addrinfo hints, *hintsp, *res;
char *hostp, *portp;
int error;
char hbuf[1024], pbuf[16];
@@ -589,11 +589,17 @@ sock_addrinfo(host, port, flags)
portp = RSTRING(port)->ptr;
}
- MEMZERO(&hints, struct addrinfo, 1);
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = flags;
- error = getaddrinfo(hostp, portp, &hints, &res);
+ if (socktype == 0 && flags == 0) {
+ hintsp = 0;
+ }
+ else {
+ hintsp = &hints;
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_protocol = 0;
+ hints.ai_socktype = socktype;
+ hints.ai_flags = flags;
+ }
+ error = getaddrinfo(hostp, portp, hintsp, &res);
if (error) {
if (hostp && hostp[strlen(hostp)-1] == '\n') {
rb_raise(rb_eSocket, "newline at the end of hostname");
@@ -609,7 +615,7 @@ setipaddr(name, addr)
VALUE name;
struct sockaddr_storage *addr;
{
- struct addrinfo *res = sock_addrinfo(name, Qnil, 0);
+ struct addrinfo *res = sock_addrinfo(name, Qnil, SOCK_STREAM, 0);
/* just take the first one */
memcpy(addr, res->ai_addr, res->ai_addrlen);
@@ -842,14 +848,14 @@ init_inetsock(sock, remote_host, remote_serv, local_host, local_serv, type)
int fd, status;
char *syscall;
- res_remote = sock_addrinfo(remote_host, remote_serv,
+ res_remote = sock_addrinfo(remote_host, remote_serv, SOCK_STREAM,
(type == INET_SERVER) ? AI_PASSIVE : 0);
/*
* Maybe also accept a local address
*/
if (type != INET_SERVER && (!NIL_P(local_host) || !NIL_P(local_serv))) {
- res_local = sock_addrinfo(local_host, local_serv,
+ res_local = sock_addrinfo(local_host, local_serv, SOCK_STREAM,
(type == INET_SERVER) ? AI_PASSIVE : 0);
}
@@ -1270,7 +1276,7 @@ udp_connect(sock, host, port)
rb_secure(3);
GetOpenFile(sock, fptr);
fd = fileno(fptr->f);
- res0 = sock_addrinfo(host, port, 0);
+ res0 = sock_addrinfo(host, port, SOCK_DGRAM, 0);
for (res = res0; res; res = res->ai_next) {
if (ruby_connect(fd, res->ai_addr, res->ai_addrlen, 0) >= 0) {
freeaddrinfo(res0);
@@ -1292,7 +1298,7 @@ udp_bind(sock, host, port)
rb_secure(3);
GetOpenFile(sock, fptr);
- res0 = sock_addrinfo(host, port, 0);
+ res0 = sock_addrinfo(host, port, SOCK_DGRAM, 0);
for (res = res0; res; res = res->ai_next) {
if (bind(fileno(fptr->f), res->ai_addr, res->ai_addrlen) < 0) {
continue;
@@ -1324,7 +1330,7 @@ udp_send(argc, argv, sock)
rb_scan_args(argc, argv, "4", &mesg, &flags, &host, &port);
GetOpenFile(sock, fptr);
- res0 = sock_addrinfo(host, port, 0);
+ res0 = sock_addrinfo(host, port, SOCK_DGRAM, 0);
f = GetWriteFile(fptr);
StringValue(mesg);
for (res = res0; res; res = res->ai_next) {
@@ -2195,7 +2201,7 @@ static VALUE
sock_s_pack_sockaddr_in(self, port, host)
VALUE self, port, host;
{
- struct addrinfo *res = sock_addrinfo(host, port, 0);
+ struct addrinfo *res = sock_addrinfo(host, port, 0, 0);
VALUE addr = rb_str_new((char*)res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);