📄 prsocket.c
字号:
raddr = &raddrCopy; } rv = _PR_MD_FAST_ACCEPT_READ(sd, &newSock, raddr, buf, amount, timeout, PR_TRUE, NULL, NULL); if (rv < 0) { rv = -1; } else { /* Successfully accepted and read; create the new PRFileDesc */ *nd = PR_AllocFileDesc(newSock, PR_GetTCPMethods()); if (*nd == 0) { _PR_MD_CLOSE_SOCKET(newSock); /* PR_AllocFileDesc() has invoked PR_SetError(). */ rv = -1; } else { (*nd)->secret->md.io_model_committed = PR_TRUE; (*nd)->secret->md.accepted_socket = PR_TRUE; memcpy(&(*nd)->secret->md.peer_addr, *raddr, PR_NETADDR_SIZE(*raddr));#ifdef _PR_INET6 if (AF_INET6 == *raddr->raw.family) *raddr->raw.family = PR_AF_INET6;#endif } } return rv;}PR_IMPLEMENT(PRInt32) PR_NTFast_AcceptRead_WithTimeoutCallback(PRFileDesc *sd, PRFileDesc **nd, PRNetAddr **raddr, void *buf, PRInt32 amount,PRIntervalTime timeout,_PR_AcceptTimeoutCallback callback,void *callbackArg){ PRInt32 rv; PRInt32 newSock; PRThread *me = _PR_MD_CURRENT_THREAD(); PRNetAddr *raddrCopy; if (_PR_PENDING_INTERRUPT(me)) { me->flags &= ~_PR_INTERRUPT; PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); return -1; } if (_PR_IO_PENDING(me)) { PR_SetError(PR_IO_PENDING_ERROR, 0); return -1; } *nd = NULL; if (raddr == NULL) { raddr = &raddrCopy; } rv = _PR_MD_FAST_ACCEPT_READ(sd, &newSock, raddr, buf, amount, timeout, PR_TRUE, callback, callbackArg); if (rv < 0) { rv = -1; } else { /* Successfully accepted and read; create the new PRFileDesc */ *nd = PR_AllocFileDesc(newSock, PR_GetTCPMethods()); if (*nd == 0) { _PR_MD_CLOSE_SOCKET(newSock); /* PR_AllocFileDesc() has invoked PR_SetError(). */ rv = -1; } else { (*nd)->secret->md.io_model_committed = PR_TRUE; (*nd)->secret->md.accepted_socket = PR_TRUE; memcpy(&(*nd)->secret->md.peer_addr, *raddr, PR_NETADDR_SIZE(*raddr));#ifdef _PR_INET6 if (AF_INET6 == *raddr->raw.family) *raddr->raw.family = PR_AF_INET6;#endif } } return rv;}#endif /* WINNT */#ifdef WINNTPR_IMPLEMENT(void)PR_NTFast_UpdateAcceptContext(PRFileDesc *socket, PRFileDesc *acceptSocket){ _PR_MD_UPDATE_ACCEPT_CONTEXT( socket->secret->md.osfd, acceptSocket->secret->md.osfd);}#endif /* WINNT */static PRInt32 PR_CALLBACK SocketSendFile( PRFileDesc *sd, PRSendFileData *sfd, PRTransmitFileFlags flags, PRIntervalTime timeout){ PRInt32 rv; PRThread *me = _PR_MD_CURRENT_THREAD(); if (_PR_PENDING_INTERRUPT(me)) { me->flags &= ~_PR_INTERRUPT; PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); return -1; } if (_PR_IO_PENDING(me)) { PR_SetError(PR_IO_PENDING_ERROR, 0); return -1; } /* The socket must be in blocking mode. */ if (sd->secret->nonblocking) { PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); return -1; }#if defined(WINNT) rv = _PR_MD_SENDFILE(sd, sfd, flags, timeout); if ((rv >= 0) && (flags == PR_TRANSMITFILE_CLOSE_SOCKET)) { /* * This should be kept the same as SocketClose, except * that _PR_MD_CLOSE_SOCKET(sd->secret->md.osfd) should * not be called because the socket will be recycled. */ PR_FreeFileDesc(sd); }#else rv = PR_EmulateSendFile(sd, sfd, flags, timeout);#endif /* WINNT */ return rv;}static PRInt32 PR_CALLBACK SocketTransmitFile(PRFileDesc *sd, PRFileDesc *fd, const void *headers, PRInt32 hlen, PRTransmitFileFlags flags,PRIntervalTime timeout){ PRSendFileData sfd; sfd.fd = fd; sfd.file_offset = 0; sfd.file_nbytes = 0; sfd.header = headers; sfd.hlen = hlen; sfd.trailer = NULL; sfd.tlen = 0; return(SocketSendFile(sd, &sfd, flags, timeout));}static PRStatus PR_CALLBACK SocketGetName(PRFileDesc *fd, PRNetAddr *addr){ PRInt32 result; PRUint32 addrlen; addrlen = sizeof(PRNetAddr); result = _PR_MD_GETSOCKNAME(fd, addr, &addrlen); if (result < 0) { return PR_FAILURE; }#ifdef _PR_INET6 if (AF_INET6 == addr->raw.family) addr->raw.family = PR_AF_INET6;#endif PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); PR_ASSERT(IsValidNetAddrLen(addr, addrlen) == PR_TRUE); return PR_SUCCESS;}static PRStatus PR_CALLBACK SocketGetPeerName(PRFileDesc *fd, PRNetAddr *addr){ PRInt32 result; PRUint32 addrlen; addrlen = sizeof(PRNetAddr); result = _PR_MD_GETPEERNAME(fd, addr, &addrlen); if (result < 0) { return PR_FAILURE; }#ifdef _PR_INET6 if (AF_INET6 == addr->raw.family) addr->raw.family = PR_AF_INET6;#endif PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); PR_ASSERT(IsValidNetAddrLen(addr, addrlen) == PR_TRUE); return PR_SUCCESS;}static PRInt16 PR_CALLBACK SocketPoll( PRFileDesc *fd, PRInt16 in_flags, PRInt16 *out_flags){#ifdef XP_MAC#pragma unused( fd, in_flags )#endif *out_flags = 0; return in_flags;} /* SocketPoll */static PRIOMethods tcpMethods = { PR_DESC_SOCKET_TCP, SocketClose, SocketRead, SocketWrite, SocketAvailable, SocketAvailable64, SocketSync, (PRSeekFN)_PR_InvalidInt, (PRSeek64FN)_PR_InvalidInt64, (PRFileInfoFN)_PR_InvalidStatus, (PRFileInfo64FN)_PR_InvalidStatus, SocketWritev, SocketConnect, SocketAccept, SocketBind, SocketListen, SocketShutdown, SocketRecv, SocketSend, (PRRecvfromFN)_PR_InvalidInt, (PRSendtoFN)_PR_InvalidInt, SocketPoll, SocketAcceptRead, SocketTransmitFile, SocketGetName, SocketGetPeerName, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, _PR_SocketGetSocketOption, _PR_SocketSetSocketOption, SocketSendFile, SocketConnectContinue, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt};static PRIOMethods udpMethods = { PR_DESC_SOCKET_UDP, SocketClose, SocketRead, SocketWrite, SocketAvailable, SocketAvailable64, SocketSync, (PRSeekFN)_PR_InvalidInt, (PRSeek64FN)_PR_InvalidInt64, (PRFileInfoFN)_PR_InvalidStatus, (PRFileInfo64FN)_PR_InvalidStatus, SocketWritev, SocketConnect, (PRAcceptFN)_PR_InvalidDesc, SocketBind, SocketListen, SocketShutdown, SocketRecv, SocketSend, SocketRecvFrom, SocketSendTo, SocketPoll, (PRAcceptreadFN)_PR_InvalidInt, (PRTransmitfileFN)_PR_InvalidInt, SocketGetName, SocketGetPeerName, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, _PR_SocketGetSocketOption, _PR_SocketSetSocketOption, (PRSendfileFN)_PR_InvalidInt, (PRConnectcontinueFN)_PR_InvalidStatus, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt};static PRIOMethods socketpollfdMethods = { (PRDescType) 0, (PRCloseFN)_PR_InvalidStatus, (PRReadFN)_PR_InvalidInt, (PRWriteFN)_PR_InvalidInt, (PRAvailableFN)_PR_InvalidInt, (PRAvailable64FN)_PR_InvalidInt64, (PRFsyncFN)_PR_InvalidStatus, (PRSeekFN)_PR_InvalidInt, (PRSeek64FN)_PR_InvalidInt64, (PRFileInfoFN)_PR_InvalidStatus, (PRFileInfo64FN)_PR_InvalidStatus, (PRWritevFN)_PR_InvalidInt, (PRConnectFN)_PR_InvalidStatus, (PRAcceptFN)_PR_InvalidDesc, (PRBindFN)_PR_InvalidStatus, (PRListenFN)_PR_InvalidStatus, (PRShutdownFN)_PR_InvalidStatus, (PRRecvFN)_PR_InvalidInt, (PRSendFN)_PR_InvalidInt, (PRRecvfromFN)_PR_InvalidInt, (PRSendtoFN)_PR_InvalidInt, SocketPoll, (PRAcceptreadFN)_PR_InvalidInt, (PRTransmitfileFN)_PR_InvalidInt, (PRGetsocknameFN)_PR_InvalidStatus, (PRGetpeernameFN)_PR_InvalidStatus, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, (PRGetsocketoptionFN)_PR_InvalidStatus, (PRSetsocketoptionFN)_PR_InvalidStatus, (PRSendfileFN)_PR_InvalidInt, (PRConnectcontinueFN)_PR_InvalidStatus, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt, (PRReservedFN)_PR_InvalidInt};PR_IMPLEMENT(const PRIOMethods*) PR_GetTCPMethods(){ return &tcpMethods;}PR_IMPLEMENT(const PRIOMethods*) PR_GetUDPMethods(){ return &udpMethods;}static const PRIOMethods* PR_GetSocketPollFdMethods(){ return &socketpollfdMethods;} /* PR_GetSocketPollFdMethods */#if !defined(_PR_INET6) || defined(_PR_INET6_PROBE)PR_EXTERN(PRStatus) _pr_push_ipv6toipv4_layer(PRFileDesc *fd);#if defined(_PR_INET6_PROBE)PR_EXTERN(PRBool) _pr_ipv6_is_present;PR_IMPLEMENT(PRBool) _pr_test_ipv6_socket(){PRInt32 osfd; osfd = _PR_MD_SOCKET(AF_INET6, SOCK_STREAM, 0); if (osfd != -1) { _PR_MD_CLOSE_SOCKET(osfd); return PR_TRUE; } return PR_FALSE;}#endif /* _PR_INET6_PROBE */#endifPR_IMPLEMENT(PRFileDesc*) PR_Socket(PRInt32 domain, PRInt32 type, PRInt32 proto){ PRInt32 osfd; PRFileDesc *fd; PRInt32 tmp_domain = domain; if (!_pr_initialized) _PR_ImplicitInitialization(); if (PR_AF_INET != domain && PR_AF_INET6 != domain#if defined(XP_UNIX) && PR_AF_LOCAL != domain#endif ) { PR_SetError(PR_ADDRESS_NOT_SUPPORTED_ERROR, 0); return NULL; }#if defined(_PR_INET6_PROBE) if (PR_AF_INET6 == domain) { if (_pr_ipv6_is_present == PR_FALSE) domain = AF_INET; else domain = AF_INET6; }#elif defined(_PR_INET6) if (PR_AF_INET6 == domain) domain = AF_INET6;#else if (PR_AF_INET6 == domain) domain = AF_INET;#endif /* _PR_INET6 */ osfd = _PR_MD_SOCKET(domain, type, proto); if (osfd == -1) { return 0; } if (type == SOCK_STREAM) fd = PR_AllocFileDesc(osfd, PR_GetTCPMethods()); else fd = PR_AllocFileDesc(osfd, PR_GetUDPMethods()); /* * Make the sockets non-blocking */ if (fd != NULL) { _PR_MD_MAKE_NONBLOCK(fd); _PR_MD_INIT_FD_INHERITABLE(fd, PR_FALSE);#if defined(_PR_INET6_PROBE) || !defined(_PR_INET6) /* * For platforms with no support for IPv6 * create layered socket for IPv4-mapped IPv6 addresses */ if (PR_AF_INET6 == tmp_domain && PR_AF_INET == domain) { if (PR_FAILURE == _pr_push_ipv6toipv4_layer(fd)) { PR_Close(fd); fd = NULL; } }#endif } else _PR_MD_CLOSE_SOCKET(osfd); return fd;}PR_IMPLEMENT(PRFileDesc *) PR_NewTCPSocket(void){ PRInt32 domain = AF_INET; return PR_Socket(domain, SOCK_STREAM, 0);}PR_IMPLEMENT(PRFileDesc*) PR_NewUDPSocket(void){ PRInt32 domain = AF_INET; return PR_Socket(domain, SOCK_DGRAM, 0);}PR_IMPLEMENT(PRFileDesc *) PR_OpenTCPSocket(PRIntn af){ return PR_Socket(af, SOCK_STREAM, 0);}PR_IMPLEMENT(PRFileDesc*) PR_OpenUDPSocket(PRIntn af){ return PR_Socket(af, SOCK_DGRAM, 0);}PR_IMPLEMENT(PRStatus) PR_NewTCPSocketPair(PRFileDesc *f[]){#ifdef XP_UNIX PRInt32 rv, osfd[2]; if (!_pr_initialized) _PR_ImplicitInitialization(); rv = _PR_MD_SOCKETPAIR(AF_UNIX, SOCK_STREAM, 0, osfd); if (rv == -1) { return PR_FAILURE; } f[0] = PR_AllocFileDesc(osfd[0], PR_GetTCPMethods()); if (!f[0]) { _PR_MD_CLOSE_SOCKET(osfd[0]); _PR_MD_CLOSE_SOCKET(osfd[1]); /* PR_AllocFileDesc() has invoked PR_SetError(). */ return PR_FAILURE; } f[1] = PR_AllocFileDesc(osfd[1], PR_GetTCPMethods()); if (!f[1]) { PR_Close(f[0]); _PR_MD_CLOSE_SOCKET(osfd[1]); /* PR_AllocFileDesc() has invoked PR_SetError(). */ return PR_FAILURE; } _PR_MD_MAKE_NONBLOCK(f[0]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -