move from sys to gen
[unix-history] / usr / src / lib / libc / gen / getbsize.c
CommitLineData
55677287
KB
1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8#ifndef lint
2dbdf5a9 9static char sccsid[] = "@(#)getbsize.c 5.4 (Berkeley) %G%";
55677287
KB
10#endif /* not lint */
11
12#include <stdio.h>
13#include <stdlib.h>
14
15char *
16getbsize(prog, headerlenp, blocksizep)
17 char *prog;
aa3d60d7
KB
18 int *headerlenp;
19 long *blocksizep;
55677287
KB
20{
21 static char header[20];
53732d93
KB
22 long n, max, mul, blocksize;
23 char *ep, *p, *form;
55677287 24
53732d93
KB
25#define KB (1024L)
26#define MB (1024L * 1024L)
27#define GB (1024L * 1024L * 1024L)
28#define MAXB GB /* No tera, peta, nor exa. */
29 form = "";
55677287 30 if ((p = getenv("BLOCKSIZE")) != NULL && *p != '\0') {
53732d93
KB
31 if ((n = strtol(p, &ep, 10)) < 0)
32 goto underflow;
33 if (n == 0)
34 n = 1;
35 if (*ep && ep[1])
36 goto fmterr;
37 switch (*ep) {
55677287 38 case 'G': case 'g':
53732d93
KB
39 form = "G";
40 max = MAXB / GB;
41 mul = GB;
42 break;
55677287 43 case 'K': case 'k':
53732d93
KB
44 form = "K";
45 max = MAXB / KB;
46 mul = KB;
47 break;
48 case 'M': case 'm':
49 form = "M";
50 max = MAXB / MB;
51 mul = MB;
52 break;
55677287 53 case '\0':
53732d93
KB
54 max = MAXB;
55 mul = 1;
55677287
KB
56 break;
57 default:
58fmterr: (void)fprintf(stderr,
59 "%s: %s: unknown blocksize\n", prog, p);
53732d93
KB
60 n = 512;
61 mul = 1;
55677287
KB
62 break;
63 }
53732d93
KB
64 if (n > max) {
65 (void)fprintf(stderr,
66 "%s: maximum blocksize is %dG\n", prog, MAXB / GB);
67 n = max;
68 }
69 if ((blocksize = n * mul) < 512) {
70underflow: (void)fprintf(stderr,
71 "%s: minimum blocksize is 512\n", prog);
72 form = "";
73 blocksize = n = 512;
74 }
55677287 75 } else
53732d93 76 blocksize = n = 512;
55677287 77
2dbdf5a9
KB
78 (void)snprintf(header, sizeof(header), "%d%s-blocks", n, form);
79 *headerlenp = strlen(header);
55677287
KB
80 *blocksizep = blocksize;
81 return (header);
82}