/* Acme notifications */ #include #include int bfd, cfd, tfd; char srvf[1024]; Dir *dir; void newwin(void); int rmservice(void *, char *); void main(int argc, char *argv[]) { int f, p[2]; long n, m; char buf[1024]; USED(argc); USED(argv); sprint(srvf, "/srv/notify.%s", getuser()); dir = dirstat(srvf); if (dir) exits("srv file exists"); free(dir); pipe(p); newwin(); atnotify(rmservice, 1); f = create(srvf, OWRITE, 0222); if(f < 0) exits(smprint("%r [create]")); snprint(buf, sizeof buf, "%d", p[1]); if(write(f, buf, strlen(buf)) != strlen(buf)) exits(smprint("%r [write]")); close(f); for(;;){ m = read(p[0], buf, sizeof buf); n = write(cfd, "cleartag\n", 9); if(n != 9){ close(cfd); newwin(); } write(tfd, smprint(" %s", buf), m+1); write(bfd, buf, m); } } void newwin(void) { int n, wid; char buf[1024]; n = open("/mnt/acme/new/ctl", ORDWR); read(n, buf, 11); wid = atoi(buf); if(wid <= 0) exits(smprint("%r [wid]")); if((bfd = open(smprint("/mnt/acme/%d/body", wid), OWRITE)) < 0) exits(smprint("%r [bfd]")); if((cfd = open(smprint("/mnt/acme/%d/ctl", wid), OWRITE)) < 0) exits(smprint("%r [cfd]")); if((tfd = open(smprint("/mnt/acme/%d/tag", wid), OWRITE)) < 0) exits(smprint("%r [tfd]")); write(cfd, "name +notify\n", 13); close(n); } int rmservice(void *, char *) { remove(srvf); return 0; }