Mercurial > ~dholland > hg > tradcpp > index.cgi
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/output.c Mon Dec 20 04:03:35 2010 -0500 @@ -0,0 +1,60 @@ +#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; +}