aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--io.c14
2 files changed, 11 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index eb365eb75c..9cc28e4d0c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Oct 30 20:06:07 2011 Tanaka Akira <akr@fsij.org>
+
+ * io.c (rb_cloexec_dup): refine control flow.
+ (rb_cloexec_dup2): ditto.
+
Sun Oct 30 18:45:50 2011 Tanaka Akira <akr@fsij.org>
* ruby.c (fill_standard_fds): new function to open closed standard
diff --git a/io.c b/io.c
index 9f696136f2..4dbf337e8c 100644
--- a/io.c
+++ b/io.c
@@ -212,14 +212,13 @@ rb_cloexec_dup(int oldfd)
if (try_fcntl) {
/* don't allocate standard file descriptors: 0, 1, 2 */
ret = fcntl(oldfd, F_DUPFD_CLOEXEC, 3);
+ if (ret != -1)
+ return ret;
/* F_DUPFD_CLOEXEC is available since Linux 2.6.24. Linux 2.6.18 fails with EINVAL */
- if (ret == -1 && errno == EINVAL) {
+ if (errno == EINVAL) {
try_fcntl = 0;
ret = dup(oldfd);
}
- else {
- return ret;
- }
}
else {
ret = dup(oldfd);
@@ -244,14 +243,13 @@ rb_cloexec_dup2(int oldfd, int newfd)
static int try_dup3 = 1;
if (2 < newfd && try_dup3) {
ret = dup3(oldfd, newfd, O_CLOEXEC);
+ if (ret != -1)
+ return ret;
/* dup3 is available since Linux 2.6.27. */
- if (ret == -1 && errno == ENOSYS) {
+ if (errno == ENOSYS) {
try_dup3 = 0;
ret = dup2(oldfd, newfd);
}
- else {
- return ret;
- }
}
else {
ret = dup2(oldfd, newfd);