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

📄 os2sock.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 2 页
字号:
            rv = socket_io_wait(osfd, WRITE_FD, timeout);            if (rv == -1) {                return -1;            }            PR_ASSERT(rv == 1);            if (_PR_PENDING_INTERRUPT(me)) {                me->flags &= ~_PR_INTERRUPT;                PR_SetError( PR_PENDING_INTERRUPT_ERROR, 0);                return -1;            }            err = _MD_os2_get_nonblocking_connect_error(osfd);            if (err != 0) {                _PR_MD_MAP_CONNECT_ERROR(err);                return -1;            }            return 0;        }                _PR_MD_MAP_CONNECT_ERROR(err);    }    return rv;}  /* _MD_connect */PRInt32_PR_MD_BIND(PRFileDesc *fd, const PRNetAddr *addr, PRUint32 addrlen){    PRInt32 rv, err;    rv = bind(fd->secret->md.osfd, (struct sockaddr *) addr, (int )addrlen);    if (rv < 0) {        err = sock_errno();        _PR_MD_MAP_BIND_ERROR(err);    }    return(rv);}PRInt32_PR_MD_LISTEN(PRFileDesc *fd, PRIntn backlog){    PRInt32 rv, err;    rv = listen(fd->secret->md.osfd, backlog);    if (rv < 0)  {        err = sock_errno();        _PR_MD_MAP_DEFAULT_ERROR(err);    }    return(rv);}PRInt32_PR_MD_RECV(PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags,             PRIntervalTime timeout){    PRInt32 osfd = fd->secret->md.osfd;    PRInt32 rv, err;    PRThread *me = _PR_MD_CURRENT_THREAD();    while ((rv = recv(osfd,buf,amount,flags)) == -1)    {        err = sock_errno();        if ((err == SOCEWOULDBLOCK)) {            if (fd->secret->nonblocking) {                break;            }            if ((rv = socket_io_wait(osfd, READ_FD, timeout)) < 0)                goto done;        } else if ((err == SOCEINTR) && (!_PR_PENDING_INTERRUPT(me))){            continue;        } else {            break;        }    }    if (rv < 0) {        _PR_MD_MAP_RECV_ERROR(err);    }done:    return(rv);}PRInt32_PR_MD_SEND(PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags,            PRIntervalTime timeout){    PRInt32 osfd = fd->secret->md.osfd;    PRInt32 rv, err;    PRThread *me = _PR_MD_CURRENT_THREAD();    while ((rv = send(osfd,buf,amount,flags)) == -1)    {        err = sock_errno();        if ((err == SOCEWOULDBLOCK)) {            if (fd->secret->nonblocking) {                break;            }            if ((rv = socket_io_wait(osfd, WRITE_FD, timeout)) < 0)                goto done;        } else if ((err == SOCEINTR) && (!_PR_PENDING_INTERRUPT(me))){            continue;        } else {            break;        }    }     /*      * optimization; if bytes sent is less than "amount" call      * select before returning. This is because it is likely that      * the next send() call will return EWOULDBLOCK.      */    if ((!fd->secret->nonblocking) && (rv > 0) && (rv < amount)        && (timeout != PR_INTERVAL_NO_WAIT))    {        if (socket_io_wait(osfd, WRITE_FD, timeout)< 0) {            rv = -1;            goto done;        }    }    if (rv < 0) {        _PR_MD_MAP_SEND_ERROR(err);    }done:    return(rv);}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, err;    PRThread *me = _PR_MD_CURRENT_THREAD();    while ((rv = sendto(osfd, buf, amount, flags,           (struct sockaddr *) addr, addrlen)) == -1)    {        err = sock_errno();        if ((err == SOCEWOULDBLOCK))        {            if (fd->secret->nonblocking) {                break;            }            if ((rv = socket_io_wait(osfd, WRITE_FD, timeout)) < 0)                goto done;        } else if ((err == EINTR) && (!_PR_PENDING_INTERRUPT(me))){            continue;        } else {            break;        }    }    if (rv < 0) {        _PR_MD_MAP_SENDTO_ERROR(err);    }done:    return(rv);}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, err;    PRThread *me = _PR_MD_CURRENT_THREAD();    while( (*addrlen = PR_NETADDR_SIZE(addr)),           ((rv = recvfrom(osfd, buf, amount, flags,             (struct sockaddr *) addr, (int *)addrlen)) == -1))    {        err = sock_errno();        if ((err == SOCEWOULDBLOCK)) {            if (fd->secret->nonblocking) {                break;            }            if ((rv = socket_io_wait(osfd, READ_FD, timeout)) < 0)                goto done;        } else if ((err == SOCEINTR) && (!_PR_PENDING_INTERRUPT(me))){            continue;        } else {            break;        }    }    if (rv < 0) {        _PR_MD_MAP_RECVFROM_ERROR(err);    }done:    return(rv);}PRInt32_PR_MD_WRITEV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 iov_size,              PRIntervalTime timeout){    PRInt32 rv, err;    PRThread *me = _PR_MD_CURRENT_THREAD();    PRInt32 index, amount = 0;    PRInt32 osfd = fd->secret->md.osfd;     /*      * Calculate the total number of bytes to be sent; needed for      * optimization later.      * We could avoid this if this number was passed in; but it is      * probably not a big deal because iov_size is usually small (less than      * 3)      */    if (!fd->secret->nonblocking) {        for (index=0; index<iov_size; index++) {            amount += iov[index].iov_len;        }    }    while ((rv = writev(osfd, (const struct iovec*)iov, iov_size)) == -1) {        err = sock_errno();        if ((err == SOCEWOULDBLOCK))    {            if (fd->secret->nonblocking) {                break;            }            if ((rv = socket_io_wait(osfd, WRITE_FD, timeout))<0)                goto done;        } else if ((err == EINTR) && (!_PR_PENDING_INTERRUPT(me))){            continue;        } else {            break;        }    }     /*      * optimization; if bytes sent is less than "amount" call      * select before returning. This is because it is likely that      * the next writev() call will return EWOULDBLOCK.      */    if ((!fd->secret->nonblocking) && (rv > 0) && (rv < amount)          && (timeout != PR_INTERVAL_NO_WAIT)) {        if (socket_io_wait(osfd, WRITE_FD, timeout) < 0) {            rv = -1;            goto done;        }    }    if (rv < 0) {        _PR_MD_MAP_WRITEV_ERROR(err);    }done:    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(sock_errno());    return rv;}PRStatus_PR_MD_GETSOCKNAME(PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen){    PRInt32 rv, err;    rv = getsockname(fd->secret->md.osfd,                     (struct sockaddr *) addr, (int *)addrlen);    if (rv < 0) {        err = sock_errno();        _PR_MD_MAP_GETSOCKNAME_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}PRStatus_PR_MD_GETPEERNAME(PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen){    PRInt32 rv, err;    rv = getpeername(fd->secret->md.osfd,                     (struct sockaddr *) addr, (int *)addrlen);    if (rv < 0) {        err = sock_errno();        _PR_MD_MAP_GETPEERNAME_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}PRStatus_PR_MD_GETSOCKOPT(PRFileDesc *fd, PRInt32 level, PRInt32 optname,                  char* optval, PRInt32* optlen){    PRInt32 rv, err;    rv = getsockopt(fd->secret->md.osfd, level, optname, optval, (int *)optlen);    if (rv < 0) {        err = sock_errno();        _PR_MD_MAP_GETSOCKOPT_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}PRStatus_PR_MD_SETSOCKOPT(PRFileDesc *fd, PRInt32 level, PRInt32 optname,                  const char* optval, PRInt32 optlen){    PRInt32 rv, err;    rv = setsockopt(fd->secret->md.osfd, level, optname, optval, optlen);    if (rv < 0) {        err = sock_errno();        _PR_MD_MAP_SETSOCKOPT_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}void_MD_MakeNonblock(PRFileDesc *fd){    PRInt32 osfd = fd->secret->md.osfd;    PRInt32 err;    PRUint32  one = 1;        if (osfd <= 2) {        /* Don't mess around with stdin, stdout or stderr */        return;    }    err = ioctl( osfd, FIONBIO, (char *) &one, sizeof(one));    if ( err != 0 )    {        err = sock_errno();        _PR_MD_MAP_SOCKET_ERROR(err);    }}

⌨️ 快捷键说明

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