#include "sys.h"

/* format of REMOTE FROM lines */
extern char *REMFROMRE;
extern int REMSENDERMATCH;
extern int REMDATEMATCH;
extern int REMSYSMATCH;

/* format of mailbox FROM lines */
#define IS_HEADER(p) ((p)[0]=='F'&&(p)[1]=='r'&&(p)[2]=='o'&&(p)[3]=='m'&&(p)[4]==' ')
#define IS_TRAILER(p) ((p)[0]=='m'&&(p)[1]=='o'&&(p)[2]=='r'&&(p)[3]=='F'&&(p)[4]=='\n')
extern char *FROMRE;
extern int SENDERMATCH;
extern int DATEMATCH;

enum
{
	Elemlen= 28,
	Errlen=	128,
	Pathlen= 256,
	
	RetryCode = 2
};

/*
 *  routines in mail.c
 */
extern int	print_header(Biobuf*, char*, char*);
extern int	print_remote_header(Biobuf*, char*, char*, char*);
extern int	parse_header(char*, String*, String*);

/*
 *  routines in aux.c
 */
extern String	*abspath(char*, char*, String*);
extern String	*mboxpath(char*, char*, String*, int);
extern char	*basename(char*);
extern int	delivery_status(String*);
extern void	append_match(Resub*, String*, int);
extern int	shellchars(char*);
extern String*	escapespecial(String*);
extern String*	unescapespecial(String*);
extern int	returnable(char*);

/* in copymessage */
extern int	appendfiletombox(int, int);
extern int	appendfiletofile(int, int);

/* mailbox types */
#define MF_NORMAL 0
#define MF_PIPE 1
#define MF_FORWARD 2
#define MF_NOMBOX 3
#define MF_NOTMBOX 4

/* a pipe between parent and child*/
typedef struct {
	Biobuf	bb;
	Biobuf	*fp;	/* parent process end*/
	int	fd;	/* child process end*/
} stream;

/* a child process*/
typedef struct process{
	stream	*std[3];	/* standard fd's*/
	int	pid;		/* process identifier*/
	int	status;		/* exit status*/
	Waitmsg	*waitmsg;
} process;

extern stream	*instream(void);
extern stream	*outstream(void);
extern void	stream_free(stream*);
extern process	*noshell_proc_start(char**, stream*, stream*, stream*, int, char*);
extern process	*proc_start(char*, stream*, stream*, stream*, int, char*);
extern int	proc_wait(process*);
extern int	proc_free(process*);
extern int	proc_kill(process*);


