From 9d07076beffe22495ec496c60a09edd6c390e8cd Mon Sep 17 00:00:00 2001 From: ocean Date: Sun, 25 Jul 2004 02:25:25 +0000 Subject: [PATCH] * win32/win32.{h,c} (rb_w32_{f,fd,fs}open): workaround for bcc32's {f,fd,fs}open bug. set errno EMFILE and EBADF. [ruby-dev:23963] * test/drb/drbtest.rb: fix method duplication. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6697 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 ++++++ test/drb/drbtest.rb | 3 --- win32/win32.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ win32/win32.h | 13 ++++++++++++ 4 files changed, 72 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d9fea2ebc7..5579fad657 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sun Jul 25 10:56:28 2004 Hirokazu Yamamoto + + * win32/win32.{h,c} (rb_w32_{f,fd,fs}open): workaround for bcc32's + {f,fd,fs}open bug. set errno EMFILE and EBADF. [ruby-dev:23963] + + * test/drb/drbtest.rb: fix method duplication. + Sat Jul 24 13:32:47 2004 Yukihiro Matsumoto * range.c (rb_range_beg_len): returns Qnil only when "beg" points diff --git a/test/drb/drbtest.rb b/test/drb/drbtest.rb index e90b2ad566..6fd0f94d5e 100644 --- a/test/drb/drbtest.rb +++ b/test/drb/drbtest.rb @@ -15,9 +15,6 @@ class DRbService @@ruby = EnvUtil.rubybin @@ruby += " -d" if $DEBUG @@dir = File.dirname(File.expand_path(__FILE__)) - def self.manager - @@manager - end def self.add_service_command(nm) DRb::ExtServManager.command[nm] = "#{@@ruby} #{@@dir}/#{nm}" end diff --git a/win32/win32.c b/win32/win32.c index 8059a1315d..95ee05566a 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -3330,3 +3330,55 @@ rb_w32_snprintf(char *buf, size_t size, const char *format, ...) va_end(va); return ret; } + +// +// Fix bcc32's stdio bug +// + +#ifdef __BORLANDC__ +static int +too_many_files() +{ + FILE *f; + for (f = _streams; f < _streams + _nfile; f++) { + if (f->fd < 0) return 0; + } + return 1; +} + +#undef fopen +FILE * +rb_w32_fopen(const char *path, const char *mode) +{ + FILE *f = (errno = 0, fopen(path, mode)); + if (f == NULL && errno == 0) { + if (too_many_files()) + errno = EMFILE; + } + return f; +} + +FILE * +rb_w32_fdopen(int handle, char *type) +{ + FILE *f = (errno = 0, _fdopen(handle, type)); + if (f == NULL && errno == 0) { + if (handle < 0) + errno = EBADF; + else if (too_many_files()) + errno = EMFILE; + } + return f; +} + +FILE * +rb_w32_fsopen(const char *path, const char *mode, int shflags) +{ + FILE *f = (errno = 0, _fsopen(path, mode, shflags)); + if (f == NULL && errno == 0) { + if (too_many_files()) + errno = EMFILE; + } + return f; +} +#endif diff --git a/win32/win32.h b/win32/win32.h index cbe24a414c..672162c5cb 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -115,6 +115,12 @@ extern "C++" { #define sopen _sopen #undef fstat #define fstat(fd,st) rb_w32_fstat(fd,st) +#undef fopen +#define fopen(p, m) rb_w32_fopen(p, m) +#undef fdopen +#define fdopen(h, m) rb_w32_fdopen(h, m) +#undef fsopen +#define fsopen(p, m, sh) rb_w32_fsopen(p, m, sh) #endif #define fsync(h) _commit(h) #undef stat @@ -179,6 +185,13 @@ extern int rb_w32_aspawn(int, const char *, char *const *); extern int kill(int, int); extern pid_t rb_w32_getpid(void); +#ifdef __BORLANDC__ +extern int rb_w32_fstat(int, struct stat *); +extern FILE *rb_w32_fopen(const char *, const char *); +extern FILE *rb_w32_fdopen(int, char *); +extern FILE *rb_w32_fsopen(const char *, const char *, int); +#endif + #include #if !defined __MINGW32__ || defined __NO_ISOCEXT #ifndef isnan