getbsize.c revision 1.2
1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *	This product includes software developed by the University of
16 *	California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35/*static char sccsid[] = "from: @(#)getbsize.c	5.3 (Berkeley) 3/9/92";*/
36static char rcsid[] = "$Id: getbsize.c,v 1.2 1994/01/25 20:06:03 cgd Exp $";
37#endif /* not lint */
38
39#include <err.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43
44char *
45getbsize(headerlenp, blocksizep, force)
46	int *headerlenp;
47	long *blocksizep;
48	int force;
49{
50	static char header[20];
51	long n, max, mul, blocksize;
52	char *ep, *p, *form;
53
54#define	KB	(1024L)
55#define	MB	(1024L * 1024L)
56#define	GB	(1024L * 1024L * 1024L)
57#define	MAXB	GB		/* No tera, peta, nor exa. */
58	form = "";
59	if (force) {
60		blocksize = *blocksizep;
61		if ((blocksize % GB) == 0) {
62			form = "G";
63			n = blocksize / GB;
64		} else if ((blocksize % MB) == 0) {
65			form = "M";
66			n = blocksize / MB;
67		} else if ((blocksize % KB) == 0) {
68			form = "K";
69			n = blocksize / KB;
70		} else {
71			n = blocksize;
72		}
73	} else if ((p = getenv("BLOCKSIZE")) != NULL && *p != '\0') {
74		if ((n = strtol(p, &ep, 10)) < 0)
75			goto underflow;
76		if (n == 0)
77			n = 1;
78		if (*ep && ep[1])
79			goto fmterr;
80		switch (*ep) {
81		case 'G': case 'g':
82			form = "G";
83			max = MAXB / GB;
84			mul = GB;
85			break;
86		case 'K': case 'k':
87			form = "K";
88			max = MAXB / KB;
89			mul = KB;
90			break;
91		case 'M': case 'm':
92			form = "M";
93			max = MAXB / MB;
94			mul = MB;
95			break;
96		case '\0':
97			max = MAXB;
98			mul = 1;
99			break;
100		default:
101fmterr:			warnx("%s: unknown blocksize", p);
102			n = 512;
103			mul = 1;
104			break;
105		}
106		if (n > max) {
107			warnx("maximum blocksize is %dG", MAXB / GB);
108			n = max;
109		}
110		if ((blocksize = n * mul) < 512) {
111underflow:		warnx("%s: minimum blocksize is 512");
112			form = "";
113			blocksize = n = 512;
114		}
115	} else
116		blocksize = n = 512;
117
118	*headerlenp = snprintf(header, sizeof(header), "%d%s-blocks", n, form);
119	*blocksizep = blocksize;
120	return (header);
121}
122