catalinux / Conn (public) (License: LGPLv2) (since 2016-03-01) (hash sha1)
Net library for easy building ipv4/ipv6 network daemons/clients

/Conn_engine_core.h (4d3b95eb7d5c2296d48a348006176fa5fdf31b13) (8812 bytes) (mode 100644) (type blob)

#ifndef CONN_ENGINE_CORE_H
#define CONN_ENGINE_CORE_H

#include <Conn_config.h>

#define _GNU_SOURCE

#include <stdarg.h>
#include <resolv.h>
#include <errno.h>
#include <signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#include <ctype.h>


/* type */
enum {
	CONN_TYPE_UNK = 0,
	CONN_TYPE_MASTER,
	CONN_TYPE_P2P
};

/* state */
enum {
	CONN_STATE_FREE,
	CONN_STATE_EMPTY,
	CONN_STATE_OPEN,
	CONN_STATE_LISTEN,
	CONN_STATE_CONNECT_0,
	CONN_STATE_CONNECT_a,
	CONN_STATE_CONNECT_b,
	CONN_STATE_ERROR
};

/* error kind */
enum {
	CONN_ERROR_NO_ERROR,
	CONN_ERROR_USERREQ,	/* user requested the close */
	CONN_ERROR_POLL,
	CONN_ERROR_RECV,
	CONN_ERROR_SEND,
	CONN_ERROR_SOCKET,
	CONN_ERROR_HANGUP,
	CONN_ERROR_GETADDRINFO,
	CONN_ERROR_EXPIRED,
	CONN_ERROR_ACCEPT,	/* This is free TODO: check! */
	CONN_ERROR_MEM,	
	CONN_ERROR_CONNECT,
	CONN_ERROR_READ_TIMEOUT,
	CONN_ERROR_CONN_TIMEOUT,
	CONN_ERROR_INTERNAL
};

/* FLAGS */
#define CONN_FLAGS_AUTO_RECONNECT	0x01 << 0
#define CONN_FLAGS_CLOSE_AFTER_SEND	0x01 << 1

/* Parameters */
enum {
	CONN_PARA_START,
	CONN_PARA_AUTO_RECONNECT,
	CONN_PARA_RECONNECT_DELAY,
	CONN_PARA_IDLE_TIME,
	CONN_PARA_READ_TIMEOUT,
	CONN_PARA_CONN_TIMEOUT,
	CONN_PARA_TRIGGER,
	CONN_PARA_IBUF,
	CONN_PARA_OBUF
};

/* Callbacks */
enum {
	CONN_CB_START,
	CONN_CB_ACCEPT,
	CONN_CB_RECV,
	CONN_CB_SEND,
	CONN_CB_DATA,
	CONN_CB_CLOSE,
	CONN_CB_TRIGGER,
	CONN_CB_ERROR,
	CONN_CB_CONNECTED,
	CONN_CB_ACCEPT_ERROR
};

/* Engine type */
enum {
	CONN_ENGINE_POLL,
	CONN_ENGINE_EPOLL
};

extern unsigned int		CONN_POLLIN;
extern unsigned int		CONN_POLLOUT;
extern unsigned int		CONN_POLLPRI;
extern unsigned int		CONN_POLLERR;
extern unsigned int		CONN_POLLHUP;
extern unsigned int		CONN_POLLNVAL;
extern unsigned int		CONN_POLLRDNORM;
extern unsigned int		CONN_POLLRDBAND;

struct Conn
{
	int			fd;
	unsigned int		events, revents; /* I/O events */

	unsigned char		type;

	unsigned char		state;
	unsigned char		error_state;

	unsigned int		slot;

	char			*ibuf;
	unsigned int		ibuf_size, ibuf_head, ibuf_tail;

	char			*obuf;
	unsigned int		obuf_size, obuf_head, obuf_tail;

	struct timeval		trecv, tsend;	/* last time we saw an receive/send */
	time_t			idle;		/* idle time allowed */
	unsigned int		read_timeout;	/* Max timeout for receiving an answer (milliseconds) */

	struct timeval		conn_syn;	/* Time when a connection was initiated */
	unsigned int		conn_timeout;	/* Timeout for connection (milliseconds) */

	time_t			last_trigger;	/* last trigger was at */
	time_t			trigger;	/* Frequency of wakeup a connection */

	int			sock_domain;
	int			sock_type;
	int			sock_protocol;

	char			addr[64], bind_addr[64];
	int			port, bind_port;
	unsigned long long	via;		/* "via" is the connection id via a client was accepted */

	unsigned long long	bi, bo;

	void			*private;	/* private use by user */

	/* reconnect stuff */
	unsigned int		retries;
	unsigned int		delay; /* delay between reconnects */
	time_t			tryat; /* when we go to CONNECT_a state */

	int			xerrno;

	time_t			start;

	unsigned int		flags;

	/* bandwidth stuff */
	struct timeval		band_lasttime;	/* last time tokens were added */
	unsigned int		band_tokens;	/* 1 token -> 1000 bytes */
	unsigned int		band_factor;	/* tokens cannot go past f * w */
	unsigned int		band_width;	/* in 1000b increments */

	unsigned long long	id;		/* the id of a connection */

	/* Specific callbacks */
	void			(*cb_accept)(struct Conn *C);
	void			(*cb_recv)(struct Conn *C);
	void			(*cb_send)(struct Conn *C);
	void			(*cb_data)(struct Conn *C);
	void			(*cb_close)(struct Conn *C);
	void			(*cb_trigger)(struct Conn *C);
	void			(*cb_error)(struct Conn *C);
	void			(*cb_connected)(struct Conn *C);
	void			(*cb_accept_error)(struct Conn *C);
};

struct Conn_queue_entry
{
	unsigned int		slot;
	struct Conn_queue_entry	*next;
};

struct Conn_queue
{
	struct Conn_queue_entry *head, *tail;
};


/* For parsing */
struct Conn_split_cell
{
	struct Conn_split_cell	*next;
	char			*left;
	char			*right;
	unsigned int		right_len;
};

struct Conn_split
{
	struct Conn_split_cell	*head, *tail;
	char			*line;
};


/* Variables */
extern void		(*Conn_accept_cb)(struct Conn *C);
extern void		(*Conn_recv_cb)(struct Conn *C);
extern void		(*Conn_send_cb)(struct Conn *C);
extern void		(*Conn_data_cb)(struct Conn *C);
extern void		(*Conn_close_cb)(struct Conn *C);
extern void		(*Conn_trigger_cb)(struct Conn *C);
extern void		(*Conn_error_cb)(struct Conn *C);
extern void		(*Conn_connected_cb)(struct Conn *C);
extern void		(*Conn_accept_error_cb)(struct Conn *C);

extern char		*(*Conn_status_slot_html_cb)(const struct Conn *C);
extern char		*(*Conn_status_cb)(void);

extern unsigned int	Conn_max_reached;
extern unsigned int	Conn_default_ibuf;
extern unsigned int	Conn_default_obuf;
extern unsigned int	Conn_max_ibuf;
extern unsigned int	Conn_max_obuf;
extern unsigned int	Conn_no;
extern unsigned int	Conn_max;
extern unsigned long	Conn_total;
extern unsigned int	Conn_start;
extern unsigned int	Conn_pending;
extern struct timeval	Conn_now;

extern unsigned int	Conn_max_send;
extern unsigned int	Conn_max_recv;

extern unsigned short	Conn_level;
extern unsigned int	Conn_accept_is_allowed;
extern unsigned int	Conn_accept_is_allowed_last;

extern struct Conn	*Conns;
extern unsigned int	Conn_inited;
extern unsigned int	Conn_allocated;
extern unsigned long long	Conn_id;

extern char		Conn_error[512];

extern FILE		*Conn_Log;
extern int		debug_band;

/* queues */
extern struct Conn_queue	Conn_queue_free;

/* Functions */
extern char		*Conn_strerror(void);
extern void		Log(const unsigned short level, char *format, ...);
extern char		*Conn_errno(const struct Conn *C);
extern char		*Conn_status_slot(struct Conn *C);
extern char		*Conn_status(const unsigned int flags);
extern int		Conn_try_expand_buf(struct Conn *C, const int what,
				const int needed);
extern char		*Conn_state(const struct Conn *C);

extern long long	Conn_time_diff(const struct timeval *t1,
				const struct timeval *t2);
extern void		Conn_last_time(const struct Conn *C, struct timeval *tv);

extern int		Conn_setnonblock(const int fd);

extern char		*Conn_dump(const char *buf_src, const int len_src);
extern char		*Conn_dumphex(const char *buf_src, const int len_src);
extern void		Conn_debug(FILE *f, const unsigned short debug);

extern void		Conn_close(struct Conn *C);

extern int		Conn_ignore(const struct Conn *C);

extern void		Conn_expire(struct Conn *C);

extern int		Conn_set_cb(struct Conn *C, const unsigned int type,
				void (*f)(struct Conn *));
extern char		*Conn_get_line(struct Conn *C);
extern void		Conn_for_every_line(struct Conn *C,
				int (*cb)(struct Conn *C, char *line));

extern void		Conn_eat(struct Conn *C, const unsigned int bytes);
extern void		Conn_eatall(struct Conn *C);

extern unsigned int	Conn_qlen(const struct Conn *C);

extern void		Conn_set(struct Conn *C, const unsigned int var,
				const int val);

extern int		Conn_get_fd(const struct Conn *C);

extern unsigned long long	Conn_getid(const struct Conn *C);

extern struct Conn	*Conn_get(const unsigned long long id);

extern char		*Conn_ibuf(const struct Conn *C);
extern char		*Conn_obuf(const struct Conn *C);

extern char		*Conn_domain(const struct Conn *C);
extern char		*Conn_type(const struct Conn *C);

extern int		Conn_addr_family(const char *addr);

extern void		Conn_error_raise(struct Conn *C, const int err);

/* queue stuff */
extern void		Conn_queue_init(struct Conn_queue *q);
extern int		Conn_queue_add(struct Conn_queue *q,
				const unsigned int slot);
extern void		Conn_queue_destroy(struct Conn_queue *q);

/* String stuff */
extern char		*Conn_strstr(struct Conn *C, const char *str);
extern char		*Conn_strcasestr(struct Conn *C, const char *str);

/* splitting stuff */
extern void			Conn_rtrim(char *s, const char *chars);
extern struct Conn_split	*Conn_split(const char *line);
extern char			*Conn_split_get_size(const struct Conn_split *s,
				const char *l, unsigned int *len);
extern char			*Conn_split_get_e(const struct Conn_split *s,
				const char *l);
extern char			*Conn_split_get(const struct Conn_split *s,
				const char *l);
extern unsigned long		Conn_split_get_ul(const struct Conn_split *s,
				const char *l, unsigned int base);
extern unsigned long long	Conn_split_get_ull(const struct Conn_split *s,
				const char *l, unsigned int base);
extern double			Conn_split_get_d(const struct Conn_split *s,
				const char *l);
extern void			Conn_split_free(struct Conn_split **s);

/* Misc stuff */
extern int			Conn_alphanum(const char *s);

#endif



Mode Type Size Ref File
100644 blob 70 9964a59b5d89f394cc4250ed6d6ce67a5f0cd196 .gitignore
100644 blob 1945 fecf0e7a7e8580485101a179685aedc7e00affbb Changelog.pre109
100644 blob 29294 a8e3c531d0d09c80494f8aec43c30b472069fadf Conn.c
100644 blob 1384 8fa0f6709d6d8e87aaa0ab801fa4a87fec6a5069 Conn.h
100644 blob 726 64b1bad93a84f87c3e93fc24ac5341db691ea578 Conn.spec.in
100644 blob 66 68138d781ca754b15e14c687da91ee261b2c41f3 Conn_config.h.in
100644 blob 26399 57e8b0d30e2f24f0f516bec7ed9155ddb6a7935c Conn_engine_core.c
100644 blob 8812 4d3b95eb7d5c2296d48a348006176fa5fdf31b13 Conn_engine_core.h
100644 blob 3687 8ae607cf9e14a6f9f1d9f17f468294660986e845 Conn_engine_epoll.c
100644 blob 601 b7631d5fc5487b502f02679b0d679661f87b4da9 Conn_engine_epoll.h
100644 blob 2677 e885b694fc0f55200ee50936966a2e40744ebf9b Conn_engine_poll.c
100644 blob 588 b518b20ac383c00b72e96a77a882c6b7ee953f6f Conn_engine_poll.h
100644 blob 30 d987fa5df957830331139935d517009e2911b0cf INSTALL
100644 blob 25275 92b8903ff3fea7f49ef5c041b67a087bca21c5ec LICENSE
100644 blob 1311 3c820df3b36b4bc844c52bc8c7e86f7843b67bb6 Makefile.in
100644 blob 192 5b11bdfb23857d8588845465aef993b320596b44 README
100644 blob 2059 64d9cdb1fa939e3ab5c8acde3c50fa980ef3751b TODO
100755 blob 23 d33bb6c4ecdce1390ce1db3c79ea3b93e22ea755 configure
040000 tree - d4c9c4a69c5cfa2a84316967185f1661b6817779 docs
100755 blob 10344 8acd6afdceefbb056b57e9d09a9943857800df8e duilder
100644 blob 276 4163f35b9322fbbf5e9cade154d251b39878c43f duilder.conf
040000 tree - 6876183778b5a2f5f4898c7c269e1acff9a2eb91 examples
040000 tree - 751693d0803f700dd060788cc9383aa24b472267 tests
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/catalinux/Conn

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/catalinux/Conn

Clone this repository using git:
git clone git://git.rocketgit.com/user/catalinux/Conn

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main