diff options
author | wtc%netscape.com <devnull@localhost> | 1999-03-30 01:37:52 +0000 |
---|---|---|
committer | wtc%netscape.com <devnull@localhost> | 1999-03-30 01:37:52 +0000 |
commit | 48b33edc1082b08a031c205da4c7b61e4c3865e8 (patch) | |
tree | 51758898ab7e2af973aa60a2811824fec4a8d3d3 | |
parent | e4f0e27c9cdccf31f60d0c17556ba512cceefeb7 (diff) | |
download | nspr-hg-48b33edc1082b08a031c205da4c7b61e4c3865e8.tar.gz |
Defined a new IOMethods table to implement PR_CreateSocketPollFd and
PR_DestroySocketPollFd.
-rw-r--r-- | pr/src/io/prsocket.c | 75 | ||||
-rw-r--r-- | pr/src/pthreads/ptio.c | 71 |
2 files changed, 146 insertions, 0 deletions
diff --git a/pr/src/io/prsocket.c b/pr/src/io/prsocket.c index 9b8f73fc..43395aaa 100644 --- a/pr/src/io/prsocket.c +++ b/pr/src/io/prsocket.c @@ -189,6 +189,41 @@ PRFileDesc *fd; return(fd); } + +static const PRIOMethods* PR_GetSocketPollFdMethods(); + +PR_IMPLEMENT(PRFileDesc*) PR_CreateSocketPollFd(PRInt32 osfd) +{ + PRFileDesc *fd; + + if (!_pr_initialized) _PR_ImplicitInitialization(); + + fd = _PR_Getfd(); + + if (fd == NULL) PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); + else + { + fd->secret->md.osfd = osfd; + fd->secret->inheritable = PR_FALSE; + fd->secret->state = _PR_FILEDESC_OPEN; + fd->methods = PR_GetSocketPollFdMethods(); + } + + return fd; +} /* PR_CreateSocketPollFD */ + +PR_IMPLEMENT(PRStatus) PR_DestroySocketPollFd(PRFileDesc *fd) +{ + if (NULL == fd) + { + PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); + return PR_FAILURE; + } + fd->secret->state = _PR_FILEDESC_CLOSED; + _PR_Putfd(fd); + return PR_SUCCESS; +} /* PR_DestroySocketPollFd */ + static PRStatus PR_CALLBACK SocketConnect( PRFileDesc *fd, const PRNetAddr *addr, PRIntervalTime timeout) { @@ -1085,6 +1120,40 @@ static PRIOMethods udpMethods = { _PR_SocketSetSocketOption }; + +static PRIOMethods socketpollfdMethods = { + PR_DESC_SOCKET_POLL, + (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, + (PRGetsockoptFN)_PR_InvalidStatus, + (PRSetsockoptFN)_PR_InvalidStatus, + (PRGetsocketoptionFN)_PR_InvalidStatus, + (PRSetsocketoptionFN)_PR_InvalidStatus +}; + PR_IMPLEMENT(const PRIOMethods*) PR_GetTCPMethods() { return &tcpMethods; @@ -1095,6 +1164,12 @@ PR_IMPLEMENT(const PRIOMethods*) PR_GetUDPMethods() return &udpMethods; } +static const PRIOMethods* PR_GetSocketPollFdMethods() +{ + return &socketpollfdMethods; +} /* PR_GetUDPMethods */ + + PR_IMPLEMENT(PRFileDesc*) PR_Socket(PRInt32 domain, PRInt32 type, PRInt32 proto) { PRInt32 osfd; diff --git a/pr/src/pthreads/ptio.c b/pr/src/pthreads/ptio.c index b57ecea6..8972834a 100644 --- a/pr/src/pthreads/ptio.c +++ b/pr/src/pthreads/ptio.c @@ -2739,6 +2739,40 @@ static PRIOMethods _pr_udp_methods = { pt_SetSocketOption }; + +static PRIOMethods _pr_socketpollfd_methods = { + PR_DESC_SOCKET_POLL, + (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, + pt_Poll, + (PRAcceptreadFN)_PR_InvalidInt, + (PRTransmitfileFN)_PR_InvalidInt, + (PRGetsocknameFN)_PR_InvalidStatus, + (PRGetpeernameFN)_PR_InvalidStatus, + (PRGetsockoptFN)_PR_InvalidStatus, + (PRSetsockoptFN)_PR_InvalidStatus, + (PRGetsocketoptionFN)_PR_InvalidStatus, + (PRSetsocketoptionFN)_PR_InvalidStatus +}; + #if defined(_PR_FCNTL_FLAGS) #undef _PR_FCNTL_FLAGS #endif @@ -2805,6 +2839,11 @@ PR_IMPLEMENT(const PRIOMethods*) PR_GetUDPMethods() return &_pr_udp_methods; } /* PR_GetUDPMethods */ +static const PRIOMethods* PR_GetSocketPollFdMethods() +{ + return &_pr_socketpollfd_methods; +} /* PR_GetUDPMethods */ + PR_IMPLEMENT(PRFileDesc*) PR_AllocFileDesc( PRInt32 osfd, const PRIOMethods *methods) { @@ -3525,6 +3564,38 @@ PR_IMPLEMENT(PRFileDesc*) PR_ImportUDPSocket(PRInt32 osfd) return fd; } /* PR_ImportUDPSocket */ +PR_IMPLEMENT(PRFileDesc*) PR_CreateSocketPollFd(PRInt32 osfd) +{ + PRFileDesc *fd; + + if (!_pr_initialized) _PR_ImplicitInitialization(); + + fd = _PR_Getfd(); + + if (fd == NULL) PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); + else + { + fd->secret->md.osfd = osfd; + fd->secret->inheritable = PR_FALSE; + fd->secret->state = _PR_FILEDESC_OPEN; + fd->methods = PR_GetSocketPollFdMethods(); + } + + return fd; +} /* PR_CreateSocketPollFD */ + +PR_IMPLEMENT(PRStatus) PR_DestroySocketPollFd(PRFileDesc *fd) +{ + if (NULL == fd) + { + PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); + return PR_FAILURE; + } + fd->secret->state = _PR_FILEDESC_CLOSED; + _PR_Putfd(fd); + return PR_SUCCESS; +} /* PR_DestroySocketPollFd */ + PR_IMPLEMENT(PRInt32) PR_FileDesc2NativeHandle(PRFileDesc *bottom) { PRInt32 osfd = -1; |