xref: /freebsd/usr.sbin/fifolog/fifolog_writer/fifolog_writer.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1662cb04cSPoul-Henning Kamp /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
31de7b4b8SPedro F. Giffuni  *
4662cb04cSPoul-Henning Kamp  * Copyright (c) 2005-2008 Poul-Henning Kamp
5662cb04cSPoul-Henning Kamp  * All rights reserved.
6662cb04cSPoul-Henning Kamp  *
7662cb04cSPoul-Henning Kamp  * Redistribution and use in source and binary forms, with or without
8662cb04cSPoul-Henning Kamp  * modification, are permitted provided that the following conditions
9662cb04cSPoul-Henning Kamp  * are met:
10662cb04cSPoul-Henning Kamp  * 1. Redistributions of source code must retain the above copyright
11662cb04cSPoul-Henning Kamp  *    notice, this list of conditions and the following disclaimer.
12662cb04cSPoul-Henning Kamp  * 2. Redistributions in binary form must reproduce the above copyright
13662cb04cSPoul-Henning Kamp  *    notice, this list of conditions and the following disclaimer in the
14662cb04cSPoul-Henning Kamp  *    documentation and/or other materials provided with the distribution.
15662cb04cSPoul-Henning Kamp  *
16662cb04cSPoul-Henning Kamp  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17662cb04cSPoul-Henning Kamp  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18662cb04cSPoul-Henning Kamp  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19662cb04cSPoul-Henning Kamp  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20662cb04cSPoul-Henning Kamp  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21662cb04cSPoul-Henning Kamp  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22662cb04cSPoul-Henning Kamp  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23662cb04cSPoul-Henning Kamp  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24662cb04cSPoul-Henning Kamp  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25662cb04cSPoul-Henning Kamp  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26662cb04cSPoul-Henning Kamp  * SUCH DAMAGE.
27662cb04cSPoul-Henning Kamp  */
28662cb04cSPoul-Henning Kamp 
29662cb04cSPoul-Henning Kamp #include <stdio.h>
30662cb04cSPoul-Henning Kamp #include <stdlib.h>
3122d0b5dcSPoul-Henning Kamp #include <sysexits.h>
32662cb04cSPoul-Henning Kamp #include <err.h>
33662cb04cSPoul-Henning Kamp #include <unistd.h>
34662cb04cSPoul-Henning Kamp #include <ctype.h>
35662cb04cSPoul-Henning Kamp #include <assert.h>
36662cb04cSPoul-Henning Kamp #include <poll.h>
37662cb04cSPoul-Henning Kamp #include <string.h>
38662cb04cSPoul-Henning Kamp #include <zlib.h>
39662cb04cSPoul-Henning Kamp 
40662cb04cSPoul-Henning Kamp #include "libfifolog.h"
41662cb04cSPoul-Henning Kamp 
4222d0b5dcSPoul-Henning Kamp static void
usage(void)4322d0b5dcSPoul-Henning Kamp usage(void)
4422d0b5dcSPoul-Henning Kamp {
456e482ac5SPoul-Henning Kamp 	fprintf(stderr,
466e482ac5SPoul-Henning Kamp 	    "Usage: fifolog_writer [-w write-rate] [-s sync-rate] "
4722d0b5dcSPoul-Henning Kamp 	    "[-z compression] file\n");
4822d0b5dcSPoul-Henning Kamp 	exit(EX_USAGE);
4922d0b5dcSPoul-Henning Kamp }
5022d0b5dcSPoul-Henning Kamp 
51662cb04cSPoul-Henning Kamp int
main(int argc,char * const * argv)52662cb04cSPoul-Henning Kamp main(int argc, char * const *argv)
53662cb04cSPoul-Henning Kamp {
54662cb04cSPoul-Henning Kamp 	struct fifolog_writer *f;
55662cb04cSPoul-Henning Kamp 	const char *es;
56662cb04cSPoul-Henning Kamp 	struct pollfd pfd[1];
57662cb04cSPoul-Henning Kamp 	char buf[BUFSIZ], *p;
58662cb04cSPoul-Henning Kamp 	int i, c;
59662cb04cSPoul-Henning Kamp 	unsigned w_opt = 10;
60662cb04cSPoul-Henning Kamp 	unsigned s_opt = 60;
61662cb04cSPoul-Henning Kamp 	unsigned z_opt = Z_BEST_COMPRESSION;
62662cb04cSPoul-Henning Kamp 
63662cb04cSPoul-Henning Kamp 	while ((c = getopt(argc, argv, "w:s:z:")) != -1) {
64662cb04cSPoul-Henning Kamp 		switch(c) {
65662cb04cSPoul-Henning Kamp 		case 'w':
66662cb04cSPoul-Henning Kamp 			w_opt = strtoul(optarg, NULL, 0);
67662cb04cSPoul-Henning Kamp 			break;
68662cb04cSPoul-Henning Kamp 		case 's':
69662cb04cSPoul-Henning Kamp 			s_opt = strtoul(optarg, NULL, 0);
70662cb04cSPoul-Henning Kamp 			break;
71662cb04cSPoul-Henning Kamp 		case 'z':
72662cb04cSPoul-Henning Kamp 			z_opt = strtoul(optarg, NULL, 0);
73662cb04cSPoul-Henning Kamp 			break;
74662cb04cSPoul-Henning Kamp 		default:
7522d0b5dcSPoul-Henning Kamp 			usage();
76662cb04cSPoul-Henning Kamp 		}
77662cb04cSPoul-Henning Kamp 	}
78662cb04cSPoul-Henning Kamp 	argc -= optind;
79662cb04cSPoul-Henning Kamp 	argv += optind;
80662cb04cSPoul-Henning Kamp 	if (argc != 1)
8122d0b5dcSPoul-Henning Kamp 		usage();
82662cb04cSPoul-Henning Kamp 
83662cb04cSPoul-Henning Kamp 	if (z_opt > 9)
8422d0b5dcSPoul-Henning Kamp 		usage();
85662cb04cSPoul-Henning Kamp 
86662cb04cSPoul-Henning Kamp 	if (w_opt > s_opt)
8722d0b5dcSPoul-Henning Kamp 		usage();
88662cb04cSPoul-Henning Kamp 
89662cb04cSPoul-Henning Kamp 	f = fifolog_write_new();
90662cb04cSPoul-Henning Kamp 	assert(f != NULL);
91662cb04cSPoul-Henning Kamp 
92662cb04cSPoul-Henning Kamp 	es = fifolog_write_open(f, argv[0], w_opt, s_opt, z_opt);
93662cb04cSPoul-Henning Kamp 	if (es)
94662cb04cSPoul-Henning Kamp 		err(1, "Error: %s", es);
95662cb04cSPoul-Henning Kamp 
96662cb04cSPoul-Henning Kamp 	while (1) {
97662cb04cSPoul-Henning Kamp 		pfd[0].fd = 0;
98662cb04cSPoul-Henning Kamp 		pfd[0].events = POLLIN;
99662cb04cSPoul-Henning Kamp 		i = poll(pfd, 1, 1000);
100662cb04cSPoul-Henning Kamp 		if (i == 1) {
101662cb04cSPoul-Henning Kamp 			if (fgets(buf, sizeof buf, stdin) == NULL)
102662cb04cSPoul-Henning Kamp 				break;
103662cb04cSPoul-Henning Kamp 			p = strchr(buf, '\0');
104662cb04cSPoul-Henning Kamp 			assert(p != NULL);
105662cb04cSPoul-Henning Kamp 			while (p > buf && isspace(p[-1]))
106662cb04cSPoul-Henning Kamp 				p--;
107662cb04cSPoul-Henning Kamp 			*p = '\0';
108662cb04cSPoul-Henning Kamp 			if (*buf != '\0')
1096e482ac5SPoul-Henning Kamp 				fifolog_write_record_poll(f, 0, 0, buf, 0);
110662cb04cSPoul-Henning Kamp 		} else if (i == 0)
1116e482ac5SPoul-Henning Kamp 			fifolog_write_poll(f, 0);
112662cb04cSPoul-Henning Kamp 	}
1136e482ac5SPoul-Henning Kamp 	fifolog_write_close(f);
114662cb04cSPoul-Henning Kamp 	return (0);
115662cb04cSPoul-Henning Kamp }
116