#include #include #include #include #include "dat.h" Biobuf *mf; Font *tinyfont; /* to overwrite unknowns */ Font *medifont; /* for icon captions */ char machine[512]; /* machine in latest ikon */ char *label; /* machine label for this ikon, if any */ char token[64]; int First=1, Same=1; char toklen; void start_trail(char *Log) { int f, n; if(user[0] == '\0'){ n = 0; if((f = open("/dev/user", OREAD)) < 0 || (n = read(f, user, sizeof(user)-1)) <= 0) error("can't read /dev/user"); user[n] = '\0'; close(f); } tinyfont = rdfontfile("/lib/font/bit/misc/ascii.5x7.font", 0); if(tinyfont == 0) tinyfont = font; medifont = rdfontfile("/lib/font/bit/pelm/latin1.8.font", 0); if(medifont == 0) medifont = font; toklen = sprint(token, "delivered %s From ", user); restart(Log, 1, aflag); } void restart(char *log, int fatal, int showall) { if(mf != 0) Bclose(mf); mf = Bopen(log, OREAD); if(mf == 0){ if(fatal) error("can't open log"); return; } if(!showall) Bseek(mf, 0, 2); } void trail(char *log) { char *match; char *line; char buf[ERRLEN]; int i; Dir d; if(mf == 0){ restart(log, 0, 1); if(mf == 0) return; } for(i=0; i<15; i++){ errstr(buf); /* clear error */ if((line=Brdline(mf, '\n')) == 0){ errstr(buf); if(strcmp(buf, "no error") != 0){ restart(log, 0, aflag); if(mf == 0) return; } if(dirfstat(Bfildes(mf), &d) < 0) return; if(d.length < Boffset(mf)) restart(log, 0, 1); return; } line[Blinelen(mf)-1] = 0; match = strstr(line, token); if(match) incoming(match); } } void overwrite(Bitmap *face) { Point p, q; char *s; s = label; if(s==0 || *s==0) return; q = strsize(tinyfont, s); p = Pt(face->r.min.x, face->r.max.y - 2 - q.y); if(q.x < face->r.max.x - face->r.min.x) p.x += (face->r.max.x - face->r.min.x-q.x)/2; bitblt(face, sub(p, Pt(1, 1)), face, Rpt(sub(p, Pt(1, 1)), add(add(p, q), Pt(1, 1))), 0); string(face, p, tinyfont, s, S|D); } void incoming(char *line) { char *p, *q, *r, *newmachine; newmachine = ""; if((p=strchr(&line[toklen], ' ')) == 0) return; if((q=strchr(p, ':')) == 0) q = "whois"; else{ q[3] = '\0'; q -= 2; } *p = 0; /* end of user-name */ p = strrchr(&line[toklen], '!'); if(p == 0){ p = &line[toklen]; if((r = strchr(&line[toklen], '@')) != 0){ *r = '\0'; newmachine = r+1; } }else{ *p = '\0'; for(r=p-1; r>line; r--) if(*r == ' ' || *r == '!'){ newmachine = r+1; break; } p++; /* start of user-name */ } sayit(p); puticon(newmachine, p, q); } char lastmachine[512]; char lastuser[512]; char lastlabel[512]; void puticon(char *mach, char *user, char *what) { char buf[512]; memmove(&old, &new, sizeof(SRC)); geticon(&new, mach, user); if(label == 0) label = ""; if(First) First=0; else if(sflag && (strcmp(realmachine, lastmachine) == 0) && (strcmp(user, lastuser) == 0) && (strcmp(label, lastlabel) == 0)){ Same++; twirl(&old, &new); sprint(buf, "%d*%s", Same, user); user = buf; nomessage(); }else{ wipe(&old, &new); Same = 1; } if(Same < 2){ strncpy(lastmachine, realmachine, sizeof(lastmachine)); strncpy(lastuser, user, sizeof(lastuser)); strncpy(lastlabel, label, sizeof(lastlabel)); } showimage(&new, 0); message(user, what); bflush(); } void sayit(char *user) { static int vfd, inited; if (!inited) { inited = 1; vfd = open("/voice/ascii", OWRITE); } if (vfd < 0) return; fprint(vfd, "mail from %s\n", user); }