⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntio.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    if (!fd->secret->md.io_model_committed) {        rv = _md_Associate((HANDLE)osfd);        PR_ASSERT(0 != rv);        fd->secret->md.io_model_committed = PR_TRUE;    }    memset(&(me->md.overlapped.overlapped), 0, sizeof(OVERLAPPED));	if (_native_threads_only)		me->md.overlapped.overlapped.hEvent = me->md.thr_event;    _PR_THREAD_LOCK(me);	if (_PR_PENDING_INTERRUPT(me)) {		me->flags &= ~_PR_INTERRUPT;		PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);    	_PR_THREAD_UNLOCK(me);		return -1;	}    me->io_pending = PR_TRUE;    me->state = _PR_IO_WAIT;    _PR_THREAD_UNLOCK(me);    me->io_fd = osfd;    rv = ReadFile((HANDLE)osfd,                  buf,                   amount,                  &bytes,                  &(me->md.overlapped.overlapped));    if ( (rv == 0) && (GetLastError() != ERROR_IO_PENDING) ) {    	_PR_THREAD_LOCK(me);        me->io_pending = PR_FALSE;        me->state = _PR_RUNNING;		if (_PR_PENDING_INTERRUPT(me)) {			me->flags &= ~_PR_INTERRUPT;			PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);			_PR_THREAD_UNLOCK(me);			return -1;		}		_PR_THREAD_UNLOCK(me);        if ((err = GetLastError()) == ERROR_HANDLE_EOF)            return 0;		_PR_MD_MAP_READ_ERROR(err);        return -1;    }    if (_native_threads_only && rv) {        _native_thread_io_nowait(me, rv, bytes);    } else if (_NT_IO_WAIT(me, timeout) == PR_FAILURE) {        PR_ASSERT(0);        return -1;    }    PR_ASSERT(me->io_pending == PR_FALSE || me->io_suspended == PR_TRUE);    if (me->io_suspended) {        if (_PR_PENDING_INTERRUPT(me)) {            me->flags &= ~_PR_INTERRUPT;            PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);        } else {            PR_SetError(PR_IO_TIMEOUT_ERROR, 0);        }        return -1;    }    if (me->md.blocked_io_status == 0) {        if (me->md.blocked_io_error == ERROR_HANDLE_EOF)            return 0;		_PR_MD_MAP_READ_ERROR(me->md.blocked_io_error);        return -1;    }    PR_ASSERT(me->io_pending == PR_FALSE);    return me->md.blocked_io_bytes;}PRInt32_PR_MD_SEND(PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags,            PRIntervalTime timeout){    PRInt32 osfd = fd->secret->md.osfd;    PRThread *me = _PR_MD_CURRENT_THREAD();    int bytes;    int rv, err;    if (_NT_USE_NB_IO(fd)) {        if (!fd->secret->md.io_model_committed) {            rv = _md_MakeNonblock((HANDLE)osfd);            PR_ASSERT(0 != rv);            fd->secret->md.io_model_committed = PR_TRUE;        }        return _nt_nonblock_send(fd, (char *)buf, amount, timeout);    }    if (me->io_suspended) {        PR_SetError(PR_INVALID_STATE_ERROR, 0);        return -1;    }    if (!fd->secret->md.io_model_committed) {        rv = _md_Associate((HANDLE)osfd);        PR_ASSERT(0 != rv);        fd->secret->md.io_model_committed = PR_TRUE;    }    memset(&(me->md.overlapped.overlapped), 0, sizeof(OVERLAPPED));	if (_native_threads_only)		me->md.overlapped.overlapped.hEvent = me->md.thr_event;    _PR_THREAD_LOCK(me);	if (_PR_PENDING_INTERRUPT(me)) {		me->flags &= ~_PR_INTERRUPT;		PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);    	_PR_THREAD_UNLOCK(me);		return -1;	}    me->io_pending = PR_TRUE;    me->state = _PR_IO_WAIT;    _PR_THREAD_UNLOCK(me);    me->io_fd = osfd;    rv = WriteFile((HANDLE)osfd,                   buf,                    amount,                   &bytes,                   &(me->md.overlapped.overlapped));    if ( (rv == 0) && ((err = GetLastError()) != ERROR_IO_PENDING) ) {    	_PR_THREAD_LOCK(me);        me->io_pending = PR_FALSE;        me->state = _PR_RUNNING;		if (_PR_PENDING_INTERRUPT(me)) {			me->flags &= ~_PR_INTERRUPT;			PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);			_PR_THREAD_UNLOCK(me);			return -1;		}		_PR_THREAD_UNLOCK(me);		_PR_MD_MAP_WRITE_ERROR(err);        return -1;    }    if (_native_threads_only && rv) {        _native_thread_io_nowait(me, rv, bytes);    } else if (_NT_IO_WAIT(me, timeout) == PR_FAILURE) {        PR_ASSERT(0);        return -1;    }    PR_ASSERT(me->io_pending == PR_FALSE || me->io_suspended == PR_TRUE);    if (me->io_suspended) {        if (_PR_PENDING_INTERRUPT(me)) {            me->flags &= ~_PR_INTERRUPT;            PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);        } else {            PR_SetError(PR_IO_TIMEOUT_ERROR, 0);        }        return -1;    }    if (me->md.blocked_io_status == 0) {		_PR_MD_MAP_WRITE_ERROR(me->md.blocked_io_error);        return -1;    }    PR_ASSERT(me->io_pending == PR_FALSE);    return me->md.blocked_io_bytes;}PRInt32_PR_MD_SENDTO(PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags,              const PRNetAddr *addr, PRUint32 addrlen, PRIntervalTime timeout){    PRInt32 osfd = fd->secret->md.osfd;    PRInt32 rv;    if (!fd->secret->md.io_model_committed) {        rv = _md_MakeNonblock((HANDLE)osfd);        PR_ASSERT(0 != rv);        fd->secret->md.io_model_committed = PR_TRUE;    }    if (_NT_USE_NB_IO(fd))        return _nt_nonblock_sendto(fd, buf, amount, (struct sockaddr *)addr, addrlen, timeout);    else        return pt_SendTo(osfd, buf, amount, flags, addr, addrlen, timeout);}PRInt32_PR_MD_RECVFROM(PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags,                PRNetAddr *addr, PRUint32 *addrlen, PRIntervalTime timeout){    PRInt32 osfd = fd->secret->md.osfd;    PRInt32 rv;    if (!fd->secret->md.io_model_committed) {        rv = _md_MakeNonblock((HANDLE)osfd);        PR_ASSERT(0 != rv);        fd->secret->md.io_model_committed = PR_TRUE;    }    if (_NT_USE_NB_IO(fd))        return _nt_nonblock_recvfrom(fd, buf, amount, (struct sockaddr *)addr, addrlen, timeout);    else        return pt_RecvFrom(osfd, buf, amount, flags, addr, addrlen, timeout);}/* XXXMB - for now this is a sockets call only */PRInt32_PR_MD_WRITEV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 iov_size, PRIntervalTime timeout){    PRInt32 osfd = fd->secret->md.osfd;    int index;    int sent = 0;    int rv;    if (_NT_USE_NB_IO(fd)) {        if (!fd->secret->md.io_model_committed) {            rv = _md_MakeNonblock((HANDLE)osfd);            PR_ASSERT(0 != rv);            fd->secret->md.io_model_committed = PR_TRUE;        }        return _nt_nonblock_writev(fd, iov, iov_size, timeout);    }    for (index=0; index<iov_size; index++) {        rv = _PR_MD_SEND(fd, iov[index].iov_base, iov[index].iov_len, 0,						timeout);        if (rv > 0)             sent += rv;        if ( rv != iov[index].iov_len ) {            if (sent <= 0)                return -1;            return -1;        }    }    return sent;}PRInt32_PR_MD_LISTEN(PRFileDesc *fd, PRIntn backlog){    PRInt32 rv;    rv = listen(fd->secret->md.osfd, backlog);	if (rv < 0)		_PR_MD_MAP_LISTEN_ERROR(WSAGetLastError());	return(rv);}PRInt32_PR_MD_SHUTDOWN(PRFileDesc *fd, PRIntn how){    PRInt32 rv;    rv = shutdown(fd->secret->md.osfd, how);	if (rv < 0)		_PR_MD_MAP_SHUTDOWN_ERROR(WSAGetLastError());	return(rv);}PRStatus_PR_MD_GETSOCKNAME(PRFileDesc *fd, PRNetAddr *addr, PRUint32 *len){    PRInt32 rv;    rv = getsockname((SOCKET)fd->secret->md.osfd, (struct sockaddr *)addr, len);    if (rv==0)		return PR_SUCCESS;	else {		_PR_MD_MAP_GETSOCKNAME_ERROR(WSAGetLastError());		return PR_FAILURE;	}}PRStatus_PR_MD_GETPEERNAME(PRFileDesc *fd, PRNetAddr *addr, PRUint32 *len){    PRInt32 rv;    /*     * NT has a bug that, when invoked on a socket accepted by     * AcceptEx(), getpeername() returns an all-zero peer address.     * To work around this bug, we store the peer's address (returned     * by AcceptEx()) with the socket fd and use the cached peer     * address if the socket is an accepted socket.     */    if (fd->secret->md.accepted_socket) {        INT seconds;        INT bytes = sizeof(seconds);        /*         * Determine if the socket is connected.         */        rv = getsockopt(fd->secret->md.osfd,                         SOL_SOCKET,                        SO_CONNECT_TIME,                        (char *) &seconds,                        (PINT) &bytes);        if (rv == NO_ERROR) {            if (seconds == 0xffffffff) {                PR_SetError(PR_NOT_CONNECTED_ERROR, 0);                return PR_FAILURE;            }            *len = PR_NETADDR_SIZE(&fd->secret->md.peer_addr);            memcpy(addr, &fd->secret->md.peer_addr, *len);            return PR_SUCCESS;        } else {            _PR_MD_MAP_GETSOCKOPT_ERROR(WSAGetLastError());            return PR_FAILURE;        }    } else {         rv = getpeername((SOCKET)fd->secret->md.osfd,                         (struct sockaddr *) addr, len);        if (rv == 0) {            return PR_SUCCESS;        } else {            _PR_MD_MAP_GETPEERNAME_ERROR(WSAGetLastError());            return PR_FAILURE;        }    }}PRStatus_PR_MD_GETSOCKOPT(PRFileDesc *fd, PRInt32 level, PRInt32 optname, char* optval, PRInt32* optlen){    PRInt32 rv;    rv = getsockopt((SOCKET)fd->secret->md.osfd, level, optname, optval, optlen);    if (rv==0)		return PR_SUCCESS;	else {		_PR_MD_MAP_GETSOCKOPT_ERROR(WSAGetLastError());		return PR_FAILURE;	}}PRStatus_PR_MD_SETSOCKOPT(PRFileDesc *fd, PRInt32 level, PRInt32 optname, const char* optval, PRInt32 optlen){    PRInt32 rv;    rv = setsockopt((SOCKET)fd->secret->md.osfd, level, optname, optval, optlen);    if (rv==0)		return PR_SUCCESS;	else {		_PR_MD_MAP_SETSOCKOPT_ERROR(WSAGetLastError());		return PR_FAILURE;	}}/* --- FILE IO ----------------------------------------------------------- */PRInt32_PR_MD_OPEN(const char *name, PRIntn osflags, PRIntn mode){    HANDLE file;    PRInt32 access = 0;    PRInt32 flags = 0;    PRInt32 flag6 = 0;        if (osflags & PR_SYNC) flag6 = FILE_FLAG_WRITE_THROUGH;     if (osflags & PR_RDONLY || osflags & PR_RDWR) access |= GENERIC_READ;    if (osflags & PR_WRONLY || osflags & PR_RDWR) access |= GENERIC_WRITE;    if ( osflags & PR_CREATE_FILE && osflags & PR_EXCL )        flags = CREATE_NEW;    else if (osflags & PR_CREATE_FILE)        flags = (0 != (osflags & PR_TRUNCATE)) ? CREATE_ALWAYS : OPEN_ALWAYS;    else if (osflags & PR_TRUNCATE) flags = TRUNCATE_EXISTING;    else flags = OPEN_EXISTING;    flag6 |= FILE_FLAG_OVERLAPPED;    file = CreateFile(name,                       access,                       FILE_SHARE_READ|FILE_SHARE_WRITE,                      NULL,                      flags,                       flag6,                      NULL);    if (file == INVALID_HANDLE_VALUE) {        _PR_MD_MAP_OPEN_ERROR(GetLastError());        return -1;    }    if (osflags & PR_APPEND) {        if ( SetFilePointer(file, 0, 0, FILE_END) == 0xFFFFFFFF ) {            _PR_MD_MAP_LSEEK_ERROR(GetLastError());            CloseHandle(file);            return -1;        }    }    return (PRInt32)file;}PRInt32_PR_MD_OPEN_FILE(const char *name, PRIntn osflags, PRIntn mode){    HANDLE file;    PRInt32 access = 0;    PRInt32 flags = 0;    PRInt32 flag6 = 0;    SECURITY_ATTRIBUTES sa;    LPSECURITY_ATTRIBUTES lpSA = NULL;    PSECURITY_DESCRIPTOR pSD = NULL;    PACL pACL = NULL;    if (osflags & PR_SYNC) flag6 = FILE_FLAG_WRITE_THROUGH;     if (osflags & PR_RDONLY || osflags & PR_RDWR) access |= GENERIC_READ;    if (osflags & PR_WRONLY || osflags & PR_RDWR) access |= GENERIC_WRITE;    if ( osflags & PR_CREATE_FILE && osflags & PR_EXCL )        flags = CREATE_NEW;    else if (osflags & PR_CREATE_FILE)        flags = (0 != (osflags & PR_TRUNCATE)) ? CREATE_ALWAYS : OPE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -