* include/ruby/win32.h, win32/win32.c (rb_w32_is_valid_fd): new function

to validate fd.

	* io.c (rb_io_initialize): check fd with above function.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21734 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
usa 2009-01-22 06:55:20 +00:00
Родитель 7e4ca52669
Коммит a3e8d63a75
4 изменённых файлов: 21 добавлений и 2 удалений

Просмотреть файл

@ -1,3 +1,10 @@
Thu Jan 22 15:54:02 2009 NAKAMURA Usaku <usa@ruby-lang.org>
* include/ruby/win32.h, win32/win32.c (rb_w32_is_valid_fd): new function
to validate fd.
* io.c (rb_io_initialize): check fd with above function.
Thu Jan 22 14:53:29 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* test/ruby/test_process.rb (MANDATORY_ENVS): needs RUBYLIB to run

Просмотреть файл

@ -214,6 +214,7 @@ extern int WSAAPI rb_w32_connect(int, const struct sockaddr *, int);
extern void rb_w32_fdset(int, fd_set*);
extern void rb_w32_fdclr(int, fd_set*);
extern int rb_w32_fdisset(int, fd_set*);
extern int rb_w32_is_valid_fd(int);
extern int WSAAPI rb_w32_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
extern int WSAAPI rb_w32_getpeername(int, struct sockaddr *, int *);
extern int WSAAPI rb_w32_getsockname(int, struct sockaddr *, int *);

6
io.c
Просмотреть файл

@ -5971,13 +5971,15 @@ rb_io_initialize(int argc, VALUE *argv, VALUE io)
fd = NUM2INT(fnum);
if (fstat(fd, &st) == -1) rb_sys_fail(0);
UPDATE_MAXFD(fd);
if (NIL_P(vmode)) {
#if defined(HAVE_FCNTL) && defined(F_GETFL)
if (NIL_P(vmode)) {
oflags = fcntl(fd, F_GETFL);
if (oflags == -1) rb_sys_fail(0);
fmode = rb_io_oflags_fmode(oflags);
#endif
}
#elif defined(_WIN32)
if (rb_w32_is_valid_fd(fd)) rb_sys_fail(0);
#endif
MakeOpenFile(io, fp);
fp->fd = fd;
fp->mode = fmode;

Просмотреть файл

@ -1836,6 +1836,15 @@ rb_w32_open_osfhandle(intptr_t osfhandle, int flags)
}
#endif
int
rb_w32_is_valid_fd(int fd)
{
if (_get_osfhandle(fd) == -1)
return -1;
else
return 0;
}
#undef getsockopt
static int