#include #include #include "buffer.h" #include "logmsg.h" #include "stralloc.h" #include "getln.h" #include "open.h" #include "byte.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); }