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