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