summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/socket/init.c36
2 files changed, 21 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 8b7c4ef0a7..abb00f261b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Nov 5 17:55:52 2011 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/init.c (rsock_socket0): don't clear try_sock_cloexec if
+ SOCK_CLOEXEC is not a reason for EINVAL.
+
Sat Nov 5 16:27:52 2011 Kazuki Tsujimoto <kazuki@callcc.net>
* ext/pathname/lib/pathname.rb, ext/tk/lib/multi-tk.rb,
diff --git a/ext/socket/init.c b/ext/socket/init.c
index b35226ab78..990f1a4d6b 100644
--- a/ext/socket/init.c
+++ b/ext/socket/init.c
@@ -240,34 +240,30 @@ rsock_s_recvfrom_nonblock(VALUE sock, int argc, VALUE *argv, enum sock_recv_type
}
static int
-rsock_socket0(int domain, int type0, int proto)
+rsock_socket0(int domain, int type, int proto)
{
- int ret, type;
+ int ret;
#ifdef SOCK_CLOEXEC
static int try_sock_cloexec = 1;
- if (try_sock_cloexec)
- type = type0|SOCK_CLOEXEC;
- else
- type = type0;
- retry_without_sock_cloexec:;
+ if (try_sock_cloexec) {
+ ret = socket(domain, type|SOCK_CLOEXEC, proto);
+ if (ret == -1 && errno == EINVAL) {
+ /* SOCK_CLOEXEC is available since Linux 2.6.27. Linux 2.6.18 fails with EINVAL */
+ ret = socket(domain, type, proto);
+ if (ret != -1) {
+ try_sock_cloexec = 0;
+ }
+ }
+ }
+ else {
+ ret = socket(domain, type, proto);
+ }
#else
- type = type0;
-#endif
-
ret = socket(domain, type, proto);
-
- if (ret == -1) {
-#ifdef SOCK_CLOEXEC
- /* SOCK_CLOEXEC is available since Linux 2.6.27. Linux 2.6.18 fails with EINVAL */
- if (try_sock_cloexec && errno == EINVAL) {
- try_sock_cloexec = 0;
- type = type0;
- goto retry_without_sock_cloexec;
- }
#endif
+ if (ret == -1)
return -1;
- }
rb_fd_fix_cloexec(ret);