diff options
author | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-25 02:25:25 +0000 |
---|---|---|
committer | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-25 02:25:25 +0000 |
commit | 9d07076beffe22495ec496c60a09edd6c390e8cd (patch) | |
tree | d7de2be6005301d07694b11ab5995ea3694384a9 /win32 | |
parent | 9a983e5150dc673c38c0269dd1b4da5e18a7f88d (diff) | |
download | ruby-9d07076beffe22495ec496c60a09edd6c390e8cd.tar.gz |
* 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
Diffstat (limited to 'win32')
-rw-r--r-- | win32/win32.c | 52 | ||||
-rw-r--r-- | win32/win32.h | 13 |
2 files changed, 65 insertions, 0 deletions
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 <float.h> #if !defined __MINGW32__ || defined __NO_ISOCEXT #ifndef isnan |