/*
 * This source file is Copyright 1995 by Evan Scott.
 * All rights reserved.
 * Permission is granted to distribute this file provided no
 * fees beyond distribution costs are levied.
 */


typedef union {
	struct {
		b8 a;
		b8 b;
		b8 c;
		b8 d;
	} dot;
	b32 l;
} ipnum;

typedef union {
	struct {
		b8 a;
		b8 b;
	} dot;
	b16 w;
} portnum;

/* something like an iorequest ... probably a real exec device
   implementation would be good, but for now just DIY */

typedef struct tcpm {
	struct	Message header;
	
	magic_verify;
	
	b32	command;
	void	*ident;		/* stores pointer to context information */
	
	ipnum	address;
	portnum	port;
	
	void	*data;
	struct	tcpm	*interrupt;
	b32	length;
	
	b32	result;
	b32	error;
	b32	flags;
	b32	userid;
	void	*userdata;
} tcpmessage;

typedef struct {
	magic_verify;

	sb32	fd;
	void	*connecting_port;
	boolean	eof;
} tcpident;

#define V_tcpmessage 4159
#define	V_tcpident 7592

/* commands */
#define TCP_NOOP	0
#define	TCP_CONNECT	1
#define	TCP_LISTEN	2
#define TCP_READ	3
#define TCP_WRITE	4
#define TCP_CLOSE	5
#define TCP_INTERRUPT	6

/* hmmm, keep these??? */
#define TCP_NEWMESSAGE	7
#define TCP_DISPOSE	8

/* internal */
#define TCP_CONNECTED	9	/* CONNECT reply */
#define TCP_ACCEPTED	10	/* Async ACCEPT */
#define TCP_WRITTEN	11	/* WRITE reply (not used) */
#define TCP_GOT		12	/* READ reply (not used) */
#define TCP_STARTUP	13	/* STARTUP was successful/unsuccessful */

#define TCP_DIE		14

/* info */
#define TCP_PEERNAME	15
#define TCP_SERVICE	16

/* errors */
#define	NO_ERROR		0
#define ERROR_OOM		1
#define ERROR_UNKNOWN_COMMAND	2
#define ERROR_NO_CONNECTION	3
#define ERROR_LOST_CONNECTION	4
#define ERROR_ALREADY_CONNECTED	5
#define ERROR_ACCESS_DENIED	6
#define ERROR_EOF		7
#define ERROR_INTERRUPTED	8
#define ERROR_UNKNOWN_HOST	9
#define ERROR_CANT_CONNECT	10
#define ERROR_UNREACHABLE	11
#define ERROR_CONNECT_REFUSED	12

/* flags */
#define FLAG_READLINE		1

void __saveds __asm tcp_handler(register __a0 b8 *parent_port);
void unique_name(void *, b8 *, b8 *);

