void main(int argc, char **argv) { int bytes, fd, i; char now[30]; char *deliveredto; Addr *a; Mlock *l; ARGBEGIN{ }ARGEND; if(argc != 3) usage(); deliveredto = strrchr(argv[0], '!'); if(deliveredto == nil) deliveredto = argv[0]; else deliveredto++; a = readaddrs(argv[1], nil); if(a == nil) sysfatal("missing from address"); l = syslock(argv[2]); /* append to mbox */ i = 0; retry: fd = open(argv[2], OWRITE); if(fd < 0){ rerrstr(now, sizeof(now)); if(strstr(now, "exclusive lock") && i++ < 20){ sleep(500); /* wait for lock to go away */ goto retry; } sysfatal("opening mailbox: %r"); } seek(fd, 0, 2); strncpy(now, ctime(time(0)), sizeof(now)); now[28] = 0; if(fprint(fd, "From %s %s\n", a->val, now) < 0) sysfatal("writing mailbox: %r"); /* copy message handles escapes and any needed new lines */ bytes = appendfiletombox(0, fd); if(bytes < 0) sysfatal("writing mailbox: %r"); close(fd); sysunlock(l); /* log it */ syslog(0, "mail", "delivered %s From %s %s (%s) %d", deliveredto, a->val, now, argv[0], bytes); exits(0); }
/* dispose of local addresses */ int cat_mail(dest *dp, message *mp) { Biobuf *fp; char *rcvr, *cp; Mlock *l; String *tmp, *s; int i, n; s = unescapespecial(s_clone(dp->repl1)); if (nflg) { if(!xflg) print("cat >> %s\n", s_to_c(s)); else print("%s\n", s_to_c(dp->addr)); s_free(s); return 0; } for(i = 0;; i++){ l = syslock(s_to_c(s)); if(l == 0) return refuse(dp, mp, "can't lock mail file", 0, 0); fp = sysopen(s_to_c(s), "al", MBOXMODE); if(fp) break; tmp = s_append(0, s_to_c(s)); s_append(tmp, ".tmp"); fp = sysopen(s_to_c(tmp), "al", MBOXMODE); if(fp){ syslog(0, "mail", "error: used %s", s_to_c(tmp)); s_free(tmp); break; } s_free(tmp); sysunlock(l); if(i >= 5) return refuse(dp, mp, "mail file cannot be opened", 0, 0); sleep(1000); } s_free(s); n = m_print(mp, fp, (char *)0, 1); if (Bprint(fp, "\n") < 0 || Bflush(fp) < 0 || n < 0){ sysclose(fp); sysunlock(l); return refuse(dp, mp, "error writing mail file", 0, 0); } sysclose(fp); sysunlock(l); rcvr = s_to_c(dp->addr); if(cp = strrchr(rcvr, '!')) rcvr = cp+1; logdelivery(dp, rcvr, mp); return 0; }
char* plan9syncmbox(Mailbox *mb, int doplumb) { Mlock *lk; char *rv; lk = nil; if(mb->dolock){ lk = syslock(mb->path); if(lk == nil) return "can't lock mailbox"; } rv = _readmbox(mb, doplumb, lk); /* interpolate */ if(purgedeleted(mb) > 0) _writembox(mb, lk); if(lk != nil) sysunlock(lk); return rv; }
/* * load balancing */ void doload(int start) { int fd; char buf[32]; int i, n; Mlock *l; Dir *d; if(load <= 0) return; if(chdir(root) < 0){ load = 0; return; } l = syslock(loadfile); fd = open(loadfile, ORDWR); if(fd < 0){ fd = create(loadfile, 0666, ORDWR); if(fd < 0){ load = 0; sysunlock(l); return; } } /* get current load */ i = 0; n = read(fd, buf, sizeof(buf)-1); if(n >= 0){ buf[n] = 0; i = atoi(buf); } if(i < 0) i = 0; /* ignore load if file hasn't been changed in 30 minutes */ d = dirfstat(fd); if(d != nil){ if(d->mtime + 30*60 < time(0)) i = 0; free(d); } /* if load already too high, give up */ if(start && i >= load){ sysunlock(l); exits(0); } /* increment/decrement load */ if(start) i++; else i--; seek(fd, 0, 0); fprint(fd, "%d\n", i); sysunlock(l); close(fd); }
static void lockSyscall(int* args) { syslock((Lock*)args[0]); }