tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

pprio.h (8160B)


      1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 /*
      7 ** File:    pprio.h
      8 **
      9 ** Description: Private definitions for I/O related structures
     10 */
     11 
     12 #ifndef pprio_h___
     13 #define pprio_h___
     14 
     15 #include "prtypes.h"
     16 #include "prio.h"
     17 
     18 PR_BEGIN_EXTERN_C
     19 
     20 /************************************************************************/
     21 /************************************************************************/
     22 
     23 #ifdef _WIN64
     24 typedef __int64 PROsfd;
     25 #else
     26 typedef PRInt32 PROsfd;
     27 #endif
     28 
     29 /* Return the method tables for files, tcp sockets and udp sockets */
     30 NSPR_API(const PRIOMethods*)    PR_GetFileMethods(void);
     31 NSPR_API(const PRIOMethods*)    PR_GetTCPMethods(void);
     32 NSPR_API(const PRIOMethods*)    PR_GetUDPMethods(void);
     33 NSPR_API(const PRIOMethods*)    PR_GetPipeMethods(void);
     34 
     35 /*
     36 ** Convert a NSPR socket handle to a native socket handle.
     37 **
     38 ** Using this function makes your code depend on the properties of the
     39 ** current NSPR implementation, which may change (although extremely
     40 ** unlikely because of NSPR's backward compatibility requirement).  Avoid
     41 ** using it if you can.
     42 **
     43 ** If you use this function, you need to understand what NSPR does to
     44 ** the native handle.  For example, NSPR puts native socket handles in
     45 ** non-blocking mode or associates them with an I/O completion port (the
     46 ** WINNT build configuration only).  Your use of the native handle should
     47 ** not interfere with NSPR's use of the native handle.  If your code
     48 ** changes the configuration of the native handle, (e.g., changes it to
     49 ** blocking or closes it), NSPR will not work correctly.
     50 */
     51 NSPR_API(PROsfd)       PR_FileDesc2NativeHandle(PRFileDesc *);
     52 NSPR_API(void)         PR_ChangeFileDescNativeHandle(PRFileDesc *, PROsfd);
     53 NSPR_API(PRFileDesc*)  PR_AllocFileDesc(PROsfd osfd,
     54                                        const PRIOMethods *methods);
     55 NSPR_API(void)         PR_FreeFileDesc(PRFileDesc *fd);
     56 /*
     57 ** Import an existing OS file to NSPR.
     58 */
     59 NSPR_API(PRFileDesc*)  PR_ImportFile(PROsfd osfd);
     60 NSPR_API(PRFileDesc*)  PR_ImportPipe(PROsfd osfd);
     61 NSPR_API(PRFileDesc*)  PR_ImportTCPSocket(PROsfd osfd);
     62 NSPR_API(PRFileDesc*)  PR_ImportUDPSocket(PROsfd osfd);
     63 
     64 
     65 /*
     66 *************************************************************************
     67 * FUNCTION: PR_CreateSocketPollFd
     68 * DESCRIPTION:
     69 *     Create a PRFileDesc wrapper for a native socket handle, for use with
     70 *     PR_Poll only
     71 * INPUTS:
     72 *     None
     73 * OUTPUTS:
     74 *     None
     75 * RETURN: PRFileDesc*
     76 *     Upon successful completion, PR_CreateSocketPollFd returns a pointer
     77 *     to the PRFileDesc created for the native socket handle
     78 *     Returns a NULL pointer if the create of a new PRFileDesc failed
     79 *
     80 **************************************************************************
     81 */
     82 
     83 NSPR_API(PRFileDesc*)   PR_CreateSocketPollFd(PROsfd osfd);
     84 
     85 /*
     86 *************************************************************************
     87 * FUNCTION: PR_DestroySocketPollFd
     88 * DESCRIPTION:
     89 *     Destroy the PRFileDesc wrapper created by PR_CreateSocketPollFd
     90 * INPUTS:
     91 *     None
     92 * OUTPUTS:
     93 *     None
     94 * RETURN: PRFileDesc*
     95 *     Upon successful completion, PR_DestroySocketPollFd returns
     96 *     PR_SUCCESS, else PR_FAILURE
     97 *
     98 **************************************************************************
     99 */
    100 
    101 NSPR_API(PRStatus) PR_DestroySocketPollFd(PRFileDesc *fd);
    102 
    103 
    104 /*
    105 ** Macros for PR_Socket
    106 **
    107 ** Socket types: PR_SOCK_STREAM, PR_SOCK_DGRAM
    108 */
    109 
    110 #ifdef WIN32
    111 
    112 #define PR_SOCK_STREAM 1
    113 #define PR_SOCK_DGRAM 2
    114 
    115 #else /* WIN32 */
    116 
    117 #define PR_SOCK_STREAM SOCK_STREAM
    118 #define PR_SOCK_DGRAM SOCK_DGRAM
    119 
    120 #endif /* WIN32 */
    121 
    122 /*
    123 ** Create a new Socket; this function is obsolete.
    124 */
    125 NSPR_API(PRFileDesc*)   PR_Socket(PRInt32 domain, PRInt32 type, PRInt32 proto);
    126 
    127 /* FUNCTION: PR_LockFile
    128 ** DESCRIPTION:
    129 **    Lock a file for exclusive access.
    130 ** RETURNS:
    131 **    PR_SUCCESS when the lock is held
    132 **    PR_FAILURE otherwise
    133 */
    134 NSPR_API(PRStatus) PR_LockFile(PRFileDesc *fd);
    135 
    136 /* FUNCTION: PR_TLockFile
    137 ** DESCRIPTION:
    138 **    Test and Lock a file for exclusive access.  Do not block if the
    139 **    file cannot be locked immediately.
    140 ** RETURNS:
    141 **    PR_SUCCESS when the lock is held
    142 **    PR_FAILURE otherwise
    143 */
    144 NSPR_API(PRStatus) PR_TLockFile(PRFileDesc *fd);
    145 
    146 /* FUNCTION: PR_UnlockFile
    147 ** DESCRIPTION:
    148 **    Unlock a file which has been previously locked successfully by this
    149 **    process.
    150 ** RETURNS:
    151 **    PR_SUCCESS when the lock is released
    152 **    PR_FAILURE otherwise
    153 */
    154 NSPR_API(PRStatus) PR_UnlockFile(PRFileDesc *fd);
    155 
    156 /*
    157 ** Emulate acceptread by accept and recv.
    158 */
    159 NSPR_API(PRInt32) PR_EmulateAcceptRead(PRFileDesc *sd, PRFileDesc **nd,
    160                                       PRNetAddr **raddr, void *buf, PRInt32 amount, PRIntervalTime timeout);
    161 
    162 /*
    163 ** Emulate sendfile by reading from the file and writing to the socket.
    164 ** The file is memory-mapped if memory-mapped files are supported.
    165 */
    166 NSPR_API(PRInt32) PR_EmulateSendFile(
    167    PRFileDesc *networkSocket, PRSendFileData *sendData,
    168    PRTransmitFileFlags flags, PRIntervalTime timeout);
    169 
    170 #ifdef WIN32
    171 /* FUNCTION: PR_NTFast_AcceptRead
    172 ** DESCRIPTION:
    173 **    NT has the notion of an "accept context", which is only needed in
    174 **    order to make certain calls.  By default, a socket connected via
    175 **    AcceptEx can only do a limited number of things without updating
    176 **    the acceptcontext.  The generic version of PR_AcceptRead always
    177 **    updates the accept context.  This version does not.
    178 **/
    179 NSPR_API(PRInt32) PR_NTFast_AcceptRead(PRFileDesc *sd, PRFileDesc **nd,
    180                                       PRNetAddr **raddr, void *buf, PRInt32 amount, PRIntervalTime t);
    181 
    182 typedef void (*_PR_AcceptTimeoutCallback)(void *);
    183 
    184 /* FUNCTION: PR_NTFast_AcceptRead_WithTimeoutCallback
    185 ** DESCRIPTION:
    186 **    The AcceptEx call combines the accept with the read function.  However,
    187 **    our daemon threads need to be able to wakeup and reliably flush their
    188 **    log buffers if the Accept times out.  However, with the current blocking
    189 **    interface to AcceptRead, there is no way for us to timeout the Accept;
    190 **    this is because when we timeout the Read, we can close the newly
    191 **    socket and continue; but when we timeout the accept itself, there is no
    192 **    new socket to timeout.  So instead, this version of the function is
    193 **    provided.  After the initial timeout period elapses on the accept()
    194 **    portion of the function, it will call the callback routine and then
    195 **    continue the accept.   If the timeout occurs on the read, it will
    196 **    close the connection and return error.
    197 */
    198 NSPR_API(PRInt32) PR_NTFast_AcceptRead_WithTimeoutCallback(
    199    PRFileDesc *sd,
    200    PRFileDesc **nd,
    201    PRNetAddr **raddr,
    202    void *buf,
    203    PRInt32 amount,
    204    PRIntervalTime t,
    205    _PR_AcceptTimeoutCallback callback,
    206    void *callback_arg);
    207 
    208 /* FUNCTION: PR_NTFast_Accept
    209 ** DESCRIPTION:
    210 **    NT has the notion of an "accept context", which is only needed in
    211 **    order to make certain calls.  By default, a socket connected via
    212 **    AcceptEx can only do a limited number of things without updating
    213 **    the acceptcontext.  The generic version of PR_Accept always
    214 **    updates the accept context.  This version does not.
    215 **/
    216 NSPR_API(PRFileDesc*)   PR_NTFast_Accept(PRFileDesc *fd, PRNetAddr *addr,
    217        PRIntervalTime timeout);
    218 
    219 /* FUNCTION: PR_NTFast_Update
    220 ** DESCRIPTION:
    221 **    For sockets accepted with PR_NTFast_Accept or PR_NTFastAcceptRead,
    222 **    this function will update the accept context for those sockets,
    223 **    so that the socket can make general purpose socket calls.
    224 **    Without calling this, the only operations supported on the socket
    225 **    Are PR_Read, PR_Write, PR_Transmitfile, and PR_Close.
    226 */
    227 NSPR_API(void) PR_NTFast_UpdateAcceptContext(PRFileDesc *acceptSock,
    228        PRFileDesc *listenSock);
    229 
    230 
    231 /* FUNCTION: PR_NT_CancelIo
    232 ** DESCRIPTION:
    233 **    Cancel IO operations on fd.
    234 */
    235 NSPR_API(PRStatus) PR_NT_CancelIo(PRFileDesc *fd);
    236 
    237 
    238 #endif /* WIN32 */
    239 
    240 PR_END_EXTERN_C
    241 
    242 #endif /* pprio_h___ */