xref: /csrg-svn/lib/libc/gen/getbsize.c (revision 52896)
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
9 static char sccsid[] = "@(#)getbsize.c	5.2 (Berkeley) 03/09/92";
10 #endif /* not lint */
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 
15 char *
16 getbsize(prog, headerlenp, blocksizep)
17 	char *prog;
18 	int *headerlenp;
19 	long *blocksizep;
20 {
21 	static char header[20];
22 	long blocksize;
23 	char *ep, *p;
24 
25 #define	Kb	1024
26 #define	Mb	1048576
27 #define	Gb	1073741824
28 	if ((p = getenv("BLOCKSIZE")) != NULL && *p != '\0') {
29 		blocksize = strtol(p, &ep, 10);
30 		switch(*ep) {
31 		case 'G': case 'g':
32 			if (ep[1])
33 				goto fmterr;
34 			if (blocksize > 1)
35 				goto overflow;
36 			*headerlenp = snprintf(header, sizeof(header),
37 			    "%dG-blocks", blocksize);
38 			*blocksizep = blocksize * Gb;
39 			return (header);
40 		case 'M': case 'm':
41 			if (ep[1])
42 				goto fmterr;
43 			*headerlenp = snprintf(header, sizeof(header),
44 			    "%dM-blocks", blocksize);
45 			*blocksizep = blocksize * Mb;
46 			return (header);
47 		case 'K': case 'k':
48 			if (ep[1])
49 				goto fmterr;
50 			*headerlenp = snprintf(header, sizeof(header),
51 			    "%dK-blocks", blocksize);
52 			*blocksizep = blocksize * Kb;
53 			return (header);
54 		case '\0':
55 			if (blocksize > Gb) {
56 overflow:			(void)fprintf(stderr,
57 				    "%s: maximum blocksize is 1G\n", prog);
58 				blocksize = 512;
59 			} else if (blocksize < 512) {
60 				(void)fprintf(stderr,
61 				    "%s: minimum blocksize is 512\n", prog);
62 				blocksize = 512;
63 			}
64 			break;
65 		default:
66 fmterr:			(void)fprintf(stderr,
67 			    "%s: %s: unknown blocksize\n", prog, p);
68 			blocksize = 512;
69 			break;
70 		}
71 	} else
72 		blocksize = 512;
73 
74 	*headerlenp = snprintf(header, sizeof(header), "%d-blocks", blocksize);
75 	*blocksizep = blocksize;
76 	return (header);
77 }
78