#ifndef CONNECTIONS_H #define CONNECTIONS_H #include #include #include #include #include #include #include #include #include #include "bsd_queue.h" #include "workqueue.h" enum connection_state_enum { CONNECTION_STATE_INIT = 0, CONNECTION_STATE_CONNECTED, CONNECTION_STATE_AUTHENTICATED, CONNECTION_STATE_WANT_CLOSE, CONNECTION_STATE_CLOSED }; typedef uint_fast8_t connection_flags_t; enum connection_flags { CONN_TYPE_SSL = (1<<0), }; struct connection { pthread_mutex_t rc_mutex; /* mutex for ref count */ size_t reference_count; /* */ struct server *server; enum connection_state_enum state; connection_flags_t flags; struct bufferevent *bev; uuid_t *uuid; /* uuid */ char name[256]; /* temporary auto-generated unique name */ #ifdef DARWIN struct timeval connect_time; /* time of instantiation of this connection entity */ struct timeval last_received_time; /* time of last data received from connection */ #else struct timespec connect_timespec; /* time this connection entity was initialized */ struct timespec last_received_timespec; /* time of last data received from connection */ #endif /* DARWIN */ size_t total_read; /* a tally of number of bytes read from connection */ struct timeval utime; /* accounting: rusage usertime accumulation */ struct timeval stime; /* accounting: rusage systime accumulation */ char *client_address; struct sockaddr *sa; int sa_len; struct evdns_request *evdns_request; /* the request for looking up the reverse of sa */ struct event *dns_retry_ev; /* timeout event for retrying failed dns */ size_t dns_retries; pthread_mutex_t commands_mutex; STAILQ_HEAD(commands_stailq_head, command) commands_head; volatile struct thread_struct *owner; /* set if command queue is currently being consumed */ TAILQ_ENTRY(connection) tailq_entry; }; struct connections { pthread_mutex_t mutex; TAILQ_HEAD(connection_tailq_head, connection) head; size_t count; }; int connections_init(struct connections *cs); void connections_fini(struct connections *cs); void connections_append(struct connection *c); void connections_remove(struct connection *c); struct connection ** connections_all_as_array(struct connections *cs, struct connection *c_exclude); int connection_init(struct server *s, struct connection *c, struct bufferevent *bev, struct sockaddr *sock, int socklen, connection_flags_t flags); void connection_inc_ref(struct connection *c); void connection_free(struct connection *c); int connection_command_enqueue(struct connection *c, struct command *command); void connection_accounting_increment(struct connection *c, struct rusage *ru_start, struct rusage *ru_end); void connection_lock_output(struct connection *c); void connection_unlock_output(struct connection *c); int connection_printf(struct connection *c, const char *fmt, ...); int connection_vprintf(struct connection *c, const char *fmt, va_list ap); int connection_printf_broadcast(struct connection *sender, bool exclude_sender, const char *fmt, ...); int connection_multi_send(struct connection **clist, char *data, size_t len); void connection_resolve_hostname(struct connection *c); #endif /* CONNECTIONS_H */