Skip to content

Commit

Permalink
* win32/win32.{h,c} (rb_w32_{f,fd,fs}open): workaround for bcc32's
Browse files Browse the repository at this point in the history
  {f,fd,fs}open bug. set errno EMFILE and EBADF. [ruby-dev:23963]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6696 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
ocean committed Jul 25, 2004
1 parent dfee36e commit c5cd234
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 0 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
@@ -1,3 +1,8 @@
Sun Jul 25 11:05:21 2004 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>

* 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]

Sat Jul 24 13:32:47 2004 Yukihiro Matsumoto <matz@ruby-lang.org>

* range.c (rb_range_beg_len): returns Qnil only when "beg" points
Expand Down
52 changes: 52 additions & 0 deletions win32/win32.c
Expand Up @@ -3277,3 +3277,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
12 changes: 12 additions & 0 deletions win32/win32.h
Expand Up @@ -113,6 +113,12 @@ extern "C++" {
#define write(h, b, l) _write(h, b, l)
#define _open _sopen
#define sopen _sopen
#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
Expand Down Expand Up @@ -178,6 +184,12 @@ extern int do_aspawn(int, char *, char **);
extern int kill(int, int);
extern pid_t rb_w32_getpid(void);

#ifdef __BORLANDC__
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
Expand Down

0 comments on commit c5cd234

Please sign in to comment.