* win32/win32.c (rb_w32_open_osfhandle): adjust

rb_w32_open_osfhandle() with _open_osfhandle().

* win32/win32.c (rb_w32_accept, rb_w32_socket): return -1 on
  error.

* win32/win32.h: should use file descriptor instead of SOCKET.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2908 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2002-09-29 09:31:58 +00:00
parent 62280094cd
commit 7345d0efd4
3 changed files with 136 additions and 137 deletions

View File

@ -1,3 +1,13 @@
Sun Sep 29 18:30:24 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* win32/win32.c (rb_w32_open_osfhandle): adjust
rb_w32_open_osfhandle() with _open_osfhandle().
* win32/win32.c (rb_w32_accept, rb_w32_socket): return -1 on
error.
* win32/win32.h: should use file descriptor instead of SOCKET.
Sun Sep 29 06:33:03 2002 NAKAMURA Usaku <usa@ruby-lang.org> Sun Sep 29 06:33:03 2002 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/win32.c (is_socket, rb_w32_select, rb_w32_accept, rb_w32_bind, * win32/win32.c (is_socket, rb_w32_select, rb_w32_accept, rb_w32_bind,

View File

@ -84,6 +84,8 @@ static char *str_grow(struct RString *str, size_t new_size);
static DWORD wait_events(HANDLE event, DWORD timeout); static DWORD wait_events(HANDLE event, DWORD timeout);
#ifndef __BORLANDC__ #ifndef __BORLANDC__
static int rb_w32_open_osfhandle(long osfhandle, int flags); static int rb_w32_open_osfhandle(long osfhandle, int flags);
#else
#define rb_w32_open_osfhandle(osfhandle, flags) _open_osfhandle(osfhandle, flags)
#endif #endif
char *NTLoginName; char *NTLoginName;
@ -430,7 +432,6 @@ SOCKET
rb_w32_get_osfhandle(int fh) rb_w32_get_osfhandle(int fh)
{ {
return _get_osfhandle(fh); return _get_osfhandle(fh);
} }
pid_t pid_t
@ -508,16 +509,10 @@ pipe_exec(char *cmd, int mode, FILE **fpr, FILE **fpw)
CloseHandle(hWriteOut); CloseHandle(hWriteOut);
} }
CloseHandle(hCurProc); CloseHandle(hCurProc);
ret = 0;
} while (0));
if (ret != 0) {
return ret;
}
/* create child process */ /* create child process */
child = CreateChild(cmd, &sa, NULL, NULL, NULL); child = CreateChild(cmd, &sa, NULL, NULL, NULL);
if (!child) { if (!child) {
RUBY_CRITICAL({
if (reading) { if (reading) {
SetStdHandle(STD_OUTPUT_HANDLE, hSavedStdOut); SetStdHandle(STD_OUTPUT_HANDLE, hSavedStdOut);
CloseHandle(hReadOut); CloseHandle(hReadOut);
@ -528,13 +523,10 @@ pipe_exec(char *cmd, int mode, FILE **fpr, FILE **fpw)
CloseHandle(hWriteIn); CloseHandle(hWriteIn);
CloseHandle(hDupOutFile); CloseHandle(hDupOutFile);
} }
}); break;
return -1; }
}
/* restore STDIN/STDOUT */ /* restore STDIN/STDOUT */
RUBY_CRITICAL(do {
ret = -1;
if (reading) { if (reading) {
if (!SetStdHandle(STD_OUTPUT_HANDLE, hSavedStdOut)) { if (!SetStdHandle(STD_OUTPUT_HANDLE, hSavedStdOut)) {
errno = GetLastError(); errno = GetLastError();
@ -561,71 +553,61 @@ pipe_exec(char *cmd, int mode, FILE **fpr, FILE **fpw)
break; break;
} }
} }
ret = 0;
} while (0));
if (ret != 0) {
return ret;
}
if (reading) { if (reading) {
#ifdef __BORLANDC__ fdin = rb_w32_open_osfhandle((long)hDupInFile,
fdin = _open_osfhandle((long)hDupInFile, (_O_RDONLY | pipemode)); (_O_RDONLY | pipemode));
#else CloseHandle(hReadOut);
fdin = rb_w32_open_osfhandle((long)hDupInFile, (_O_RDONLY | pipemode)); if (fdin == -1) {
#endif CloseHandle(hDupInFile);
CloseHandle(hReadOut); if (writing) {
if (fdin == -1) { CloseHandle(hWriteIn);
CloseHandle(hDupInFile); CloseHandle(hDupOutFile);
if (writing) { }
CloseHandle(hWriteIn); CloseChildHandle(child);
break;
}
}
if (writing) {
fdout = rb_w32_open_osfhandle((long)hDupOutFile,
(_O_WRONLY | pipemode));
CloseHandle(hWriteIn);
if (fdout == -1) {
CloseHandle(hDupOutFile); CloseHandle(hDupOutFile);
if (reading) {
_close(fdin);
}
CloseChildHandle(child);
break;
} }
CloseChildHandle(child);
return -1;
} }
}
if (writing) { if (reading) {
#ifdef __BORLANDC__ sprintf(modes, "r%s", pipemode == O_BINARY ? "b" : "");
fdout = _open_osfhandle((long)hDupOutFile, (_O_WRONLY | pipemode)); if ((*fpr = (FILE *)fdopen(fdin, modes)) == NULL) {
#else
fdout = rb_w32_open_osfhandle((long)hDupOutFile,
(_O_WRONLY | pipemode));
#endif
CloseHandle(hWriteIn);
if (fdout == -1) {
CloseHandle(hDupOutFile);
if (reading) {
_close(fdin); _close(fdin);
if (writing) {
_close(fdout);
}
CloseChildHandle(child);
break;
} }
CloseChildHandle(child);
return -1;
} }
} if (writing) {
sprintf(modes, "w%s", pipemode == O_BINARY ? "b" : "");
if (reading) { if ((*fpw = (FILE *)fdopen(fdout, modes)) == NULL) {
sprintf(modes, "r%s", pipemode == O_BINARY ? "b" : "");
if ((*fpr = (FILE *)fdopen(fdin, modes)) == NULL) {
_close(fdin);
if (writing) {
_close(fdout); _close(fdout);
if (reading) {
fclose(*fpr);
}
CloseChildHandle(child);
break;
} }
CloseChildHandle(child);
return -1;
} }
} ret = child->pid;
if (writing) { } while (0));
sprintf(modes, "w%s", pipemode == O_BINARY ? "b" : "");
if ((*fpw = (FILE *)fdopen(fdout, modes)) == NULL) {
_close(fdout);
if (reading) {
fclose(*fpr);
}
CloseChildHandle(child);
return -1;
}
}
return child->pid; return ret;
} }
extern VALUE rb_last_status; extern VALUE rb_last_status;
@ -1409,13 +1391,6 @@ EXTERN_C _CRTIMP ioinfo * __pioinfo[];
#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = osfh) #define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = osfh)
#define _set_osflags(fh, flags) (_osfile(fh) = (flags)) #define _set_osflags(fh, flags) (_osfile(fh) = (flags))
#else
#define _set_osfhnd(fh, osfh) (void)((fh), (osfh))
#define _set_osflags(fh, flags) (void)((fh), (flags))
#endif
#define FOPEN 0x01 /* file handle open */ #define FOPEN 0x01 /* file handle open */
#define FNOINHERIT 0x10 /* file handle opened O_NOINHERIT */ #define FNOINHERIT 0x10 /* file handle opened O_NOINHERIT */
#define FAPPEND 0x20 /* file handle opened O_APPEND */ #define FAPPEND 0x20 /* file handle opened O_APPEND */
@ -1427,6 +1402,7 @@ rb_w32_open_osfhandle(long osfhandle, int flags)
{ {
int fh; int fh;
char fileflags; /* _osfile flags */ char fileflags; /* _osfile flags */
HANDLE hF;
/* copy relevant flags from second parameter */ /* copy relevant flags from second parameter */
fileflags = FDEV; fileflags = FDEV;
@ -1440,29 +1416,33 @@ rb_w32_open_osfhandle(long osfhandle, int flags)
if (flags & O_NOINHERIT) if (flags & O_NOINHERIT)
fileflags |= FNOINHERIT; fileflags |= FNOINHERIT;
RUBY_CRITICAL({ /* attempt to allocate a C Runtime file handle */
/* attempt to allocate a C Runtime file handle */ hF = CreateFile("NUL", 0, 0, NULL, OPEN_ALWAYS, 0, NULL);
HANDLE hF = CreateFile("NUL", 0, 0, NULL, OPEN_ALWAYS, 0, NULL); fh = _open_osfhandle((long)hF, 0);
fh = _open_osfhandle((long)hF, 0); CloseHandle(hF);
CloseHandle(hF); if (fh == -1) {
if (fh == -1) { errno = EMFILE; /* too many open files */
errno = EMFILE; /* too many open files */ _doserrno = 0L; /* not an OS error */
_doserrno = 0L; /* not an OS error */ }
} else {
else {
MTHREAD_ONLY(EnterCriticalSection(&(_pioinfo(fh)->lock))); MTHREAD_ONLY(EnterCriticalSection(&(_pioinfo(fh)->lock)));
/* the file is open. now, set the info in _osfhnd array */ /* the file is open. now, set the info in _osfhnd array */
_set_osfhnd(fh, osfhandle); _set_osfhnd(fh, osfhandle);
fileflags |= FOPEN; /* mark as open */ fileflags |= FOPEN; /* mark as open */
_set_osflags(fh, fileflags); /* set osfile entry */ _set_osflags(fh, fileflags); /* set osfile entry */
MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fh)->lock)); MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fh)->lock));
} }
});
return fh; /* return handle */ return fh; /* return handle */
} }
#else
#define _set_osfhnd(fh, osfh) (void)((fh), (osfh))
#define _set_osflags(fh, flags) (void)((fh), (flags))
#endif
#undef getsockopt #undef getsockopt
@ -1500,7 +1480,8 @@ rb_w32_fddup (int fd)
if (s == -1) if (s == -1)
return -1; return -1;
return rb_w32_open_osfhandle(s, O_RDWR|O_BINARY); RUBY_CRITICAL(fd = rb_w32_open_osfhandle(s, O_RDWR|O_BINARY));
return fd;
} }
@ -1810,8 +1791,8 @@ StartSockets ()
#undef accept #undef accept
SOCKET int
rb_w32_accept (SOCKET s, struct sockaddr *addr, int *addrlen) rb_w32_accept(int s, struct sockaddr *addr, int *addrlen)
{ {
SOCKET r; SOCKET r;
@ -1820,16 +1801,21 @@ rb_w32_accept (SOCKET s, struct sockaddr *addr, int *addrlen)
} }
RUBY_CRITICAL({ RUBY_CRITICAL({
r = accept(TO_SOCKET(s), addr, addrlen); r = accept(TO_SOCKET(s), addr, addrlen);
if (r == INVALID_SOCKET) if (r == INVALID_SOCKET) {
errno = WSAGetLastError(); errno = WSAGetLastError();
s = -1;
}
else {
s = rb_w32_open_osfhandle(r, O_RDWR|O_BINARY);
}
}); });
return rb_w32_open_osfhandle(r, O_RDWR|O_BINARY); return s;
} }
#undef bind #undef bind
int int
rb_w32_bind (SOCKET s, struct sockaddr *addr, int addrlen) rb_w32_bind(int s, struct sockaddr *addr, int addrlen)
{ {
int r; int r;
@ -1847,7 +1833,7 @@ rb_w32_bind (SOCKET s, struct sockaddr *addr, int addrlen)
#undef connect #undef connect
int int
rb_w32_connect (SOCKET s, struct sockaddr *addr, int addrlen) rb_w32_connect(int s, struct sockaddr *addr, int addrlen)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -1865,7 +1851,7 @@ rb_w32_connect (SOCKET s, struct sockaddr *addr, int addrlen)
#undef getpeername #undef getpeername
int int
rb_w32_getpeername (SOCKET s, struct sockaddr *addr, int *addrlen) rb_w32_getpeername(int s, struct sockaddr *addr, int *addrlen)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -1882,7 +1868,7 @@ rb_w32_getpeername (SOCKET s, struct sockaddr *addr, int *addrlen)
#undef getsockname #undef getsockname
int int
rb_w32_getsockname (SOCKET s, struct sockaddr *addr, int *addrlen) rb_w32_getsockname(int s, struct sockaddr *addr, int *addrlen)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -1897,7 +1883,7 @@ rb_w32_getsockname (SOCKET s, struct sockaddr *addr, int *addrlen)
} }
int int
rb_w32_getsockopt (SOCKET s, int level, int optname, char *optval, int *optlen) rb_w32_getsockopt(int s, int level, int optname, char *optval, int *optlen)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -1914,7 +1900,7 @@ rb_w32_getsockopt (SOCKET s, int level, int optname, char *optval, int *optlen)
#undef ioctlsocket #undef ioctlsocket
int int
rb_w32_ioctlsocket (SOCKET s, long cmd, u_long *argp) rb_w32_ioctlsocket(int s, long cmd, u_long *argp)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -1931,7 +1917,7 @@ rb_w32_ioctlsocket (SOCKET s, long cmd, u_long *argp)
#undef listen #undef listen
int int
rb_w32_listen (SOCKET s, int backlog) rb_w32_listen(int s, int backlog)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -1948,7 +1934,7 @@ rb_w32_listen (SOCKET s, int backlog)
#undef recv #undef recv
int int
rb_w32_recv (SOCKET s, char *buf, int len, int flags) rb_w32_recv(int s, char *buf, int len, int flags)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -1965,7 +1951,7 @@ rb_w32_recv (SOCKET s, char *buf, int len, int flags)
#undef recvfrom #undef recvfrom
int int
rb_w32_recvfrom (SOCKET s, char *buf, int len, int flags, rb_w32_recvfrom(int s, char *buf, int len, int flags,
struct sockaddr *from, int *fromlen) struct sockaddr *from, int *fromlen)
{ {
int r; int r;
@ -1983,7 +1969,7 @@ rb_w32_recvfrom (SOCKET s, char *buf, int len, int flags,
#undef send #undef send
int int
rb_w32_send (SOCKET s, char *buf, int len, int flags) rb_w32_send(int s, char *buf, int len, int flags)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -2000,8 +1986,8 @@ rb_w32_send (SOCKET s, char *buf, int len, int flags)
#undef sendto #undef sendto
int int
rb_w32_sendto (SOCKET s, char *buf, int len, int flags, rb_w32_sendto(int s, char *buf, int len, int flags,
struct sockaddr *to, int tolen) struct sockaddr *to, int tolen)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -2018,7 +2004,7 @@ rb_w32_sendto (SOCKET s, char *buf, int len, int flags,
#undef setsockopt #undef setsockopt
int int
rb_w32_setsockopt (SOCKET s, int level, int optname, char *optval, int optlen) rb_w32_setsockopt(int s, int level, int optname, char *optval, int optlen)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -2035,7 +2021,7 @@ rb_w32_setsockopt (SOCKET s, int level, int optname, char *optval, int optlen)
#undef shutdown #undef shutdown
int int
rb_w32_shutdown (SOCKET s, int how) rb_w32_shutdown(int s, int how)
{ {
int r; int r;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
@ -2051,23 +2037,26 @@ rb_w32_shutdown (SOCKET s, int how)
#undef socket #undef socket
SOCKET int
rb_w32_socket (int af, int type, int protocol) rb_w32_socket(int af, int type, int protocol)
{ {
SOCKET s; SOCKET s;
int fd;
if (!NtSocketsInitialized++) { if (!NtSocketsInitialized++) {
StartSockets(); StartSockets();
} }
RUBY_CRITICAL({ RUBY_CRITICAL({
s = socket(af, type, protocol); s = socket(af, type, protocol);
if (s == INVALID_SOCKET) if (s == INVALID_SOCKET) {
errno = WSAGetLastError(); errno = WSAGetLastError();
fd = -1;
}
else {
fd = rb_w32_open_osfhandle(s, O_RDWR|O_BINARY);
}
}); });
#ifdef __BORLANDC__ return fd;
return _open_osfhandle(s, O_RDWR|O_BINARY);
#else
return rb_w32_open_osfhandle(s, O_RDWR|O_BINARY);
#endif
} }
#undef gethostbyaddr #undef gethostbyaddr

View File

@ -163,25 +163,25 @@ extern pid_t pipe_exec(char *, int, FILE **, FILE **);
extern int flock(int fd, int oper); extern int flock(int fd, int oper);
extern int rb_w32_fddup(int); extern int rb_w32_fddup(int);
extern void rb_w32_fdclose(FILE *); extern void rb_w32_fdclose(FILE *);
extern SOCKET rb_w32_accept(SOCKET, struct sockaddr *, int *); extern int rb_w32_accept(int, struct sockaddr *, int *);
extern int rb_w32_bind(SOCKET, struct sockaddr *, int); extern int rb_w32_bind(int, struct sockaddr *, int);
extern int rb_w32_connect(SOCKET, struct sockaddr *, int); extern int rb_w32_connect(int, struct sockaddr *, int);
extern void rb_w32_fdset(int, fd_set*); extern void rb_w32_fdset(int, fd_set*);
extern void rb_w32_fdclr(int, fd_set*); extern void rb_w32_fdclr(int, fd_set*);
extern int rb_w32_fdisset(int, fd_set*); extern int rb_w32_fdisset(int, fd_set*);
extern long rb_w32_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); extern long rb_w32_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
extern int rb_w32_getpeername(SOCKET, struct sockaddr *, int *); extern int rb_w32_getpeername(int, struct sockaddr *, int *);
extern int rb_w32_getsockname(SOCKET, struct sockaddr *, int *); extern int rb_w32_getsockname(int, struct sockaddr *, int *);
extern int rb_w32_getsockopt(SOCKET, int, int, char *, int *); extern int rb_w32_getsockopt(int, int, int, char *, int *);
extern int rb_w32_ioctlsocket(SOCKET, long, u_long *); extern int rb_w32_ioctlsocket(int, long, u_long *);
extern int rb_w32_listen(SOCKET, int); extern int rb_w32_listen(int, int);
extern int rb_w32_recv(SOCKET, char *, int, int); extern int rb_w32_recv(int, char *, int, int);
extern int rb_w32_recvfrom(SOCKET, char *, int, int, struct sockaddr *, int *); extern int rb_w32_recvfrom(int, char *, int, int, struct sockaddr *, int *);
extern int rb_w32_send(SOCKET, char *, int, int); extern int rb_w32_send(int, char *, int, int);
extern int rb_w32_sendto(SOCKET, char *, int, int, struct sockaddr *, int); extern int rb_w32_sendto(int, char *, int, int, struct sockaddr *, int);
extern int rb_w32_setsockopt(SOCKET, int, int, char *, int); extern int rb_w32_setsockopt(int, int, int, char *, int);
extern int rb_w32_shutdown(SOCKET, int); extern int rb_w32_shutdown(int, int);
extern SOCKET rb_w32_socket(int, int, int); extern int rb_w32_socket(int, int, int);
extern SOCKET rb_w32_get_osfhandle(int); extern SOCKET rb_w32_get_osfhandle(int);
extern struct hostent * rb_w32_gethostbyaddr(char *, int, int); extern struct hostent * rb_w32_gethostbyaddr(char *, int, int);
extern struct hostent * rb_w32_gethostbyname(char *); extern struct hostent * rb_w32_gethostbyname(char *);