#include #include #include "buffer.h" #include "byte.h" #include "getln.h" #include "logmsg.h" #include "open.h" #include "stralloc.h" #define WHO "setmaillist" int rename(const char *, const char *); // stdio.h void usage() { logmsg(WHO, 100, USAGE, "setmaillist list.bin list.tmp"); } stralloc line = {0}; int match; char *fnbin; char *fntmp; int fd; char buf[1024]; buffer bo; void writeerr() { logmsg(WHO, 111, FATAL, B("unable to write to: ", fntmp)); } static void out(char *s, int len) { if (buffer_put(&bo, s, len) == -1) writeerr(); } int main(int argc, char **argv) { umask(033); fnbin = argv[1]; if (!fnbin) usage(); fntmp = argv[2]; if (!fntmp) usage(); fd = open_trunc(fntmp); if (fd == -1) logmsg(WHO, 111, FATAL, B("unable to create: ", fntmp)); buffer_init(&bo, write, fd, buf, sizeof(buf)); do { if (getln(buffer_0small, &line, &match, '\n') == -1) logmsg(WHO, 111, FATAL, "unable to read input: "); while (line.len) { if (line.s[line.len - 1] != '\n') if (line.s[line.len - 1] != ' ') if (line.s[line.len - 1] != '\t') break; --line.len; } if (byte_chr(line.s, line.len, '\0') != line.len) logmsg(WHO, 111, FATAL, "NUL in input"); if (line.len) if (line.s[0] != '#') { if ((line.s[0] == '.') || (line.s[0] == '/')) { out(line.s, line.len); out("", 1); } else { if (line.len > 800) logmsg(WHO, 111, FATAL, "addresses must be under 800 bytes"); if (line.s[0] != '&') out("&", 1); out(line.s, line.len); out("", 1); } } } while (match); if (buffer_flush(&bo) == -1) writeerr(); if (fsync(fd) == -1) writeerr(); if (close(fd) == -1) writeerr(); /* NFS stupidity */ if (rename(fntmp, fnbin) == -1) logmsg(WHO, 111, FATAL, B("unable to move ", fntmp, " to: ", fnbin)); _exit(0); }