fifolog_writer.c revision 179000
1208963Srdivacky/*-
2208963Srdivacky * Copyright (c) 2005-2008 Poul-Henning Kamp
3239614Sdim * All rights reserved.
4208963Srdivacky *
5239614Sdim * Redistribution and use in source and binary forms, with or without
6239614Sdim * modification, are permitted provided that the following conditions
7239614Sdim * are met:
8239614Sdim * 1. Redistributions of source code must retain the above copyright
9256297Sdim *    notice, this list of conditions and the following disclaimer.
10208963Srdivacky * 2. Redistributions in binary form must reproduce the above copyright
11246259Sdim *    notice, this list of conditions and the following disclaimer in the
12246259Sdim *    documentation and/or other materials provided with the distribution.
13246259Sdim *
14246259Sdim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15246259Sdim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16246259Sdim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17229169Snwhitehorn * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18239614Sdim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19209153Sed * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20208963Srdivacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21239462Sdim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22246705Sandrew * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23246705Sandrew * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24246705Sandrew * SUCH DAMAGE.
25246705Sandrew *
26246705Sandrew * $FreeBSD: head/usr.sbin/fifolog/fifolog_writer/fifolog_writer.c 179000 2008-05-14 23:29:02Z phk $
27246705Sandrew */
28246705Sandrew
29246705Sandrew#include <stdio.h>
30246705Sandrew#include <stdlib.h>
31239462Sdim#include <sysexits.h>
32239462Sdim#include <err.h>
33251662Sdim#include <unistd.h>
34243830Sdim#include <ctype.h>
35243830Sdim#include <assert.h>
36208963Srdivacky#include <poll.h>
37208963Srdivacky#include <string.h>
38208963Srdivacky#include <zlib.h>
39239614Sdim
40239614Sdim#include "libfifolog.h"
41208963Srdivacky
42249423Sdimstatic void
43249423Sdimusage(void)
44249423Sdim{
45249423Sdim	fprintf(stderr, "fifolog_writer [-w write-rate] [-s sync-rate] "
46249423Sdim	    "[-z compression] file\n");
47249423Sdim	exit(EX_USAGE);
48249423Sdim}
49249423Sdim
50249423Sdimint
51249423Sdimmain(int argc, char * const *argv)
52249423Sdim{
53249423Sdim	struct fifolog_writer *f;
54208963Srdivacky	const char *es;
55208963Srdivacky	struct pollfd pfd[1];
56208963Srdivacky	char buf[BUFSIZ], *p;
57208963Srdivacky	int i, c;
58208963Srdivacky	unsigned w_opt = 10;
59208963Srdivacky	unsigned s_opt = 60;
60208963Srdivacky	unsigned z_opt = Z_BEST_COMPRESSION;
61208963Srdivacky
62208963Srdivacky	while ((c = getopt(argc, argv, "w:s:z:")) != -1) {
63212904Sdim		switch(c) {
64208963Srdivacky		case 'w':
65224145Sdim			w_opt = strtoul(optarg, NULL, 0);
66218893Sdim			break;
67224145Sdim		case 's':
68224145Sdim			s_opt = strtoul(optarg, NULL, 0);
69224145Sdim			break;
70208963Srdivacky		case 'z':
71249423Sdim			z_opt = strtoul(optarg, NULL, 0);
72224145Sdim			break;
73224145Sdim		default:
74208963Srdivacky			usage();
75208963Srdivacky		}
76208963Srdivacky	}
77210299Sed	argc -= optind;
78249423Sdim	argv += optind;
79249423Sdim	if (argc != 1)
80210299Sed		usage();
81249423Sdim
82249423Sdim	if (z_opt > 9)
83249423Sdim		usage();
84249423Sdim
85263508Sdim	if (w_opt > s_opt)
86251662Sdim		usage();
87263508Sdim
88251662Sdim	f = fifolog_write_new();
89212904Sdim	assert(f != NULL);
90249423Sdim
91249423Sdim	es = fifolog_write_open(f, argv[0], w_opt, s_opt, z_opt);
92263508Sdim	if (es)
93226633Sdim		err(1, "Error: %s", es);
94249423Sdim
95249423Sdim	while (1) {
96226633Sdim		pfd[0].fd = 0;
97210299Sed		pfd[0].events = POLLIN;
98249423Sdim		i = poll(pfd, 1, 1000);
99249423Sdim		if (i == 1) {
100210299Sed			if (fgets(buf, sizeof buf, stdin) == NULL)
101263508Sdim				break;
102263508Sdim			p = strchr(buf, '\0');
103263508Sdim			assert(p != NULL);
104263508Sdim			while (p > buf && isspace(p[-1]))
105234353Sdim				p--;
106249423Sdim			*p = '\0';
107249423Sdim			if (*buf != '\0')
108234353Sdim				fifolog_write_bytes_poll(f, 0, 0, buf, 0);
109234353Sdim		} else if (i == 0)
110249423Sdim			(void)fifolog_write_poll(f, 0);
111249423Sdim	}
112234353Sdim	(void)fifolog_write_flush(f);
113212904Sdim	return (0);
114249423Sdim}
115249423Sdim