1176998Sphk/*- 2176998Sphk * Copyright (c) 2005-2008 Poul-Henning Kamp 3176998Sphk * All rights reserved. 4176998Sphk * 5176998Sphk * Redistribution and use in source and binary forms, with or without 6176998Sphk * modification, are permitted provided that the following conditions 7176998Sphk * are met: 8176998Sphk * 1. Redistributions of source code must retain the above copyright 9176998Sphk * notice, this list of conditions and the following disclaimer. 10176998Sphk * 2. Redistributions in binary form must reproduce the above copyright 11176998Sphk * notice, this list of conditions and the following disclaimer in the 12176998Sphk * documentation and/or other materials provided with the distribution. 13176998Sphk * 14176998Sphk * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15176998Sphk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16176998Sphk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17176998Sphk * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18176998Sphk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19176998Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20176998Sphk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21176998Sphk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22176998Sphk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23176998Sphk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24176998Sphk * SUCH DAMAGE. 25176998Sphk * 26176998Sphk * $FreeBSD$ 27176998Sphk */ 28176998Sphk 29176998Sphk#include <stdio.h> 30179000Sphk#include <stdlib.h> 31179000Sphk#include <sysexits.h> 32176998Sphk#include <unistd.h> 33176998Sphk#include <err.h> 34176998Sphk#include <libutil.h> 35176998Sphk 36176998Sphk#include "libfifolog.h" 37176998Sphk 38176998Sphk#define DEF_RECSIZE 512 39176998Sphk#define DEF_RECCNT (24 * 60 * 60) 40176998Sphk 41179000Sphkstatic void 42179000Sphkusage(void) 43179000Sphk{ 44179000Sphk fprintf(stderr, "Usage: fifolog_create [-l record-size] " 45179000Sphk "[-r record-count] [-s size] file\n"); 46179000Sphk exit(EX_USAGE); 47179000Sphk} 48179000Sphk 49176998Sphkint 50176998Sphkmain(int argc, char * const *argv) 51176998Sphk{ 52176998Sphk int ch; 53176998Sphk int64_t size; 54176998Sphk int64_t recsize; 55176998Sphk int64_t reccnt; 56176998Sphk const char *s; 57176998Sphk 58176998Sphk recsize = 0; 59176998Sphk size = 0; 60176998Sphk reccnt = 0; 61176998Sphk while((ch = getopt(argc, argv, "l:r:s:")) != -1) { 62176998Sphk switch (ch) { 63176998Sphk case 'l': 64176998Sphk if (expand_number(optarg, &recsize)) 65176998Sphk err(1, "Couldn't parse -l argument"); 66176998Sphk break; 67176998Sphk case 'r': 68176998Sphk if (expand_number(optarg, &reccnt)) 69176998Sphk err(1, "Couldn't parse -r argument"); 70176998Sphk break; 71176998Sphk case 's': 72176998Sphk if (expand_number(optarg, &size)) 73176998Sphk err(1, "Couldn't parse -s argument"); 74176998Sphk break; 75176998Sphk default: 76179000Sphk usage(); 77176998Sphk } 78176998Sphk } 79176998Sphk argc -= optind; 80176998Sphk argv += optind; 81219027Sphk if (argc != 1) 82179000Sphk usage(); 83176998Sphk 84176998Sphk if (size != 0 && reccnt != 0 && recsize != 0) { /* N N N */ 85219027Sphk if (size != reccnt * recsize) 86176998Sphk errx(1, "Inconsistent -l, -r and -s values"); 87176998Sphk } else if (size != 0 && reccnt != 0 && recsize == 0) { /* N N Z */ 88176998Sphk if (size % reccnt) 89176998Sphk errx(1, 90176998Sphk "Inconsistent -r and -s values (gives remainder)"); 91176998Sphk recsize = size / reccnt; 92176998Sphk } else if (size != 0 && reccnt == 0 && recsize != 0) { /* N Z N */ 93176998Sphk if (size % recsize) 94176998Sphk errx(1, "-s arg not divisible by -l arg"); 95176998Sphk } else if (size != 0 && reccnt == 0 && recsize == 0) { /* N Z Z */ 96176998Sphk recsize = DEF_RECSIZE; 97176998Sphk if (size % recsize) 98176998Sphk errx(1, "-s arg not divisible by %jd", recsize); 99176998Sphk } else if (size == 0 && reccnt != 0 && recsize != 0) { /* Z N N */ 100176998Sphk size = reccnt * recsize; 101176998Sphk } else if (size == 0 && reccnt != 0 && recsize == 0) { /* Z N Z */ 102176998Sphk recsize = DEF_RECSIZE; 103176998Sphk size = reccnt * recsize; 104176998Sphk } else if (size == 0 && reccnt == 0 && recsize != 0) { /* Z Z N */ 105176998Sphk size = DEF_RECCNT * recsize; 106176998Sphk } else if (size == 0 && reccnt == 0 && recsize == 0) { /* Z Z Z */ 107176998Sphk recsize = DEF_RECSIZE; 108176998Sphk size = DEF_RECCNT * recsize; 109176998Sphk } 110176998Sphk 111176998Sphk s = fifolog_create(argv[0], size, recsize); 112176998Sphk if (s == NULL) 113176998Sphk return (0); 114176998Sphk err(1, "%s", s); 115176998Sphk} 116