/*
 *  connection.h - connection description structures and functions - header
 * 
 *  nc6 - an advanced netcat clone
 *  Copyright (C) 2002-2006 Chris Leishman <chris _at_ leishman.org>
 *  Copyright (C) 2001-2006 Mauro Tortonesi <mauro _at_ deepspace6.net>
 *
 *  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 2 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, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */  
#ifndef CONNECTION_H
#define CONNECTION_H

#include "io_stream.h"
#include <netdb.h>
#include <sys/time.h>


typedef enum sock_family {
	PROTO_UNSPECIFIED,
	PROTO_IPv6,
	PROTO_IPv4,
	PROTO_BLUEZ
} sock_family_t;

typedef enum sock_protocol {
	TCP_PROTOCOL,
	UDP_PROTOCOL,
	SCO_PROTOCOL,
	L2CAP_PROTOCOL
} sock_protocol_t;

typedef struct address
{
	char *address;
	char *service;
} address_t;

#define address_init(AD)	((AD)->address = (AD)->service = NULL)


typedef struct connection_attributes
{
	sock_family_t family;
	sock_protocol_t protocol;
	address_t remote_address;
	address_t local_address;
	int flags;
	size_t buffer_size;
	size_t remote_mtu;
	size_t remote_nru;
	size_t sndbuf_size;
	size_t rcvbuf_size;
	int connect_timeout;
	int idle_timeout;
	int local_hold_timeout;
	int remote_hold_timeout;
	bool remote_half_close_suppress;
	bool local_half_close_suppress;
	char *local_exec;
} connection_attributes_t;

/* CA flags */
#define CA_NUMERIC_MODE		0x000001
#define CA_STRICT_IPV6		0x000002
#define CA_DONT_REUSE_ADDR	0x000004
#define CA_LISTEN_MODE		0x000008
#define CA_CONNECT_MODE		0x000010
#define CA_RECV_DATA_ONLY	0x000020
#define CA_SEND_DATA_ONLY	0x000040
#define CA_DISABLE_NAGLE	0x000080
#define CA_CONTINUOUS_ACCEPT	0x000100

void ca_init(connection_attributes_t *attrs);
void ca_destroy(connection_attributes_t *attrs);

#define ca_set_family(CA, FAMILY)	((CA)->family = (FAMILY))
#define ca_family(CA)			((CA)->family)
#define ca_set_protocol(CA, PROTO)	((CA)->protocol = (PROTO))
#define ca_protocol(CA)			((CA)->protocol)

#define ca_remote_address(CA)	((const address_t *)&((CA)->remote_address))
#define ca_local_address(CA)	((const address_t *)&((CA)->local_address))
#define ca_set_remote_addr(CA, ADDR)	((CA)->remote_address = (ADDR))
#define ca_set_local_addr(CA, ADDR)	((CA)->local_address  = (ADDR))

#define ca_connect_func(CA)		((CA)->connect)
#define ca_set_connect_func(CA, FUNC)	((CA)->connect = (FUNC))
#define ca_listen_func(CA)		((CA)->listen)
#define ca_set_listen_func(CA, FUNC)	((CA)->listen = (FUNC))

#define ca_is_flag_set(CA, FLG)		((CA)->flags & (FLG))
#define ca_set_flag(CA, FLG)		((CA)->flags |=  (FLG))
#define ca_clear_flag(CA, FLG)		((CA)->flags &= ~(FLG))

#define ca_buffer_size(CA)		((CA)->buffer_size)
#define ca_set_buffer_size(CA, SZ)	((CA)->buffer_size = (SZ))

#define ca_remote_MTU(CA)		((CA)->remote_mtu)
#define ca_set_remote_MTU(CA, MTU)	((CA)->remote_mtu = (MTU))

#define ca_remote_NRU(CA)		((CA)->remote_nru)
#define ca_set_remote_NRU(CA, NRU)	((CA)->remote_nru = (NRU))

#define ca_sndbuf_size(CA)		((CA)->sndbuf_size)
#define ca_set_sndbuf_size(CA, SZ)	((CA)->sndbuf_size = (SZ))
	
#define ca_rcvbuf_size(CA)		((CA)->rcvbuf_size)
#define ca_set_rcvbuf_size(CA, SZ)	((CA)->rcvbuf_size = (SZ))
	
#define ca_connect_timeout(CA)		((CA)->connect_timeout)
#define ca_set_connect_timeout(CA, CT)	((CA)->connect_timeout = (CT))

#define ca_idle_timeout(CA)		((CA)->idle_timeout)
#define ca_set_idle_timeout(CA, CT)	((CA)->idle_timeout = (CT))

#define ca_remote_hold_timeout(CA)	((CA)->remote_hold_timeout)
#define ca_set_remote_hold_timeout(CA, T)		\
	((CA)->remote_hold_timeout = (T))
#define ca_local_hold_timeout(CA)	((CA)->local_hold_timeout)
#define ca_set_local_hold_timeout(CA, T)		\
	((CA)->local_hold_timeout = (T))

#define ca_remote_half_close_suppress(CA)		\
	((CA)->remote_half_close_suppress)
#define ca_set_remote_half_close_suppress(CA, B)	\
	((CA)->remote_half_close_suppress = (B))
#define ca_local_half_close_suppress(CA)		\
	((CA)->local_half_close_suppress)
#define ca_set_local_half_close_suppress(CA, B)	\
	((CA)->local_half_close_suppress = (B))

#define ca_local_exec(CA)		(const char*)(((CA)->local_exec))
void ca_set_local_exec(connection_attributes_t *attrs, const char *exec);
	
/* fill out an addrinfo structure with parameters from the ca */
void ca_to_addrinfo(struct addrinfo *ainfo,
		const connection_attributes_t *attrs);

#endif/*CONNECTION_H*/


syntax highlighted by Code2HTML, v. 0.9.1