Mercurial > ~dholland > hg > tradcpp > index.cgi
view output.c @ 20:40748b097655
add output.
author | David A. Holland |
---|---|
date | Mon, 20 Dec 2010 04:03:35 -0500 |
parents | |
children | e3fab8f1b52c |
line wrap: on
line source
#include <unistd.h> #include <fcntl.h> #include <err.h> #include "utils.h" #include "mode.h" #include "output.h" static int outputfd = -1; static void output_open(void) { outputfd = open(mode.output_file, O_WRONLY|O_CREAT|O_TRUNC, 0664); if (outputfd < 0) { warn("%s", mode.output_file); die(); } } void output(const char *buf, size_t len) { size_t done; ssize_t result; static unsigned write_errors = 0; if (outputfd < 0) { output_open(); } /* XXX this will often come by ones and twos, should buffer */ done = 0; while (done < len) { result = write(outputfd, buf+done, len-done); if (result == -1) { warn("%s: write", mode.output_file); complain_failed(); write_errors++; if (write_errors > 5) { warnx("%s: giving up", mode.output_file); die(); } /* XXX is this really a good idea? */ sleep(1); } done += (size_t)result; } } void output_eof(void) { if (outputfd >= 0) { close(outputfd); } outputfd = -1; }