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