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 (754f621be0df3227c91d89956acd27b4cb4def23) (8392 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>


/* type */
#define	Conn_type_MASTER	1
#define Conn_type_CLIENT	2
#define Conn_type_UNK		3


/* state */
#define CONN_STATE_START	0
#define CONN_STATE_FREE		CONN_STATE_START + 1
#define CONN_STATE_EMPTY	CONN_STATE_START + 2
#define CONN_STATE_OPEN		CONN_STATE_START + 3
#define CONN_STATE_LISTEN	CONN_STATE_START + 4
#define CONN_STATE_CONNECT_0	CONN_STATE_START + 5
#define CONN_STATE_CONNECT_a	CONN_STATE_START + 6
#define CONN_STATE_CONNECT_b	CONN_STATE_START + 7


/* error kind */
#define CONN_ERROR_START	0
#define CONN_ERROR_USERREQ	CONN_ERROR_START +  1		/* user requested the close */
#define CONN_ERROR_POLL		CONN_ERROR_START +  2
#define CONN_ERROR_RECV		CONN_ERROR_START +  3
#define CONN_ERROR_SEND		CONN_ERROR_START +  4
#define CONN_ERROR_SOCKET	CONN_ERROR_START +  5
#define CONN_ERROR_HANGUP	CONN_ERROR_START +  6
#define CONN_ERROR_GETADDRINFO	CONN_ERROR_START +  7
#define CONN_ERROR_EXPIRED	CONN_ERROR_START +  8
#define CONN_ERROR_ACCEPT	CONN_ERROR_START +  9 /* This is free TODO: check! */
#define CONN_ERROR_MEM		CONN_ERROR_START + 10
#define CONN_ERROR_CONNECT	CONN_ERROR_START + 11
#define CONN_ERROR_READ_TIMEOUT	CONN_ERROR_START + 12
#define CONN_ERROR_CONN_TIMEOUT	CONN_ERROR_START + 13


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


/* Parameters */
#define CONN_PARA_START			0
#define CONN_PARA_AUTO_RECONNECT	CONN_PARA_START + 1
#define CONN_PARA_RECONNECT_DELAY	CONN_PARA_START + 2
#define CONN_PARA_IDLE_TIME		CONN_PARA_START + 3
#define CONN_PARA_READ_TIMEOUT		CONN_PARA_START + 4
#define CONN_PARA_CONN_TIMEOUT		CONN_PARA_START + 5
#define CONN_PARA_TRIGGER		CONN_PARA_START + 6
#define CONN_PARA_IBUF			CONN_PARA_START + 7
#define CONN_PARA_OBUF			CONN_PARA_START + 8

/* Callbacks */
#define CONN_CB_START			0
#define CONN_CB_ACCEPT			CONN_CB_START + 1
#define CONN_CB_RECV			CONN_CB_START + 2
#define CONN_CB_SEND			CONN_CB_START + 3
#define CONN_CB_DATA			CONN_CB_START + 4
#define CONN_CB_CLOSE			CONN_CB_START + 5
#define CONN_CB_TRIGGER			CONN_CB_START + 6
#define CONN_CB_ERROR			CONN_CB_START + 7
#define CONN_CB_CONNECTED		CONN_CB_START + 8
#define CONN_CB_ACCEPT_ERROR		CONN_CB_START + 9

/* Engine type */
#define CONN_ENGINE_POLL		1
#define CONN_ENGINE_EPOLL		2

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;

	char			addr[64];
	int			port, via;	/* "via" is the port 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;
};

/* 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(const 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 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);

/* 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);

#endif


Mode Type Size Ref File
100644 blob 70 9964a59b5d89f394cc4250ed6d6ce67a5f0cd196 .gitignore
100644 blob 1945 fecf0e7a7e8580485101a179685aedc7e00affbb Changelog.pre109
100644 blob 25504 b7e33ed4916a779af85b159240f2db042dcf5749 Conn.c
100644 blob 820 77f3d32a7beb5f3d5e00daa043634309d144d016 Conn.h
100644 blob 726 64b1bad93a84f87c3e93fc24ac5341db691ea578 Conn.spec.in
100644 blob 66 68138d781ca754b15e14c687da91ee261b2c41f3 Conn_config.h.in
100644 blob 19609 ff4c1b30c147990867f91566c9ea7ccf5749a0c0 Conn_engine_core.c
100644 blob 8392 754f621be0df3227c91d89956acd27b4cb4def23 Conn_engine_core.h
100644 blob 3601 bd8a8669bbfbafe3af4b1d3291041ed64577b73a Conn_engine_epoll.c
100644 blob 602 b648aaf1ad3c79ac5b6f425989aa5fee9a0d9f30 Conn_engine_epoll.h
100644 blob 2589 264b9b69fcb9dbda1c562316594208c753e4bacd Conn_engine_poll.c
100644 blob 589 f897f7d70dd5b17256cb51dce4637f0a8cf6291d Conn_engine_poll.h
100644 blob 30 d987fa5df957830331139935d517009e2911b0cf INSTALL
100644 blob 25275 92b8903ff3fea7f49ef5c041b67a087bca21c5ec LICENSE
100644 blob 1255 976d5d795aae2df1b265bb7bb19f9c1761db98e3 Makefile.in
100644 blob 192 5b11bdfb23857d8588845465aef993b320596b44 README
100644 blob 1612 705e412028cffeccaec7303e23fa81e9e78ae6e5 TODO
100755 blob 23 d33bb6c4ecdce1390ce1db3c79ea3b93e22ea755 configure
040000 tree - d4c9c4a69c5cfa2a84316967185f1661b6817779 docs
100755 blob 10344 8acd6afdceefbb056b57e9d09a9943857800df8e duilder
100644 blob 276 348b1930873b2a9aa3498c76af57a28cd62e79fa duilder.conf
040000 tree - 267133ee1eb21f456dd3840596a7941f761bb471 examples
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