From f0edcd8283e1aeda9ff2d04926ec8041b421f890 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 16 Aug 2023 20:45:29 +0900 Subject: [PATCH] Extract platform dependent part as `fdopen_internal` --- io.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/io.c b/io.c index f54f01963f..90b6cc1db0 100644 --- a/io.c +++ b/io.c @@ -6966,8 +6966,8 @@ rb_sysopen(VALUE fname, int oflags, mode_t perm) return fd; } -FILE * -rb_fdopen(int fd, const char *modestr) +static inline FILE * +fdopen_internal(int fd, const char *modestr) { FILE *file; @@ -6976,24 +6976,25 @@ rb_fdopen(int fd, const char *modestr) #endif file = fdopen(fd, modestr); if (!file) { - int e = errno; -#if defined(__sun) - if (e == 0) { - rb_gc(); - errno = 0; - file = fdopen(fd, modestr); - } - else +#ifdef _WIN32 + if (errno == 0) errno = EINVAL; +#elif defined(__sun) + if (errno == 0) errno = EMFILE; #endif + } + return file; +} + +FILE * +rb_fdopen(int fd, const char *modestr) +{ + FILE *file = fdopen_internal(fd, modestr); + if (!file) { + int e = errno; if (rb_gc_for_fd(e)) { - file = fdopen(fd, modestr); + file = fdopen_internal(fd, modestr); } if (!file) { -#ifdef _WIN32 - if (e == 0) e = EINVAL; -#elif defined(__sun) - if (e == 0) e = EMFILE; -#endif rb_syserr_fail(e, 0); } }