1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* 2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat This file is part of libmicrospdy 3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Copyright Copyright (C) 2013 Andrey Uzunov 4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat This program is free software: you can redistribute it and/or modify 6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat it under the terms of the GNU General Public License as published by 7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat the Free Software Foundation, either version 3 of the License, or 8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat (at your option) any later version. 9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat This program is distributed in the hope that it will be useful, 11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat but WITHOUT ANY WARRANTY; without even the implied warranty of 12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat GNU General Public License for more details. 14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat You should have received a copy of the GNU General Public License 16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat along with this program. If not, see <http://www.gnu.org/licenses/>. 17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat*/ 18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @file io_raw.h 21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief IO for SPDY without TLS. 22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Andrey Uzunov 23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef IO_RAW_H 26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define IO_RAW_H 27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform.h" 29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Must be called only once in the program. 33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid 36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_global_init(); 37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Should be called 41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * at the end of the program. 42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid 45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_global_deinit(); 46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Must be called when the daemon starts. 50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param daemon SPDY_Daemon 52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_YES on success or SPDY_NO on error 53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_init(struct SPDY_Daemon *daemon); 56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Should be called 60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * when the deamon is stopped. 61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param daemon SPDY_Daemon which is being stopped 63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid 65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_deinit(struct SPDY_Daemon *daemon); 66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Must be called 70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * after the connection has been accepted. 71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session SPDY_Session whose socket will be used 73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_NO if some funcs fail. SPDY_YES otherwise 74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_new_session(struct SPDY_Session *session); 77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Should be called 81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * closing session's socket. 82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session SPDY_Session whose socket is used 84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid 86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_close_session(struct SPDY_Session *session); 87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Reading from socket. Reads available data and put it to the 91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * buffer. 92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session for which data is received 94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param buffer where data from the socket will be written to 95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param size of the buffer 96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return number of bytes (at most size) read from the connection 97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 0 if the other party has closed the connection 98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * SPDY_IO_ERROR code on error 99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_recv(struct SPDY_Session *session, 102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat void * buffer, 103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat size_t size); 104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Writing to socket. Writes the data given into the buffer to the 108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * socket. 109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session whose context is used 111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param buffer from where data will be written to the socket 112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param size number of bytes to be taken from the buffer 113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return number of bytes (at most size) from the buffer that has been 114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * written to the connection 115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 0 if the other party has closed the connection 116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * SPDY_IO_ERROR code on error 117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_send(struct SPDY_Session *session, 120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat const void * buffer, 121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat size_t size); 122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Checks if there is data staying in the buffers of the underlying 126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * system that waits to be read. Always returns SPDY_NO, as we do not 127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * use a subsystem here. 128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session which is checked 130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_YES if data is pending or SPDY_NO otherwise 131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_is_pending(struct SPDY_Session *session); 134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Sets TCP_CORK. 138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session 140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_NO if writing must not happen in the call; 141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * SPDY_YES otherwise 142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_before_write(struct SPDY_Session *session); 145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Unsets TCP_CORK. 149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session 151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param was_written has the same value as the write function for the 152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * session will return 153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return returned value will be used by the write function to return 154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_after_write(struct SPDY_Session *session, int was_written); 157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 159