text: typedef struct Event Event;
  typedef struct Exec Exec;
  typedef struct Message Message;
  typedef struct Window Window;
  
  enum
  {
  	STACK		= 8192,
  	EVENTSIZE	= 256,
  	NEVENT		= 5
  };
  
  struct Event
  {
  	int	c1;
  	int	c2;
  	int	q0;
  	int	q1;
  	int	flag;
  	int	nb;
  	int	nr;
  	char	b[EVENTSIZE*UTFmax+1];
  	Rune	r[EVENTSIZE+1];
  };
  
  struct Window
  {
  	/* coordinate wineventproc and window thread */
  	QLock	lk;
  	int		ref;
  
  	/* file descriptors */
  	CFid*		ctl;
  	CFid*		event;
  	CFid*		addr;
  	CFid*		data;
  	CFid*		body;
  
  	/* event input */
  	char		buf[512];
  	char		*bufp;
  	int		nbuf;
  	Event	e[NEVENT];
  
  	int		id;
  	int		open;
  	Channel	*cevent;
  };
  
  struct Message
  {
  	Window	*w;
  	CFid*	ctlfd;
  	char		*name;
  	char		*replyname;
  	uchar	opened;
  	uchar	dirty;
  	uchar	isreply;
  	uchar	deleted;
  	uchar	writebackdel;
  	uchar	tagposted;
  	uchar	recursed;
  	uchar	level;
  	uint		replywinid;
  
  	/* header info */
  	char		*from;
  	char		*fromcolon;
  	char		*to;
  	char		*cc;
  	char		*replyto;
  	char		*sender;
  	char		*date;
  	char		*subject;
  	char		*type;
  	char		*disposition;
  	char		*filename;
  	char		*digest;
  
  	Message	*next;	/* next in this mailbox */
  	Message	*prev;	/* prev in this mailbox */
  	Message	*head;	/* first subpart */
  	Message	*tail;		/* last subpart */
  };
  
  enum
  {
  	NARGS		= 100,
  	NARGCHAR	= 8*1024,
  	EXECSTACK 	= STACK+(NARGS+1)*sizeof(char*)+NARGCHAR
  };
  
  struct Exec
  {
  	char		*prog;
  	char		**argv;
  	int		p[2];	/* p[1] is write to program; p[0] set to prog fd 0*/
  	int		q[2];	/* q[0] is read from program; q[1] set to prog fd 1 */
  	Channel	*sync;
  };
  
  extern	Window*	newwindow(void);
  extern	CFid*	winopenfile(Window*, char*);
  extern	void		winopenbody(Window*, int);
  extern	void		winclosebody(Window*);
  extern	void		wintagwrite(Window*, char*, int);
  extern	void		winname(Window*, char*);
  extern	void		winwriteevent(Window*, Event*);
  extern	void		winread(Window*, uint, uint, char*);
  extern	int		windel(Window*, int);
  extern	void		wingetevent(Window*, Event*);
  extern	void		wineventproc(void*);
  extern	void		winwritebody(Window*, char*, int);
  extern	void		winclean(Window*);
  extern	int		winselect(Window*, char*, int);
  extern	char*	winselection(Window*);
  extern	int		winsetaddr(Window*, char*, int);
  extern	char*	winreadbody(Window*, int*);
  extern	void		windormant(Window*);
  extern	void		winsetdump(Window*, char*, char*);
  extern	void		winincref(Window*);
  extern	void		windecref(Window*);
  
  extern	void		readmbox(Message*, char*, char*);
  extern	void		rewritembox(Window*, Message*);
  
  extern	void		mkreply(Message*, char*, char*, Plumbattr*, char*);
  extern	void		delreply(Message*);
  
  extern	int		mesgadd(Message*, char*, Dir*, char*);
  extern	void		mesgmenu(Window*, Message*);
  extern	void		mesgmenunew(Window*, Message*);
  extern	int		mesgopen(Message*, char*, char*, Message*, int, char*);
  extern	void		mesgctl(void*);
  extern	void		mesgsend(Message*);
  extern	void		mesgdel(Message*, Message*);
  extern	void		mesgmenudel(Window*, Message*, Message*);
  extern	void		mesgmenumark(Window*, char*, char*);
  extern	void		mesgmenumarkdel(Window*, Message*, Message*, int);
  extern	Message*	mesglookup(Message*, char*, char*);
  extern	Message*	mesglookupfile(Message*, char*, char*);
  extern	void		mesgfreeparts(Message*);
  extern	int		mesgcommand(Message*, char*);
  
  extern	char*	info(Message*, int, int);
  extern	char*	readfile(char*, char*, int*);
  extern	char*	readbody(char*, char*, int*);
  extern	void		ctlprint(CFid*, char*, ...);
  extern	void*	emalloc(uint);
  extern	void*	erealloc(void*, uint);
  extern	char*	estrdup(char*);
  extern	char*	estrstrdup(char*, char*);
  extern	char*	egrow(char*, char*, char*);
  extern	char*	eappend(char*, char*, char*);
  extern	void		error(char*, ...);
  extern	int		tokenizec(char*, char**, int, char*);
  extern	void		execproc(void*);
  extern	int		fsprint(CFid*, char*, ...);
  
  #pragma	varargck	argpos	error	1
  #pragma	varargck	argpos	ctlprint	2
  
  extern	Window	*wbox;
  extern	Message	mbox;
  extern	Message	replies;
  extern	char		*fsname;
  extern	CFid		*plumbsendfd;
  extern	CFid		*plumbseemailfd;
  extern	char		*home;
  extern	char		*outgoing;
  extern	char		*mailboxdir;
  extern	char		*mboxname;
  extern	char		*user;
  extern	char		*srvname;
  extern	char		deleted[];
  extern	int		wctlfd;
  extern	int		shortmenu;
  
  extern	CFsys	*mailfs;
  extern	CFsys	*acmefs;
  