/*
This file is part of libmicrospdy
Copyright Copyright (C) 2012 Andrey Uzunov
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file daemon.h
* @brief daemon functionality
* @author Andrey Uzunov
*/
#ifndef DAEMON_H
#define DAEMON_H
#include "platform.h"
/**
* Global flags containing the initialized IO subsystems.
*/
enum SPDY_IO_SUBSYSTEM spdyf_io_initialized;
/**
* Start a SPDDY webserver on the given port.
*
* @param port port to bind to
* @param certfile path to the certificate that will be used by server
* @param keyfile path to the keyfile for the certificate
* @param nscb callback called when a new SPDY session is
* established by a client
* @param sccb callback called when a client closes the session
* @param nrcb callback called when a client sends request
* @param npdcb callback called when HTTP POST params are received
* after request
* @param fnscb callback called when new stream is opened by a client
* @param fndcb callback called when new data -- within a data frame --
* is received by the server
* @param cls extra argument to all of the callbacks without those
* specific only for the framing layer
* @param fcls extra argument to all of the callbacks, specific only for
* the framing layer (those vars starting with 'f').
* @param valist va_list of options (type-value pairs,
* terminated with SPDY_DAEMON_OPTION_END).
* @return NULL on error, handle to daemon on success
*/
struct SPDY_Daemon *
SPDYF_start_daemon_va (uint16_t port,
const char *certfile,
const char *keyfile,
SPDY_NewSessionCallback nscb,
SPDY_SessionClosedCallback sccb,
SPDY_NewRequestCallback nrcb,
SPDY_NewDataCallback npdcb,
SPDYF_NewStreamCallback fnscb,
SPDYF_NewDataCallback fndcb,
void * cls,
void * fcls,
va_list valist);
/**
* Run webserver operations (without blocking unless
* in client callbacks). This method must be called in the client event
* loop.
*
* @param daemon daemon to run
*/
void
SPDYF_run (struct SPDY_Daemon *daemon);
/**
* Obtain timeout value for select for this daemon. The returned value
* is how long select
* should at most block, not the timeout value set for connections.
*
* @param daemon daemon to query for timeout
* @param timeout set to the timeout (in milliseconds)
* @return SPDY_YES on success, SPDY_NO if no connections exist that
* would necessiate the use of a timeout right now
*/
int
SPDYF_get_timeout (struct SPDY_Daemon *daemon,
unsigned long long *timeout);
/**
* Obtain the select sets for this daemon. The idea of SPDYF_get_fdset
* is to return such descriptors that the select in the application can
* return and SPDY_run can be called only when this is really needed.
* That means not all sockets will be added to write_fd_set.
*
* @param daemon daemon to get sets from
* @param read_fd_set read set
* @param write_fd_set write set
* @param except_fd_set except set
* @param all add all session's descriptors to write_fd_set or not
* @return largest FD added
*/
int
SPDYF_get_fdset (struct SPDY_Daemon *daemon,
fd_set *read_fd_set,
fd_set *write_fd_set,
fd_set *except_fd_set,
bool all);
/**
* Shutdown the daemon.
*
* @param daemon daemon to stop
*/
void
SPDYF_stop_daemon (struct SPDY_Daemon *daemon);
#endif