/*
 *  tsock.h
 *	rotinas de comunicacoes via sockets
 *
 */

/*
============================== C O P Y R I G H T ==============================

See the file copyright.txt in the root directory for copyright statement.

===============================================================================
*/

#ifndef __TSOCK_H__

#define __TSOCK_H__


#ifdef TP_OS_WINDOWS
#include <malloc.h>
#ifndef TP_OSVER_WIN32
#include <stdlib.h>
#endif
#endif
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <math.h>

#include "tc_sock.h"

#ifdef TP_OS_WINDOWS
#include <winsock.h>
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/ioctl.h>
#endif

	/*** definicao de tipos para os sockets ***/
#ifndef TP_OS_WINDOWS
	typedef int					SOCKET;
	typedef struct sockaddr *	LPSOCKADDR;
#define INVALID_SOCKET		-1
#define SOCKET_ERROR		-1
	typedef struct hostent *	LPHOSTENT;
	typedef struct servent *	LPSERVENT;
#define closesocket				close
#define ioctlsocket				ioctl
#endif	/* ifndef TP_OS_WINDOWS */

#ifdef TP_OS_OS400
/*
 * Port/socket numbers: network standard functions
 */
#define IPPORT_ECHO             7
#define IPPORT_DISCARD          9
#define IPPORT_SYSTAT           11
#define IPPORT_DAYTIME          13
#define IPPORT_NETSTAT          15
#define IPPORT_FTP              21
#define IPPORT_TELNET           23
#define IPPORT_SMTP             25
#define IPPORT_TIMESERVER       37
#define IPPORT_NAMESERVER       42
#define IPPORT_WHOIS            43
#define IPPORT_MTP              57

/*
 * Port/socket numbers: host specific functions
 */
#define IPPORT_TFTP             69
#define IPPORT_RJE              77
#define IPPORT_FINGER           79
#define IPPORT_TTYLINK          87
#define IPPORT_SUPDUP           95

/*
 * UNIX TCP sockets
 */
#define IPPORT_EXECSERVER       512
#define IPPORT_LOGINSERVER      513
#define IPPORT_CMDSERVER        514
#define IPPORT_EFSSERVER        520

/*
 * UNIX UDP sockets
 */
#define IPPORT_BIFFUDP          512
#define IPPORT_WHOSERVER        513
#define IPPORT_ROUTESERVER      520
                                        /* 520+1 also used */

/*
 * Ports < IPPORT_RESERVED are reserved for
 * privileged processes (e.g. root).
 */
#define IPPORT_RESERVED         1024

#endif	/* ifdef TP_OS_OS400 */

#ifdef TP_OS_WINDOWS	
#define FUNC_SOCK_ERROR		WSAGetLastError()
#else
#define FUNC_SOCK_ERROR		errno
#endif

#endif	/* #ifndef __NO_INC_TPORT_SOCK */

#define SERVICE_ANY			"*ANY"
#define HOST_BROADCAST		"*BROADCAST"
#define HOST_LOCAL			"*LOCAL"

#define MAXHOSTNAME   128   /* Maximum length of a DNS hostname */
#define MAXADDRSTR    16    /* Maximum length of an IP Address string */

/*
 * Tipos de dados
 */
#ifndef TP_OS_WINDOWS

#define FALSE	0
#define TRUE	1

	typedef short				BOOL;
	typedef unsigned char		BYTE;
	typedef unsigned short		WORD;
#if defined(TP_HWD_ALPHA)
	typedef unsigned int		DWORD;
#else
	typedef unsigned long		DWORD;
#endif

	typedef WORD FAR*			LPWORD;
	typedef DWORD FAR*			LPDWORD;
	typedef char FAR*			LPSTR;
	typedef const char FAR*		LPCSTR;
	typedef BYTE FAR*			LPBYTE;
	typedef unsigned int		UINT;
	typedef unsigned int FAR*	LPUINT;
	typedef void FAR*			LPVOID;

#endif /* ifndef TP_OS_WINDOWS */

#ifndef TP_OSVER_WIN32
	typedef const void FAR*		LPCVOID;
#endif
	typedef const BYTE FAR*		LPCBYTE;

	typedef short				int16;
	typedef int16 FAR*			LPINT16;
#if defined(TP_HWD_ALPHA)
	typedef int					int32;
#else
	typedef long				int32;
#endif
	typedef int32 FAR*			LPINT32;
	typedef unsigned char		opaque;


/*
 * prototipos das funcoes
 */
#ifdef __cplusplus
	extern "C"
	{
#endif

/* TS_API_VF_GENERIC */
WORD APIENTRY sock_cksum(LPCBYTE lpBuffer,	/*(I)*/
						 size_t nLen		/*(I)*/
						 );

BOOL APIENTRY sock_startup(void);

void APIENTRY sock_cleanup(void);

/* TS_API_VF_OPT */
int APIENTRY sock_set_ttl(SOCKET s,			/*(IO)*/
						  int nTimeToLive	/*(I)*/
						  );

int APIENTRY sock_set_timeout(SOCKET s,			/*(IO)*/
							  int nTimeOut,		/*(I) timout in milisec */
							  int opt			/*(I) SO_RCVTIMO ou SO_SNDTIMEO */
							  );

int APIENTRY sock_set_broadcast(SOCKET s		/*(IO)*/
								);

/* TS_API_VF_IO */
#define sock_create_icmp(s)			sock_create(s, "icmp", SOCK_RAW, IPPROTO_ICMP)

#define sock_create_stream(s)		sock_create(s, "tcp", SOCK_STREAM, IPPROTO_TCP)

#define sock_create_dgram(s)		sock_create(s, "udp", SOCK_DGRAM, IPPROTO_UDP)

SOCKET APIENTRY sock_create(LPCSTR lpcszService,	/*(I) numero de porta ou nome do servico */
							LPCSTR lpcszProtocolo,	/*(I) protolo do servico */
							int tipo,				/*(I) tipo de socket: SOCK_DGRAM, SOCK_STREAM, ... */
							int proto				/*(I) protocolo: IPPROTO_TCP, ... */
							);

SOCKET APIENTRY sock_listen_accept(SOCKET srv_sock,				/*(I)*/
								   struct sockaddr FAR* addr, 	/*(O)*/
								   int FAR* addrlen				/*(O)*/
								   );

BOOL APIENTRY sock_connect(SOCKET sock,				/*(I)*/
						   LPCSTR lpcszHost,		/*(I)*/
						   LPCSTR lpcszServico,		/*(I)*/
						   LPCSTR lpcszProtocolo	/*(I)*/
						   );

#define sock_open_icmp(h, s)		sock_open(h, s, "icmp", SOCK_RAW, IPPROTO_ICMP)

#define sock_open_stream(h, s)		sock_open(h, s, "tcp", SOCK_STREAM, IPPROTO_TCP)

#define sock_open_dgram(h, s)		sock_open(h, s, "udp", SOCK_DGRAM, IPPROTO_UDP)

#define sock_open_broadcast(s)		sock_open_dgram(HOST_BROADCAST, s)

SOCKET APIENTRY sock_open(LPCSTR lpcszHost,			/*(I)*/
						  LPCSTR lpcszService,		/*(I) numero de porta ou nome do servico */
						  LPCSTR lpcszProtocolo,	/*(I) protocolo do servico: "tcp", "udp", ... */
						  int tipo,					/*(I) tipo de socket: SOCK_STREAM, ... */
						  int proto					/*(I) protocolo: IPPROTO_TCP, ... */
						  );

short APIENTRY sock_close(SOCKET sock	/*(I)*/
						  );

int APIENTRY sock_send_n(SOCKET sock,					/*(I)*/
						 const LPBYTE buffer_snd,		/*(I)*/
						 int buf_len					/*(I)*/
						 );

DWORD APIENTRY sock_get_queued_bytes(SOCKET fd		/*(I)*/
									 );

int APIENTRY sock_recv_n(SOCKET sock,			/*(I)*/
						 LPBYTE buffer_rcv,		/*(O)*/
						 int buf_len			/*(I)*/
						 );

/* TS_API_VF_ADDR */
short APIENTRY sock_get_service(LPCSTR lpcszServico,		/*(I) nome do servico ou numero de porta */
								LPCSTR lpcszProtocolo		/*(I)*/
								);

u_long APIENTRY sock_get_local_ip(void);

u_long APIENTRY sock_get_host_ip(LPCSTR lpcszHost		/*(I)*/
								 );

BOOL APIENTRY sock_mkaddr(struct sockaddr_in FAR* lpsrv_addr,	/*(O)*/
						  LPCSTR lpcszHost,						/*(I)*/
						  LPCSTR lpcszServico,					/*(I)*/
						  LPCSTR lpcszProtocolo					/*(I)*/
						  );


#ifdef __cplusplus
	}
#endif

#endif	/* ifndef __TSOCK_H__ */


