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