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

📄 bnet.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        } else if ((err == EINTR) && (!_PR_PENDING_INTERRUPT(me))){            continue;        } else {            break;        }    }    if (rv < 0) {        _PR_MD_MAP_WRITEV_ERROR(err);    }done:    return(rv);}#endif /* BONE_VERSION */PRInt32_MD_accept (PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen,            PRIntervalTime timeout){    PRInt32 osfd = fd->secret->md.osfd;    PRInt32 rv, err;    PRThread *me = _PR_MD_CURRENT_THREAD();    while ((rv = accept(osfd, (struct sockaddr *) addr,                        (_PRSockLen_t *)addrlen)) == -1) {        err = _MD_ERRNO();        if ((err == EAGAIN) || (err == EWOULDBLOCK)) {            if (fd->secret->nonblocking) {                break;            }            /* If it's SUPPOSED to be a blocking thread, wait             * a while to see if the triggering condition gets             * satisfied.             */            /* Assume that we're always using a native thread */            if ((rv = socket_io_wait(osfd, READ_FD, timeout)) < 0)                goto done;        } else if ((err == EINTR) && (!_PR_PENDING_INTERRUPT(me))) {            continue;        } else {            break;        }    }    if (rv < 0) {        _PR_MD_MAP_ACCEPT_ERROR(err);    } else if (addr != NULL) {        /* bug 134099 */        err = getpeername(rv, (struct sockaddr *) addr, (_PRSockLen_t *)addrlen);    }done:#ifdef _PR_HAVE_SOCKADDR_LEN    if (rv != -1) {        /* Mask off the first byte of struct sockaddr (the length field) */        if (addr) {            addr->raw.family = ((struct sockaddr *) addr)->sa_family;        }    }#endif /* _PR_HAVE_SOCKADDR_LEN */    return(rv);}PRInt32_MD_connect (PRFileDesc *fd, const PRNetAddr *addr, PRUint32 addrlen,             PRIntervalTime timeout){    PRInt32 rv, err;    PRThread *me = _PR_MD_CURRENT_THREAD();    PRInt32 osfd = fd->secret->md.osfd;#ifndef BONE_VERSION    fd->secret->md.connectValueValid = PR_FALSE;#endif#ifdef _PR_HAVE_SOCKADDR_LEN    PRNetAddr addrCopy;    addrCopy = *addr;    ((struct sockaddr *) &addrCopy)->sa_len = addrlen;    ((struct sockaddr *) &addrCopy)->sa_family = addr->raw.family;#endif    /* (Copied from unix.c)     * We initiate the connection setup by making a nonblocking connect()     * call.  If the connect() call fails, there are two cases we handle     * specially:     * 1. The connect() call was interrupted by a signal.  In this case     *    we simply retry connect().     * 2. The NSPR socket is nonblocking and connect() fails with     *    EINPROGRESS.  We first wait until the socket becomes writable.     *    Then we try to find out whether the connection setup succeeded     *    or failed.     */retry:#ifdef _PR_HAVE_SOCKADDR_LEN    if ((rv = connect(osfd, (struct sockaddr *)&addrCopy, addrlen)) == -1) {#else    if ((rv = connect(osfd, (struct sockaddr *)addr, addrlen)) == -1) {#endif        err = _MD_ERRNO();#ifndef BONE_VERSION        fd->secret->md.connectReturnValue = rv;        fd->secret->md.connectReturnError = err;        fd->secret->md.connectValueValid = PR_TRUE;#endif        if( err == EINTR ) {            if( _PR_PENDING_INTERRUPT(me)) {                me->flags &= ~_PR_INTERRUPT;                PR_SetError( PR_PENDING_INTERRUPT_ERROR, 0);                return -1;            }#ifndef BONE_VERSION            snooze( 100000L );#endif            goto retry;        }#ifndef BONE_VERSION        if(!fd->secret->nonblocking && ((err == EINPROGRESS) || (err==EAGAIN) || (err==EALREADY))) {            /*            ** There's no timeout on this connect, but that's not            ** a big deal, since the connect times out anyways            ** after 30 seconds.   Just sleep for 1/10th of a second            ** and retry until we go through or die.            */            if( _PR_PENDING_INTERRUPT(me)) {                me->flags &= ~_PR_INTERRUPT;                PR_SetError( PR_PENDING_INTERRUPT_ERROR, 0);                return -1;            }            goto retry;        }        if( fd->secret->nonblocking && ((err == EAGAIN) || (err == EINPROGRESS))) {            PR_Lock(_connectLock);            if (connectCount < sizeof(connectList)/sizeof(connectList[0])) {                connectList[connectCount].osfd = osfd;                memcpy(&connectList[connectCount].addr, addr, addrlen);                connectList[connectCount].addrlen = addrlen;                connectList[connectCount].timeout = timeout;                connectCount++;                PR_Unlock(_connectLock);                _PR_MD_MAP_CONNECT_ERROR(err);            } else {                PR_Unlock(_connectLock);                PR_SetError(PR_INSUFFICIENT_RESOURCES_ERROR, 0);            }            return rv;        }#else /* BONE_VERSION */        if(!fd->secret->nonblocking && (err == EINTR)) {            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_beos_get_nonblocking_connect_error(osfd);            if (err != 0) {                _PR_MD_MAP_CONNECT_ERROR(err);                return -1;            }            return 0;        }#endif        _PR_MD_MAP_CONNECT_ERROR(err);    }    return rv;}PRInt32_MD_bind (PRFileDesc *fd, const PRNetAddr *addr, PRUint32 addrlen){    PRInt32 rv, err;#ifdef _PR_HAVE_SOCKADDR_LEN    PRNetAddr addrCopy;    addrCopy = *addr;    ((struct sockaddr *) &addrCopy)->sa_len = addrlen;    ((struct sockaddr *) &addrCopy)->sa_family = addr->raw.family;    rv = bind(fd->secret->md.osfd, (struct sockaddr *) &addrCopy, (int )addrlen);#else    rv = bind(fd->secret->md.osfd, (struct sockaddr *) addr, (int )addrlen);#endif    if (rv < 0) {        err = _MD_ERRNO();        _PR_MD_MAP_BIND_ERROR(err);    }    return(rv);}PRInt32_MD_listen (PRFileDesc *fd, PRIntn backlog){    PRInt32 rv, err;#ifndef BONE_VERSION    /* Bug workaround!  Setting listen to 0 on Be accepts no connections.    ** On most UN*Xes this sets the default.    */    if( backlog == 0 ) backlog = 5;#endif    rv = listen(fd->secret->md.osfd, backlog);    if (rv < 0) {        err = _MD_ERRNO();        _PR_MD_MAP_LISTEN_ERROR(err);    }    return(rv);}PRInt32_MD_shutdown (PRFileDesc *fd, PRIntn how){    PRInt32 rv, err;#ifndef BONE_VERSION    if (how == PR_SHUTDOWN_SEND)        fd->secret->md.sock_state = BE_SOCK_SHUTDOWN_WRITE;    else if (how == PR_SHUTDOWN_RCV)        fd->secret->md.sock_state = BE_SOCK_SHUTDOWN_READ;    else if (how == PR_SHUTDOWN_BOTH) {        fd->secret->md.sock_state = (BE_SOCK_SHUTDOWN_WRITE | BE_SOCK_SHUTDOWN_READ);    }    return 0;#else /* BONE_VERSION */    rv = shutdown(fd->secret->md.osfd, how);    if (rv < 0) {        err = _MD_ERRNO();        _PR_MD_MAP_SHUTDOWN_ERROR(err);    }    return(rv);#endif}PRInt32_MD_socketpair (int af, int type, int flags, PRInt32 *osfd){    return PR_NOT_IMPLEMENTED_ERROR;}PRInt32_MD_close_socket (PRInt32 osfd){#ifdef BONE_VERSION    close( osfd );#else    closesocket( osfd );#endif}PRStatus_MD_getsockname (PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen){    PRInt32 rv, err;    rv = getsockname(fd->secret->md.osfd,                     (struct sockaddr *) addr, (_PRSockLen_t *)addrlen);#ifdef _PR_HAVE_SOCKADDR_LEN    if (rv == 0) {        /* ignore the sa_len field of struct sockaddr */        if (addr) {            addr->raw.family = ((struct sockaddr *) addr)->sa_family;        }    }#endif /* _PR_HAVE_SOCKADDR_LEN */    if (rv < 0) {        err = _MD_ERRNO();        _PR_MD_MAP_GETSOCKNAME_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}PRStatus_MD_getpeername (PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen){    PRInt32 rv, err;    rv = getpeername(fd->secret->md.osfd,                     (struct sockaddr *) addr, (_PRSockLen_t *)addrlen);    if (rv < 0) {        err = _MD_ERRNO();        _PR_MD_MAP_GETPEERNAME_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}PRStatus_MD_getsockopt (PRFileDesc *fd, PRInt32 level,                PRInt32 optname, char* optval, PRInt32* optlen){    PRInt32 rv, err;    rv = getsockopt(fd->secret->md.osfd, level, optname,                    optval, (_PRSockLen_t *)optlen);    if (rv < 0) {        err = _MD_ERRNO();        _PR_MD_MAP_GETSOCKOPT_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}PRStatus_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 = _MD_ERRNO();        _PR_MD_MAP_SETSOCKOPT_ERROR(err);    }    return rv==0?PR_SUCCESS:PR_FAILURE;}PRInt32_MD_accept_read (PRFileDesc *sd, PRInt32 *newSock, PRNetAddr **raddr,                 void *buf, PRInt32 amount, PRIntervalTime timeout){    return PR_NOT_IMPLEMENTED_ERROR;}#ifndef BONE_VERSIONPRInt32_MD_socket (int af, int type, int flags){    PRInt32 osfd, err;    osfd = socket( af, type, 0 );    if( -1 == osfd ) {        err = _MD_ERRNO();        _PR_MD_MAP_SOCKET_ERROR( err );    }    return( osfd );}#elsePRInt32_MD_socket(PRInt32 domain, PRInt32 type, PRInt32 proto){    PRInt32 osfd, err;    osfd = socket(domain, type, proto);    if (osfd == -1) {        err = _MD_ERRNO();        _PR_MD_MAP_SOCKET_ERROR(err);    }    return(osfd);}#endifPRInt32_MD_socketavailable (PRFileDesc *fd){#ifdef BONE_VERSION    PRInt32 result;    if (ioctl(fd->secret->md.osfd, FIONREAD, &result) < 0) {        _PR_MD_MAP_SOCKETAVAILABLE_ERROR(_MD_ERRNO());        return -1;    }    return result;#else    return PR_NOT_IMPLEMENTED_ERROR;#endif}PRInt32_MD_get_socket_error (void){    return PR_NOT_IMPLEMENTED_ERROR;}PRStatus_MD_gethostname (char *name, PRUint32 namelen){    PRInt32 rv, err;    rv = gethostname(name, namelen);    if (rv == 0)    {        err = _MD_ERRNO();        _PR_MD_MAP_GETHOSTNAME_ERROR(err);        return PR_FAILURE;    }    return PR_SUCCESS;}#ifndef BONE_VERSIONPRInt32_MD_beos_get_nonblocking_connect_error(PRFileDesc *fd){    int rv;    int flags = 0;    rv = recv(fd->secret->md.osfd, NULL, 0, flags);    PR_ASSERT(-1 == rv || 0 == rv);    if (-1 == rv && errno != EAGAIN && errno != EWOULDBLOCK) {        return errno;    }    return 0;  /* no error */}#elsePRInt32_MD_beos_get_nonblocking_connect_error(int osfd){    return PR_NOT_IMPLEMENTED_ERROR;    //    int err;    //    _PRSockLen_t optlen = sizeof(err);    //    if (getsockopt(osfd, SOL_SOCKET, SO_ERROR, (char *) &err, &optlen) == -1) {    //        return errno;    //    } else {    //        return err;    //    }}#endif /* BONE_VERSION */

⌨️ 快捷键说明

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