• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 // Written in NSPR style to also be suitable for adding to the NSS demo suite
5 
6 #ifndef __MEMIO_H
7 #define __MEMIO_H
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #include "prio.h"
14 
15 /* Opaque structure.  Really just a more typesafe alias for PRFilePrivate. */
16 struct memio_Private;
17 typedef struct memio_Private memio_Private;
18 
19 /*----------------------------------------------------------------------
20  NSPR I/O layer that terminates in a pair of circular buffers
21  rather than talking to the real network.
22  To use this with NSS:
23  1) call memio_CreateIOLayer to create a fake NSPR socket
24  2) call SSL_ImportFD to ssl-ify the socket
25  3) Do your own networking calls to set up a TCP connection
26  4) call memio_SetPeerName to tell NSS about the other end of the connection
27  5) While at the same time doing plaintext nonblocking NSPR I/O as
28     usual to the nspr file descriptor returned by SSL_ImportFD,
29     your app must shuttle encrypted data between
30     the real network and memio's network buffers.
31     memio_GetReadParams/memio_PutReadResult
32     are the hooks you need to pump data into memio's input buffer,
33     and memio_GetWriteParams/memio_PutWriteResult
34     are the hooks you need to pump data out of memio's output buffer.
35 ----------------------------------------------------------------------*/
36 
37 /* Create the I/O layer and its two circular buffers. */
38 PRFileDesc *memio_CreateIOLayer(int bufsize);
39 
40 /* Must call before trying to make an ssl connection */
41 void memio_SetPeerName(PRFileDesc *fd, const PRNetAddr *peername);
42 
43 /* Return a private pointer needed by the following
44  * four functions.  (We could have passed a PRFileDesc to
45  * them, but that would be slower.  Better for the caller
46  * to grab the pointer once and cache it.
47  * This may be a premature optimization.)
48  */
49 memio_Private *memio_GetSecret(PRFileDesc *fd);
50 
51 /* Ask memio where to put bytes from the network, and how many it can handle.
52  * Returns bytes available to write, or 0 if none available.
53  * Puts current buffer position into *buf.
54  */
55 int memio_GetReadParams(memio_Private *secret, char **buf);
56 
57 /* Tell memio how many bytes were read from the network.
58  * If bytes_read is 0, causes EOF to be reported to
59  * NSS after it reads the last byte from the circular buffer.
60  * If bytes_read is < 0, it is treated as an NSPR error code.
61  * See nspr/pr/src/md/unix/unix_errors.c for how to
62  * map from Unix errors to NSPR error codes.
63  * On EWOULDBLOCK or the equivalent, don't call this function.
64  */
65 void memio_PutReadResult(memio_Private *secret, int bytes_read);
66 
67 /* Ask memio what data it has to send to the network.
68  * Returns buffer space available to read into, or 0 if none available.
69  * Puts current buffer position into *buf.
70  */
71 int memio_GetWriteParams(memio_Private *secret, const char **buf);
72 
73 /* Tell memio how many bytes were sent to the network.
74  * If bytes_written is < 0, it is treated as an NSPR error code.
75  * See nspr/pr/src/md/unix/unix_errors.c for how to
76  * map from Unix errors to NSPR error codes.
77  * On EWOULDBLOCK or the equivalent, don't call this function.
78  */
79 void memio_PutWriteResult(memio_Private *secret, int bytes_written);
80 
81 
82 #ifdef __cplusplus
83 }
84 #endif
85 
86 #endif
87