Home | History | Annotate | Download | only in microspdy
      1 /*
      2     This file is part of libmicrospdy
      3     Copyright Copyright (C) 2013 Andrey Uzunov
      4 
      5     This program is free software: you can redistribute it and/or modify
      6     it under the terms of the GNU General Public License as published by
      7     the Free Software Foundation, either version 3 of the License, or
      8     (at your option) any later version.
      9 
     10     This program is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13     GNU General Public License for more details.
     14 
     15     You should have received a copy of the GNU General Public License
     16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17 */
     18 
     19 /**
     20  * @file io.h
     21  * @brief  Signatures for IO functions.
     22  * @author Andrey Uzunov
     23  */
     24 
     25 #ifndef IO_H
     26 #define IO_H
     27 
     28 #include "platform.h"
     29 #include "io_openssl.h"
     30 #include "io_raw.h"
     31 
     32 
     33 /**
     34  * Used for return code when reading and writing to the TLS socket.
     35  */
     36 enum SPDY_IO_ERROR
     37 {
     38 	/**
     39 	 * The connection was closed by the other party.
     40 	 */
     41 	SPDY_IO_ERROR_CLOSED = 0,
     42 
     43 	/**
     44 	 * Any kind of error ocurred. The session has to be closed.
     45 	 */
     46 	SPDY_IO_ERROR_ERROR = -2,
     47 
     48 	/**
     49 	 * The function had to return without processing any data. The whole
     50 	 * cycle of events has to be called again (SPDY_run) as something
     51 	 * either has to be written or read or the the syscall was
     52 	 * interrupted by a signal.
     53 	 */
     54 	SPDY_IO_ERROR_AGAIN = -3,
     55 };
     56 
     57 
     58 /**
     59  * Global initializing. Must be called only once in the program.
     60  *
     61  */
     62 typedef void
     63 (*SPDYF_IOGlobalInit) ();
     64 
     65 
     66 /**
     67  * Global deinitializing for the whole program. Should be called
     68  * at the end of the program.
     69  *
     70  */
     71 typedef void
     72 (*SPDYF_IOGlobalDeinit) ();
     73 
     74 
     75 /**
     76  * Initializing of io context for a specific daemon.
     77  * Must be called when the daemon starts.
     78  *
     79  * @param daemon SPDY_Daemon for which io will be used. Daemon's
     80  * 				certificate and key file are used for tls.
     81  * @return SPDY_YES on success or SPDY_NO on error
     82  */
     83 typedef int
     84 (*SPDYF_IOInit) (struct SPDY_Daemon *daemon);
     85 
     86 
     87 /**
     88  * Deinitializing io context for a daemon. Should be called
     89  * when the deamon is stopped.
     90  *
     91  * @param daemon SPDY_Daemon which is being stopped
     92  */
     93 typedef void
     94 (*SPDYF_IODeinit) (struct SPDY_Daemon *daemon);
     95 
     96 
     97 /**
     98  * Initializing io for a specific connection. Must be called
     99  * after the connection has been accepted.
    100  *
    101  * @param session SPDY_Session whose socket will be used
    102  * @return SPDY_NO if some funcs inside fail. SPDY_YES otherwise
    103  */
    104 typedef int
    105 (*SPDYF_IONewSession) (struct SPDY_Session *session);
    106 
    107 
    108 /**
    109  * Deinitializing io for a specific connection. Should be called
    110  * closing session's socket.
    111  *
    112  * @param session SPDY_Session whose socket is used
    113  */
    114 typedef void
    115 (*SPDYF_IOCloseSession) (struct SPDY_Session *session);
    116 
    117 
    118 /**
    119  * Reading from session's socket. Reads available data and put it to the
    120  * buffer.
    121  *
    122  * @param session for which data is received
    123  * @param buffer where data from the socket will be written to
    124  * @param size of the buffer
    125  * @return number of bytes (at most size) read from the connection
    126  *         0 if the other party has closed the connection
    127  *         SPDY_IO_ERROR code on error
    128  */
    129 typedef int
    130 (*SPDYF_IORecv) (struct SPDY_Session *session,
    131 				void * buffer,
    132 				size_t size);
    133 
    134 
    135 /**
    136  * Writing to session's socket. Writes the data given into the buffer to the
    137  *  socket.
    138  *
    139  * @param session whose context is used
    140  * @param buffer from where data will be written to the socket
    141  * @param size number of bytes to be taken from the buffer
    142  * @return number of bytes (at most size) from the buffer that has been
    143  * 			written to the connection
    144  *         0 if the other party has closed the connection
    145  *         SPDY_IO_ERROR code on error
    146  */
    147 typedef int
    148 (*SPDYF_IOSend) (struct SPDY_Session *session,
    149 				const void * buffer,
    150 				size_t size);
    151 
    152 
    153 /**
    154  * Checks if there is data staying in the buffers of the underlying
    155  * system that waits to be read. In case of TLS, this will call
    156  * something like SSL_pending().
    157  *
    158  * @param session which is checked
    159  * @return SPDY_YES if data is pending or SPDY_NO otherwise
    160  */
    161 typedef int
    162 (*SPDYF_IOIsPending) (struct SPDY_Session *session);
    163 
    164 
    165 /**
    166  * Called just before frames are about to be processed and written
    167  * to the socket.
    168  *
    169  * @param session
    170  * @return SPDY_NO if writing must not happen in the call;
    171  *         SPDY_YES otherwise
    172  */
    173 typedef int
    174 (*SPDYF_IOBeforeWrite) (struct SPDY_Session *session);
    175 
    176 
    177 /**
    178  * Called just after frames have been processed and written
    179  * to the socket.
    180  *
    181  * @param session
    182  * @param was_written has the same value as the write function for the
    183  *        session will return
    184  * @return returned value will be used by the write function to return
    185  */
    186 typedef int
    187 (*SPDYF_IOAfterWrite) (struct SPDY_Session *session,
    188                        int was_written);
    189 
    190 
    191 /**
    192  * Sets callbacks for the daemon with regard to the IO subsystem.
    193  *
    194  * @param daemon
    195  * @param io_subsystem the IO subsystem that will
    196  *        be initialized and used by daemon.
    197  * @return SPDY_YES on success or SPDY_NO otherwise
    198  */
    199 int
    200 SPDYF_io_set_daemon(struct SPDY_Daemon *daemon,
    201                     enum SPDY_IO_SUBSYSTEM io_subsystem);
    202 
    203 
    204 /**
    205  * Sets callbacks for the session with regard to the IO subsystem.
    206  *
    207  * @param session
    208  * @param io_subsystem the IO subsystem that will
    209  *        be initialized and used by session.
    210  * @return SPDY_YES on success or SPDY_NO otherwise
    211  */
    212 int
    213 SPDYF_io_set_session(struct SPDY_Session *session,
    214                      enum SPDY_IO_SUBSYSTEM io_subsystem);
    215 
    216 #endif
    217