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;
}