#ifndef _MAILBOX_H
#define _MAILBOX_H
/* Defines for the ax.25 mailbox facility */
#define NUMMBX		40		/* max number of mailbox sessions */
#ifndef _TIMER_H
#include "timer.h"
#endif
#ifndef _AX25_h
#include "ax25.h"
#endif
#ifndef _CONFIG_H
#include "config.h"
#endif
#ifndef _TIPMAIL_H
#include "tipmail.h"
#endif
#include <time.h>

/* a mailbox entry */
struct let {
	long	start;
	long	size;
	long	bid;
	int16	status;
};

#define MAXPWDLEN 30
#define MBXLINE     128     /* max length of line */
struct mbx {
	int state ;				/* mailbox state */
#define MBX_LOGIN	0		/* trying to log in */
#define MBX_CMD		1		/* in command mode */
#define MBX_SUBJ	2		/* waiting for a subject line */
#define MBX_DATA	3		/* collecting the message */
#define MBX_REVFWD	4		/* reverse forwarding in progress */
#define MBX_TRYING	5		/* pending forwarding connection */
#define MBX_FORWARD	6		/* established forwarding connection */
#define MBX_GATEWAY 7       /* gatewaying somewhere */
#define MBX_READ    8       /* reading a message */
#define MBX_UPLOAD  9       /* uploading a file */
#define MBX_DOWNLOAD 10     /* downloading a file */
#define MBX_CONVERS 11      /* Using convers mode */
#define MBX_CHAT    12      /* Chatting with sysop */
#define MBX_WHAT    13      /* Listing files */
#define MBX_SYSOPTRY 14     /* Trying sysop */
#define MBX_SYSOP   15      /* Is sysop */
#define MBX_XMODEM_RX 16    /* receiving xmodem */    
#define MBX_XMODEM_TX 17    /* sending xmodem */
#define MBX_TUTOR   18      /* using Tutorial server */
    int family;             /* Type of incoming connection */
    char name[20] ;         /* Name of remote station */
    char call[AXALEN];      /* User call in shifted form, if applicable*/
    char *to ;          /* To-address in form user or user@host */
	char *origto ;			/* Original To-address, if rewritten */
	char *tofrom ;			/* Optional <from in to-address */
    char *origbbs ;         /* Original bbs, if tracing R: lines */
    char *tomsgid ;         /* Optional $msgid in to-address */
    char *subject ;         /* Message subject */
    char *date ;            /* Date of the message */
    FILE *tfile ;           /* Temporary file for message, or */
					/* forwarding file. */
    FILE *tfp;              /* Temporary file when reading R: headers */
    char line[MBXLINE+1] ;  /* Room for null at end */
	int mbnum ;		/* which mailbox session is this? */
	int32 sid ;		/* Characteristics indicated by the SID */
				/* banner of the attaching station.  If */
				/* no SID was sent, this is zero.  If an */
				/* SID of any kind was received, it is */
				/* assumed that the station supports */
				/* abbreviated mail forwarding mode. */
#define	MBX_SID		0x01	/* Got any SID */
#define	MBX_RLI_SID	0x02	/* This is an RLI BBS, disconnect after F> */
#define MBX_HIER_SID	0x04	/* The BBS supports "hierarchical routing */
				/* designators." */
#define MBX_FBB     	0x08    /* This is an FBB BBS */
#define MBX_FBBCOMP 	0x10	/* This FBB supports compression */
#define MBX_TNOS    	0x20	/* supports TNOS Compressed streams */
#define MBX_LL      	0x40	/* LAN-LINK system */
				/* Space here for others, currently not of */
				/* interest to us. */
#define MBX_EXPERT  	0x80	/* expert user status */
#define MBX_AREA    	0x100	/* show area in prompt */
#define MBX_NRID    	0x200	/* use netrom ident */
#define MBX_RDMOTD  	0x400	/* has read motd file */
#define MBX_STATS   	0x800	/* scan for new messages on login ? */
#define MBX_MID     	0x1000	/* BBS supports MID's */
#define MBX_GFX     	0x2000	/* use ANSI color graphics */
#define MBX_FBBFWD	0x4000  /* use FBB-style forwarding */
#define MBX_DELEGATE	0x8000  /* is forwarding delegation on */
    char stype ;        /* BBS send command type (B,P,T, etc.) */
    char special;		/* special mode flag for '~' and '^' */
	int type ;		/* Type of session when invoking "chat" */
	int user;		/* User linkage area */
	char escape;		/* Escape character */
	long privs;		/* Privileges (taken from Ftpusers file) */
#define AX25_CMD	8	/* AX.25 gateway operation allowed */
#define TELNET_CMD	16	/* Telnet gateway operation allowed */
#define NETROM_CMD	32	/* NET/ROM gateway operation allowed */
#define SYSOP_CMD	64	/* Remote sysop access allowed */
#define EXCLUDED_CMD	128	/* This user is banned from the BBS */
/* 256 and 512 are used in PPP*/
#define NO_SENDCMD  1024    /*Disallow send command*/
#define NO_READCMD  2048    /*Disallow read command*/
#define NO_3PARTY   4096    /*Disallow third-party mail*/
#define IS_BBS      8192    /*This user is a bbs*/
#define IS_EXPERT	16384	/*This user is an expert*/
#define NO_CONVERS  32768   /*Disallow convers command */
#define NO_ESCAPE   65536   /* Default is no escape */
#define NO_SLIP    131072	/* This user can't exit tipmail to do IP */
    char *path;     /* Directory path */
    char *startmsg;     /* Message to be sent at connect through any
				/* of the gateways */
    int current;        /* the current message number */
	int nmsgs;		/* number of messages in this mail box */
	int newmsgs;		/* number of new messages in mail box */
	int hmsgs;		/* number of held messages in this mail box */
	int change;		/* mail file changed */
#define CHG_READ	0x01
#define CHG_DELETE	0x02
	int anyread;		/* true if any message has been read */
	FILE *mfile;		/* mail data file pointer */
	char area[64];		/* name of current mail area */
    int isarea;         /* is the current mail area private or public ? */
    int morerows;       /* Number of lines before -more- prompt */
    int update;         /* Update the user preferences */
/* Next two are used by userlog code - WG7J */
	long lastread;		/* number of last read message in area */
    long newlastread;   /* id of new last listed message in area */
	long mboxsize;		/* size of mailbox when opened */
	long mysize;		/* size of my private mailbox */
	struct let *mbox;
    struct timer tdisc; /* Inactivity timeout timer - WG7J */
	char *stdinbuf;		/* the stdio buffer for the mail file */
	char *stdoutbuf;	/* the stdio file io buffer for the temp file */
	char *home;		/* the HOME BBS for this user */
	long logontime;		/* time of this login */
	struct tipcb *tip;       /* tip structure if tip mail incoming */
	char colorset[2];	/* current colorset */
	char usecolor;		/* use color this login ? */
	char inmessage;		/* are we in a message read/write? */
	char *realname;		/* user's real name */
	int linemode;
} ;
#define 	NULLMBX		(struct mbx *)0

/* Structure used for automatic flushing of gateway sockets */
struct gwalarm {
	int s1;
	int s2;
	struct timer t;
};


#ifdef FBBFWD
/* FBB Packet	*/
struct fbbpacket {
     int    number;          /* Message number in mail area.	*/
     int    accept;          /* NotActive = 0 / Reject(-) = 1	*/
                             /* Accept(+) = 2 / Defer(=)  = 3	*/
     char   fbbcmd[3];       /* FB ( FA when compression is added )	*/
     char   type;            /* (B)ulletin, (P)ersonal, (T)raffic/NTS	*/
     char   bid[15];         /* Hold makecl() modified bid.	*/
     char   *sline;          /* bufptr that holds the bbs send command	*/
                             /* used to enter a message onto the system.	*/
     char   *to;
     char   *from;
     char   *messageid;
     char   *area;
     char   *subject;
     int    size;
     FILE   *fwdfile;
     long   fwdfilesize;
     long   fwdfileindex;
};

/* A forward entry */
struct fwd {
    struct mbx *m;
    char bid[15];
    char subject[80];
    FILE *fwdfile;
    long fwdfileindex;
    struct fbbpacket *msglst;
};

#endif


/* Log all gateway connects to the logfile - WG7J */
#define GWTRACE 1

/* In converse.c */
void mbox_converse __ARGS((int fd,char *name,int channel,struct mbx *mbox));
extern int ShowConfLinks __ARGS((int s,int full));
extern int ShowConfUsers __ARGS((int s));

/* In mailbox.c */
extern struct mbx *Mbox[NUMMBX] ;
extern char Noperm[];
extern char Nosock[];
extern void (*Listusers) __ARGS((int s));
extern int ThirdParty;
extern int Mtrace;

int dombescape __ARGS((int argc,char *argv[],void *p));
int mbxrecvline __ARGS((struct mbx *m));
int gw_connect __ARGS((struct mbx *m,int s,struct sockaddr *fsocket,int len));

void mbx_incom __ARGS((int s,void *t,void *p));
int domboxdisplay __ARGS((int argc,char *argv[],void *p));
struct mbx *newmbx __ARGS((void));
void exitbbs __ARGS((struct mbx *m));
int domboxbye __ARGS((int argc,char *argv[],void *p));
int mbx_parse __ARGS((struct mbx *m));
void changearea __ARGS((struct mbx *m,char *area,int setit));
char *rewrite_address __ARGS((char *addr));
void listusers __ARGS((int s));
void bbscolorcls __ARGS((struct mbx *m));
void bbscolorchange __ARGS((struct mbx *m,unsigned char *str));
void putprompt __ARGS((struct mbx *m));
int doxmodem __ARGS((char mode,char *filename,void *p));
int dombtelnet __ARGS((int argc,char *argv[],void *p));
int dombports __ARGS((int argc,char *argv[],void *p));

/* In mailbox2.c */
int dombupload __ARGS((int argc,char *argv[],void *p));

/* in mboxcmd.c */
extern char Mbnrid[];
int dombuserinfo __ARGS((int argc,char *argv[],void *p));
time_t loguser __ARGS((struct mbx *m));
void setmbnrid __ARGS((void));
void listnewmail(struct mbx *m);

/* In forward.c: */
int dorevfwd __ARGS((int argc,char *argv[],void *p));
int dombtimer __ARGS((int argc,char *argv[],void *p));
int dombkick __ARGS((int argc,char *argv[],void *p));

/* In tipmail.c */
extern unsigned Tiptimeout;

#ifdef TUTOR
/* In tutor.c */
void mbscripthook __ARGS((struct mbx *m,char *hookfile));
#endif

#endif	/* _MAILBOX_H */

