Home | History | Annotate | Download | only in base
      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