1*3e12c5d1SDavid du Colombier #include "sys.h" 2*3e12c5d1SDavid du Colombier 3*3e12c5d1SDavid du Colombier /* format of REMOTE FROM lines */ 4*3e12c5d1SDavid du Colombier extern char *REMFROMRE; 5*3e12c5d1SDavid du Colombier extern int REMSENDERMATCH; 6*3e12c5d1SDavid du Colombier extern int REMDATEMATCH; 7*3e12c5d1SDavid du Colombier extern int REMSYSMATCH; 8*3e12c5d1SDavid du Colombier 9*3e12c5d1SDavid du Colombier /* format of mailbox FROM lines */ 10*3e12c5d1SDavid du Colombier #define IS_HEADER(p) ((p)[0]=='F'&&(p)[1]=='r'&&(p)[2]=='o'&&(p)[3]=='m'&&(p)[4]==' ') 11*3e12c5d1SDavid du Colombier #define IS_TRAILER(p) ((p)[0]=='m'&&(p)[1]=='o'&&(p)[2]=='r'&&(p)[3]=='F'&&(p)[4]=='\n') 12*3e12c5d1SDavid du Colombier extern char *FROMRE; 13*3e12c5d1SDavid du Colombier extern int SENDERMATCH; 14*3e12c5d1SDavid du Colombier extern int DATEMATCH; 15*3e12c5d1SDavid du Colombier 16*3e12c5d1SDavid du Colombier /* 17*3e12c5d1SDavid du Colombier * routines in mail.c 18*3e12c5d1SDavid du Colombier */ 19*3e12c5d1SDavid du Colombier extern int print_header(Biobuf*, char*, char*); 20*3e12c5d1SDavid du Colombier extern int print_remote_header(Biobuf*, char*, char*, char*); 21*3e12c5d1SDavid du Colombier extern int parse_header(char*, String*, String*); 22*3e12c5d1SDavid du Colombier 23*3e12c5d1SDavid du Colombier /* 24*3e12c5d1SDavid du Colombier * routines in aux.c 25*3e12c5d1SDavid du Colombier */ 26*3e12c5d1SDavid du Colombier extern String *abspath(char*, char*, String*); 27*3e12c5d1SDavid du Colombier extern String *mboxpath(char*, char*, String*, int); 28*3e12c5d1SDavid du Colombier extern char *basename(char*); 29*3e12c5d1SDavid du Colombier extern int delivery_status(String*); 30*3e12c5d1SDavid du Colombier extern void append_match(Resub*, String*, int); 31*3e12c5d1SDavid du Colombier extern int shellchars(char*); 32*3e12c5d1SDavid du Colombier 33*3e12c5d1SDavid du Colombier /* mailbox types */ 34*3e12c5d1SDavid du Colombier #define MF_NORMAL 0 35*3e12c5d1SDavid du Colombier #define MF_PIPE 1 36*3e12c5d1SDavid du Colombier #define MF_FORWARD 2 37*3e12c5d1SDavid du Colombier #define MF_NOMBOX 3 38*3e12c5d1SDavid du Colombier #define MF_NOTMBOX 4 39*3e12c5d1SDavid du Colombier 40*3e12c5d1SDavid du Colombier /* a pipe between parent and child*/ 41*3e12c5d1SDavid du Colombier typedef struct { 42*3e12c5d1SDavid du Colombier Biobuf bb; 43*3e12c5d1SDavid du Colombier Biobuf *fp; /* parent process end*/ 44*3e12c5d1SDavid du Colombier int fd; /* child process end*/ 45*3e12c5d1SDavid du Colombier } stream; 46*3e12c5d1SDavid du Colombier 47*3e12c5d1SDavid du Colombier /* a child process*/ 48*3e12c5d1SDavid du Colombier typedef struct process{ 49*3e12c5d1SDavid du Colombier stream *std[3]; /* standard fd's*/ 50*3e12c5d1SDavid du Colombier int pid; /* process identifier*/ 51*3e12c5d1SDavid du Colombier int status; /* exit status*/ 52*3e12c5d1SDavid du Colombier } process; 53*3e12c5d1SDavid du Colombier 54*3e12c5d1SDavid du Colombier extern stream *instream(void); 55*3e12c5d1SDavid du Colombier extern stream *outstream(void); 56*3e12c5d1SDavid du Colombier extern void stream_free(stream*); 57*3e12c5d1SDavid du Colombier extern process *proc_start(char*, stream*, stream*, stream*, int); 58*3e12c5d1SDavid du Colombier extern int proc_wait(process*); 59*3e12c5d1SDavid du Colombier extern int proc_free(process*); 60*3e12c5d1SDavid du Colombier extern int proc_kill(process*); 61*3e12c5d1SDavid du Colombier 62*3e12c5d1SDavid du Colombier /* tell compiler we're using a value so it won't complain */ 63*3e12c5d1SDavid du Colombier #define USE(x) if(x) 64