9 static int showfd = -1;
10 static int seefd = -1;
19 if((showfd = plumbopen("send", OWRITE)) == -1)
20 sysfatal("plumbopen send: %r");
21 if((seefd = plumbopen("seemail", OREAD)) == -1)
22 sysfatal("plumbopen seemail: %r");
28 maildirs = erealloc(maildirs, (nmaildirs+1)*sizeof(char*));
29 maildirs[nmaildirs++] = dir;
38 snprint(buf, sizeof buf, "digest=%s", f->str[Sdigest]);
50 if(showfd<0 || f->str[Sshow]==nil || f->str[Sshow][0]=='\0')
52 s = emalloc(128+strlen(f->str[Sshow])+1);
53 n = sprint(s, "faces\nshowmail\n/mail/fs/\ntext\n%s\n%ld\n%s", attr(f), strlen(f->str[Sshow]), f->str[Sshow]);
59 value(Plumbattr *attr, char *key, char *def)
63 v = plumblookup(attr, key);
70 setname(Face *f, char *sender)
75 /* works with UTF-8, although it's written as ASCII */
76 for(p=sender; *p!='\0'; p++)
78 f->str[Suser] = sender;
79 at = strchr(sender, '@');
82 f->str[Sdomain] = estrdup(at);
85 bang = strchr(sender, '!');
88 f->str[Suser] = estrdup(bang);
89 f->str[Sdomain] = sender;
98 "WW MMM DD hh:mm:ss ?Z YYYY",
99 "?WW ?DD ?MMM ?YYYY hh:mm:ss ?Z",
100 "?WW ?DD ?MMM ?YYYY hh:mm:ss",
102 "?DD ?MMM ?YYYY hh:mm:ss ?Z",
103 "?DD ?MMM ?YYYY hh:mm:ss",
104 "?DD-?MM-YY hh:mm:ss ?Z",
105 "?DD-?MM-YY hh:mm:ss",
107 "?MMM/?DD/?YYYY hh:mm:ss ?Z",
108 "?MMM/?DD/?YYYY hh:mm:ss",
115 if((tz = tzload("local")) == nil)
116 sysfatal("tzload: %r");
117 for(f = fmt; *f; f++)
118 if(tmparse(&tm, *f, s, tz, nil) != nil)
129 char *t, *senderp, *showmailp, *digestp;
132 f = emalloc(sizeof(Face));
134 m = plumbrecv(seefd);
136 killall("error on seemail plumb port");
137 t = value(m->attr, "mailtype", "");
138 if(strcmp(t, "modify") == 0)
140 else if(strcmp(t, "delete") == 0)
141 delete(m->data, value(m->attr, "digest", nil));
142 else if(strcmp(t, "new") == 0)
143 for(i=0; i<nmaildirs; i++){
144 if(strncmp(m->data, maildirs[i], strlen(maildirs[i])) == 0)
148 fprint(2, "faces: unknown plumb message type %s\n", t);
154 xtime = parsedate(value(m->attr, "date", date));
155 digestp = value(m->attr, "digest", nil);
156 if(alreadyseen(digestp)){
157 /* duplicate upas/fs can send duplicate messages */
161 senderp = estrdup(value(m->attr, "sender", "???"));
162 showmailp = estrdup(m->data);
164 digestp = estrdup(digestp);
168 f->tm = *localtime(xtime);
169 f->str[Sshow] = showmailp;
170 f->str[Sdigest] = digestp;
176 iline(char *data, char **pp)
180 for(p=data; *p!='\0' && *p!='\n'; p++)
189 dirface(char *dir, char *num)
193 char buf[1024], pwd[1024], *info, *p, *digest;
198 * loadmbox leaves us in maildir, so we needn't
199 * walk /mail/fs/mbox for each face; this makes startup
200 * a fair bit quicker.
202 if(getwd(pwd, sizeof pwd) != nil && strcmp(pwd, dir) == 0)
203 sprint(buf, "%s/info", num);
205 sprint(buf, "%s/%s/info", dir, num);
209 fd = open(buf, OREAD);
212 info = emalloc(len+1);
213 n = readn(fd, info, len);
220 f = emalloc(sizeof(Face));
221 from = iline(info, &p); /* from */
222 iline(p, &p); /* to */
223 iline(p, &p); /* cc */
224 iline(p, &p); /* replyto */
225 date = iline(p, &p); /* date */
226 setname(f, estrdup(from));
227 f->time = parsedate(date);
228 f->tm = *localtime(f->time);
229 sprint(buf, "%s/%s", dir, num);
230 f->str[Sshow] = estrdup(buf);
231 iline(p, &p); /* subject */
232 iline(p, &p); /* mime content type */
233 iline(p, &p); /* mime disposition */
234 iline(p, &p); /* filename */
235 digest = iline(p, &p); /* digest */
236 f->str[Sdigest] = estrdup(digest);