21#include <sys/socket.h>
22#include <netinet/in.h>
24#ifdef FOOTBALL_THREADS
36typedef enum fb_log_types_t {
38 FB_LOG_WARNING = 0x01,
40 FB_LOG_IO_TRACE = 0x08,
41 FB_LOG_CONN_STATUS = 0x10,
42 FB_LOG_CONN_ERROR = 0x20,
43 FB_LOG_TLS_STATUS = 0x100,
44 FB_LOG_TLS_ERROR = 0x200,
45 FB_LOG_HTTP_STATUS = 0x1000,
46 FB_LOG_HTTP_ERROR = 0x2000,
47 FB_LOG_HTTP_TRAFFIC = 0x4000,
53#define FB_WHERE(level) (level)
55#define FB_WHERE(level) __FILE__, __LINE__, __func__, (level)
58#define fb_perror(errfunc) fb_log(FB_WHERE (FB_LOG_ERROR), (errfunc ": %s"), strerror (errno))
66#ifdef FOOTBALL_THREADS
68#define fb_mutex_init(var) (pthread_mutex_init(var, NULL))
69#define fb_mutex_destroy(var) (pthread_mutex_destroy(var))
70#define fb_mutex_lock(var) (pthread_mutex_lock(var))
71#define fb_mutex_unlock(var) (pthread_mutex_unlock(var))
73#define fb_mutex_init(var) (assert(pthread_mutex_init(var, NULL) == 0))
74#define fb_mutex_destroy(var) (assert(pthread_mutex_destroy(var) == 0))
75#define fb_mutex_lock(var) (assert(pthread_mutex_lock(var) == 0))
76#define fb_mutex_unlock(var) (assert(pthread_mutex_unlock(var) == 0))
79#define fb_mutex_init(mutex) ((void)0)
80#define fb_mutex_destroy(mutex) ((void)0)
81#define fb_mutex_lock(mutex) ((void)0)
82#define fb_mutex_unlock(mutex) ((void)0)
88 FB_SOCKTYPE_CONNECTION = 0x5285,
89 FB_SOCKTYPE_USER = 0xa9f7,
90 FB_SOCKTYPE_EVENT = 0xbd53
103typedef enum fb_socketid_t {
115 struct sockaddr_in ip4;
117 struct sockaddr_in6 ip6;
121#define fb_http_socket(id) ((id) == FB_SOCKET_HTTP_IP4 || (id) == FB_SOCKET_HTTP_IP6 || \
122 (id) == FB_SOCKET_HTTPS_IP4 || (id) == FB_SOCKET_HTTPS_IP6)
123#define fb_ip6_socket(id) ((id) == FB_SOCKET_LINE_IP6 || (id) == FB_SOCKET_HTTP_IP6 || \
124 (id) == FB_SOCKET_HTTPS_IP6)
125#define fb_encrypted_socket(id) ((id) == FB_SOCKET_HTTPS_IP4 || (id) == FB_SOCKET_HTTPS_IP6)
140#ifdef FOOTBALL_THREADS
141 pthread_mutex_t mutex;
190 char *websocket_protocol;
191 char *websocket_version;
219 struct sockaddr_in ip4addr;
221 struct sockaddr_in6 ip6addr;
225#ifdef FOOTBALL_THREADS
226 pthread_mutex_t mutex;
239extern void fb_free_freelists (
void);
241extern void fb_messagefree(
FB_MESSAGE *freethis);
248extern void fb_queue_consume (
FB_IOQUEUE *q,
size_t consume);
252extern void fb_destroy_service (
struct fb_service_t *service);
253extern void fb_schedule_reap (
FB_SERVICE *service);
256extern bool fb_transfer_by_name (
FB_CONNECTION *connection,
const char *name);
259extern void fb_queue_event (
FB_EVENT *event);
260extern void fb_dispose_event (
FB_EVENT *event);
266extern void fb_destroy_connection (
FB_CONNECTION *connection);
269extern bool fb_set_input_buffer_size (
FB_CONNECTION *connection,
size_t size);
270extern bool fb_recv_input (
FB_CONNECTION *connection, ssize_t byte_count);
278extern bool fb_websocket_announce_close (
FB_CONNECTION *connection);
282extern void fb_collect_http_parameter (
char *line,
FB_HTTPREQUEST *request);
283extern bool fb_http_command (
const char *command);
287extern int fb_create_argv (
const char *commandline,
char ***result);
288extern int fb_create_argv_from_query_string (
const char *query_string,
char ***result,
char ***remainders);
289extern void fb_destroy_argv (
char **argv);
290extern const char *fb_connection_info (
FB_CONNECTION *connection);
293extern void fb_set_buffering (
int socket_fd,
bool enable);
294extern void fb_set_readable (
int socket,
bool enable);
295extern void fb_set_writable (
int socket,
bool enable);
297#define FAR_FUTURE ((time_t) (((time_t) 0x7fffffff) << ((sizeof (time_t) - 4) * 8)))
Football public declarations.
enum fb_socket_state_t FB_SOCKETSTATE
Connection states.
bool fb_register(int socket, FB_SOCKETTYPE type, void *thing)
Add a socket to the registry.
Definition fb_socketmgr.c:195
void fb_unregister(int socket)
Remove a socket from the registry.
Definition fb_socketmgr.c:228
struct fb_inputbuffer_t FB_INPUTBUFFER
Connection input structure.
union fb_socketaddr_t FB_SOCKETADDR
Address of opposing end of a connection.
struct fb_ioqueue_t FB_IOQUEUE
Queue structure.
struct fb_message_t FB_MESSAGE
Message structure.
enum fb_socket_type_t FB_SOCKETTYPE
Magic numbers used to differentiate parameter types sent to fb_fprintf.
struct fb_http_request_t FB_HTTPREQUEST
Structure which collects HTTP request information as it is read.
struct fb_messagelist_t FB_MESSAGELIST
Q list structure.
fb_socket_state_t
Connection states.
Definition fb_service.h:94
@ FB_SOCKET_STATE_FLUSHING
Line-oriented or WebSocket session is closing, flushing output.
Definition fb_service.h:99
@ FB_SOCKET_STATE_OPEN
Line-oriented or WebSocket session in process.
Definition fb_service.h:98
@ FB_SOCKET_STATE_TLS_HANDSHAKE
Connection has not yet completed TLS handshake.
Definition fb_service.h:95
@ FB_SOCKET_STATE_GREETING
HTTP/TLS connection is awaiting a request.
Definition fb_service.h:96
@ FB_SOCKET_STATE_CLOSING
Line-oriented or WebSocket connection has finished flushing.
Definition fb_service.h:100
@ FB_SOCKET_STATE_GATHERING_HEADER
HTTP/HTTPS request in process, still reading headering.
Definition fb_service.h:97
fb_socket_type_t
Magic numbers used to differentiate parameter types sent to fb_fprintf.
Definition fb_service.h:86
@ FB_SOCKTYPE_SERVICE
Random numbers.
Definition fb_service.h:87
Football private transport layer declarations.
Connection state information.
Definition fb_service.h:199
int socket
File descriptor for this connection.
Definition fb_service.h:202
void * context
For user use, if desired/needed.
Definition fb_service.h:228
void * relatedObject
C++ object for this connection.
Definition fb_service.h:229
FB_SERVICE * service
Service to which connection belongs.
Definition fb_service.h:201
time_t expiry_time
State: Negotiating, open, flushing, closing, etc.
Definition fb_service.h:204
bool http
Flag set for HTTP connections.
Definition fb_service.h:206
FB_IOQUEUE assembly
Output to websocket, awaiting assembly to a WebSocket packet.
Definition fb_service.h:213
FB_SOCKETTYPE type
Magic number so we know this is a connection.
Definition fb_service.h:200
int domain
Connection domain: PF_INET or PF_INET6.
Definition fb_service.h:217
bool greeted
Did we already get a greeting in ALLOW mode?
Definition fb_service.h:205
FB_IOQUEUE out
Output ready to go out the socket.
Definition fb_service.h:214
time_t next_ping
Time to send next websocket ping.
Definition fb_service.h:216
bool encrypted
Flag set for TLS connections.
Definition fb_service.h:207
char * filename
For file connections.
Definition fb_service.h:224
FB_INPUTBUFFER in
Input buffer.
Definition fb_service.h:215
Events are returned in this structure.
Definition fb_public.h:42
Structure which collects HTTP request information as it is read.
Definition fb_service.h:180
char * filename
Request filename (Service name stripped off if used).
Definition fb_service.h:186
bool invalid
flag set if invalidness was found while reading the header.
Definition fb_service.h:194
char * upgrade_type
Query parameters, if present.
Definition fb_service.h:188
char * http
HTTP version from HEAD or GET request.
Definition fb_service.h:183
bool headonly
flag set for HEAD request
Definition fb_service.h:182
char * language
Accept-Language HTTP request parameter.
Definition fb_service.h:193
bool failure
Web server suffering troubles.
Definition fb_service.h:195
char * host
Requesting host.
Definition fb_service.h:184
char * if_modified_since
Used to support caching via GET requests.
Definition fb_service.h:192
bool unsupported
Unsupported HTTP request (any other than HEAD or GET)
Definition fb_service.h:181
char * service_name
Requested service, if service names in use per service options.
Definition fb_service.h:185
Queue structure.
Definition fb_service.h:166
Iterator for connections on a football service.
Definition fb_service.h:233
Message structure.
Definition fb_service.h:153
ssize_t length
Length of this message.
Definition fb_service.h:155
char * message
The message.
Definition fb_service.h:156
int usecount
How many message lists this message is currently used in.
Definition fb_service.h:154
Q list structure.
Definition fb_service.h:160
Service options are passed to a new service, defining its behavior.
Definition fb_public.h:75
Football service state structure.
Definition fb_service.h:128
struct fb_connection_t ** connections
Connections to services.
Definition fb_service.h:136
bool shutdown_event_done
Return shutdown event once.
Definition fb_service.h:138
struct fb_service_t * next_reap
For reap queue.
Definition fb_service.h:137
void * relatedObject
C++ object for this service.
Definition fb_service.h:143
FB_SOCKETTYPE type
Magic number so we know this is a service in fb_fprintf.
Definition fb_service.h:129
FB_SOCKETSTATE state
Is the service open or closing?
Definition fb_service.h:130
FB_SERVICE_OPTIONS options
Behavior options.
Definition fb_service.h:131
struct fb_service_t * next_child
Children or next child.
Definition fb_service.h:139
int socket[FB_SOCKET_COUNT]
Socket file descriptors.
Definition fb_service.h:132
FB_SOCKETADDR address[FB_SOCKET_COUNT]
Socket address information.
Definition fb_service.h:133
size_t connection_count
Number of active connections in the collection.
Definition fb_service.h:134
size_t connections_size
Total number of slots in the collection.
Definition fb_service.h:135
Definition fb_transport.h:74
Address of opposing end of a connection.
Definition fb_service.h:114