20 showfd = plumbopenfid("send", OWRITE);
21 seefd = plumbopenfid("seemail", OREAD);
22 if(showfd == nil || seefd == nil)
23 sysfatal("plumbopen: %r");
29 maildirs = erealloc(maildirs, (nmaildirs+1)*sizeof(char*));
30 maildirs[nmaildirs++] = dir;
39 snprint(buf, sizeof buf, "digest=%s", f->str[Sdigest]);
52 if(showfd<0 || f->str[Sshow]==nil || f->str[Sshow][0]=='\0')
54 snprint(buf, sizeof buf, "Mail/%s", f->str[Sshow]);
60 a.value = f->str[Sdigest];
63 pm.ndata = strlen(buf);
65 plumbsendtofid(showfd, &pm);
69 value(Plumbattr *attr, char *key, char *def)
73 v = plumblookup(attr, key);
80 setname(Face *f, char *sender)
88 nf = tokenize(p, fld, 3);
90 sender = estrdup(fld[0]);
92 sender = estrdup(fld[1]);
95 /* works with UTF-8, although it's written as ASCII */
96 for(p=sender; *p!='\0'; p++)
98 f->str[Suser] = sender;
99 at = strchr(sender, '@');
102 f->str[Sdomain] = estrdup(at);
105 bang = strchr(sender, '!');
108 f->str[Suser] = estrdup(bang);
109 f->str[Sdomain] = sender;
114 static char* months[] = {
115 "jan", "feb", "mar", "apr",
116 "may", "jun", "jul", "aug",
117 "sep", "oct", "nov", "dec"
125 for(i=0; i<nelem(months); i++)
126 if(cistrcmp(months[i], s) == 0)
131 /* Fri Jul 23 14:05:14 EDT 1999 */
138 memset(&tm, 0, sizeof tm);
139 if((tm.mon=getmon(a[1])) == -1)
141 tm.mday = strtol(a[2], &p, 10);
144 tm.hour = strtol(a[3], &p, 10);
147 tm.min = strtol(p+1, &p, 10);
150 tm.sec = strtol(p+1, &p, 10);
153 if(strlen(a[4]) != 3)
155 strcpy(tm.zone, a[4]);
156 if(strlen(a[5]) != 4)
158 tm.year = strtol(a[5], &p, 10);
173 nf = getfields(s, f, nelem(f), 1, " ");
176 return parsedatev(f);
185 /* d, date = "Mon Aug 2 23:46:55 EDT 1999" */
187 if(strlen(d) < strlen("Mon Aug 2 23:46:55 EDT 1999"))
189 if(strncmp(date, d, 4+4+3) == 0)
190 snprint(e, sizeof e, "%.5s", d+4+4+3); /* 23:46 */
192 snprint(e, sizeof e, "%.6s", d+4); /* Aug 2 */
202 char *t, *data, *showmailp, *digestp;
205 f = emalloc(sizeof(Face));
207 m = plumbrecvfid(seefd);
209 killall("error on seemail plumb port");
210 if(strncmp(m->data, "Mail/", 5) != 0){
215 t = value(m->attr, "mailtype", "");
216 if(strcmp(t, "delete") == 0)
217 delete(data, value(m->attr, "digest", nil));
218 else if(strcmp(t, "new") != 0)
219 fprint(2, "faces: unknown plumb message type %s\n", t);
220 else for(i=0; i<nmaildirs; i++)
221 if(strncmp(data, maildirs[i], strlen(maildirs[i])) == 0)
227 xtime = parsedate(value(m->attr, "date", date));
228 digestp = value(m->attr, "digest", nil);
229 if(alreadyseen(digestp)){
230 /* duplicate upas/fs can send duplicate messages */
234 showmailp = estrdup(data);
236 digestp = estrdup(digestp);
237 setname(f, value(m->attr, "sender", "???"));
240 f->tm = *localtime(xtime);
241 f->str[Sshow] = showmailp;
242 f->str[Sdigest] = digestp;
249 iline(char *data, char **pp)
255 for(p=data; *p!='\0' && *p!='\n'; p++)
264 dirface(char *dir, char *num)
267 char buf[1024], *info, *p, *t, *s;
272 sprint(buf, "%s/%s/info", dir, num);
273 len = fsdirlen(mailfs, buf);
276 fid = fsopen(mailfs, buf, OREAD);
279 info = emalloc(len+1);
280 n = fsreadn(fid, info, len);
287 f = emalloc(sizeof(Face));
288 for(p=info; (s=iline(p, &p)) != nil; ){
293 if(strcmp(s, "unixdate") == 0){
295 f->tm = *localtime(f->time);
297 else if(strcmp(s, "from") == 0)
299 else if(strcmp(s, "digest") == 0)
300 f->str[Sdigest] = estrdup(t);
302 sprint(buf, "%s/%s", dir, num);
303 f->str[Sshow] = estrdup(buf);