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