1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2005-2008 Poul-Henning Kamp
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD$
29 */
30
31#include <stdio.h>
32#include <stdlib.h>
33#include <sysexits.h>
34#include <err.h>
35#include <unistd.h>
36#include <ctype.h>
37#include <assert.h>
38#include <poll.h>
39#include <string.h>
40#include <zlib.h>
41
42#include "libfifolog.h"
43
44static void
45usage(void)
46{
47	fprintf(stderr,
48	    "Usage: fifolog_writer [-w write-rate] [-s sync-rate] "
49	    "[-z compression] file\n");
50	exit(EX_USAGE);
51}
52
53int
54main(int argc, char * const *argv)
55{
56	struct fifolog_writer *f;
57	const char *es;
58	struct pollfd pfd[1];
59	char buf[BUFSIZ], *p;
60	int i, c;
61	unsigned w_opt = 10;
62	unsigned s_opt = 60;
63	unsigned z_opt = Z_BEST_COMPRESSION;
64
65	while ((c = getopt(argc, argv, "w:s:z:")) != -1) {
66		switch(c) {
67		case 'w':
68			w_opt = strtoul(optarg, NULL, 0);
69			break;
70		case 's':
71			s_opt = strtoul(optarg, NULL, 0);
72			break;
73		case 'z':
74			z_opt = strtoul(optarg, NULL, 0);
75			break;
76		default:
77			usage();
78		}
79	}
80	argc -= optind;
81	argv += optind;
82	if (argc != 1)
83		usage();
84
85	if (z_opt > 9)
86		usage();
87
88	if (w_opt > s_opt)
89		usage();
90
91	f = fifolog_write_new();
92	assert(f != NULL);
93
94	es = fifolog_write_open(f, argv[0], w_opt, s_opt, z_opt);
95	if (es)
96		err(1, "Error: %s", es);
97
98	while (1) {
99		pfd[0].fd = 0;
100		pfd[0].events = POLLIN;
101		i = poll(pfd, 1, 1000);
102		if (i == 1) {
103			if (fgets(buf, sizeof buf, stdin) == NULL)
104				break;
105			p = strchr(buf, '\0');
106			assert(p != NULL);
107			while (p > buf && isspace(p[-1]))
108				p--;
109			*p = '\0';
110			if (*buf != '\0')
111				fifolog_write_record_poll(f, 0, 0, buf, 0);
112		} else if (i == 0)
113			fifolog_write_poll(f, 0);
114	}
115	fifolog_write_close(f);
116	return (0);
117}
118