1 typedef struct Event Event;
2 typedef struct Exec Exec;
3 typedef struct Message Message;
4 typedef struct Window Window;
5 
6 enum
7 {
8 	STACK		= 8192,
9 	EVENTSIZE	= 256,
10 	NEVENT		= 5
11 };
12 
13 struct Event
14 {
15 	int	c1;
16 	int	c2;
17 	int	q0;
18 	int	q1;
19 	int	flag;
20 	int	nb;
21 	int	nr;
22 	char	b[EVENTSIZE*UTFmax+1];
23 	Rune	r[EVENTSIZE+1];
24 };
25 
26 struct Window
27 {
28 	/* coordinate wineventproc and window thread */
29 	QLock	lk;
30 	int		ref;
31 
32 	/* file descriptors */
33 	CFid*		ctl;
34 	CFid*		event;
35 	CFid*		addr;
36 	CFid*		data;
37 	CFid*		body;
38 
39 	/* event input */
40 	char		buf[512];
41 	char		*bufp;
42 	int		nbuf;
43 	Event	e[NEVENT];
44 
45 	int		id;
46 	int		open;
47 	Channel	*cevent;
48 };
49 
50 struct Message
51 {
52 	Window	*w;
53 	CFid*	ctlfd;
54 	char		*name;
55 	char		*replyname;
56 	uchar	opened;
57 	uchar	dirty;
58 	uchar	isreply;
59 	uchar	deleted;
60 	uchar	writebackdel;
61 	uchar	tagposted;
62 	uchar	recursed;
63 	uchar	level;
64 	uint		replywinid;
65 
66 	/* header info */
67 	char		*from;
68 	char		*fromcolon;
69 	char		*to;
70 	char		*cc;
71 	char		*replyto;
72 	char		*sender;
73 	char		*date;
74 	char		*subject;
75 	char		*type;
76 	char		*disposition;
77 	char		*filename;
78 	char		*digest;
79 
80 	Message	*next;	/* next in this mailbox */
81 	Message	*prev;	/* prev in this mailbox */
82 	Message	*head;	/* first subpart */
83 	Message	*tail;		/* last subpart */
84 };
85 
86 enum
87 {
88 	NARGS		= 100,
89 	NARGCHAR	= 8*1024,
90 	EXECSTACK 	= STACK+(NARGS+1)*sizeof(char*)+NARGCHAR
91 };
92 
93 struct Exec
94 {
95 	char		*prog;
96 	char		**argv;
97 	int		p[2];	/* p[1] is write to program; p[0] set to prog fd 0*/
98 	int		q[2];	/* q[0] is read from program; q[1] set to prog fd 1 */
99 	Channel	*sync;
100 };
101 
102 extern	Window*	newwindow(void);
103 extern	CFid*	winopenfile(Window*, char*);
104 extern	void		winopenbody(Window*, int);
105 extern	void		winclosebody(Window*);
106 extern	void		wintagwrite(Window*, char*, int);
107 extern	void		winname(Window*, char*);
108 extern	void		winwriteevent(Window*, Event*);
109 extern	void		winread(Window*, uint, uint, char*);
110 extern	int		windel(Window*, int);
111 extern	void		wingetevent(Window*, Event*);
112 extern	void		wineventproc(void*);
113 extern	void		winwritebody(Window*, char*, int);
114 extern	void		winclean(Window*);
115 extern	int		winselect(Window*, char*, int);
116 extern	char*	winselection(Window*);
117 extern	int		winsetaddr(Window*, char*, int);
118 extern	char*	winreadbody(Window*, int*);
119 extern	void		windormant(Window*);
120 extern	void		winsetdump(Window*, char*, char*);
121 extern	void		winincref(Window*);
122 extern	void		windecref(Window*);
123 
124 extern	void		readmbox(Message*, char*, char*);
125 extern	void		rewritembox(Window*, Message*);
126 
127 extern	void		mkreply(Message*, char*, char*, Plumbattr*, char*);
128 extern	void		delreply(Message*);
129 
130 extern	int		mesgadd(Message*, char*, Dir*, char*);
131 extern	void		mesgmenu(Window*, Message*);
132 extern	void		mesgmenunew(Window*, Message*);
133 extern	int		mesgopen(Message*, char*, char*, Message*, int, char*);
134 extern	void		mesgctl(void*);
135 extern	void		mesgsend(Message*);
136 extern	void		mesgdel(Message*, Message*);
137 extern	void		mesgmenudel(Window*, Message*, Message*);
138 extern	void		mesgmenumark(Window*, char*, char*);
139 extern	void		mesgmenumarkdel(Window*, Message*, Message*, int);
140 extern	Message*	mesglookup(Message*, char*, char*);
141 extern	Message*	mesglookupfile(Message*, char*, char*);
142 extern	void		mesgfreeparts(Message*);
143 extern	int		mesgcommand(Message*, char*);
144 
145 extern	char*	info(Message*, int, int);
146 extern	char*	readfile(char*, char*, int*);
147 extern	char*	readbody(char*, char*, int*);
148 extern	void		ctlprint(CFid*, char*, ...);
149 extern	void*	emalloc(uint);
150 extern	void*	erealloc(void*, uint);
151 extern	char*	estrdup(char*);
152 extern	char*	estrstrdup(char*, char*);
153 extern	char*	egrow(char*, char*, char*);
154 extern	char*	eappend(char*, char*, char*);
155 extern	void		error(char*, ...);
156 extern	int		tokenizec(char*, char**, int, char*);
157 extern	void		execproc(void*);
158 extern	int		fsprint(CFid*, char*, ...);
159 
160 #pragma	varargck	argpos	error	1
161 #pragma	varargck	argpos	ctlprint	2
162 
163 extern	Window	*wbox;
164 extern	Message	mbox;
165 extern	Message	replies;
166 extern	char		*fsname;
167 extern	CFid		*plumbsendfd;
168 extern	CFid		*plumbseemailfd;
169 extern	char		*home;
170 extern	char		*outgoing;
171 extern	char		*mailboxdir;
172 extern	char		*mboxname;
173 extern	char		*user;
174 extern	char		*srvname;
175 extern	char		deleted[];
176 extern	int		wctlfd;
177 extern	int		shortmenu;
178 
179 extern	CFsys	*mailfs;
180 extern	CFsys	*acmefs;
181