|
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___ */ |