xref: /csrg-svn/lib/libc/gen/getbsize.c (revision 52896)
152780Sbostic /*-
252780Sbostic  * Copyright (c) 1991 The Regents of the University of California.
352780Sbostic  * All rights reserved.
452780Sbostic  *
552780Sbostic  * %sccs.include.redist.c%
652780Sbostic  */
752780Sbostic 
852780Sbostic #ifndef lint
9*52896Sbostic static char sccsid[] = "@(#)getbsize.c	5.2 (Berkeley) 03/09/92";
1052780Sbostic #endif /* not lint */
1152780Sbostic 
1252780Sbostic #include <stdio.h>
1352780Sbostic #include <stdlib.h>
1452780Sbostic 
1552780Sbostic char *
1652780Sbostic getbsize(prog, headerlenp, blocksizep)
1752780Sbostic 	char *prog;
18*52896Sbostic 	int *headerlenp;
19*52896Sbostic 	long *blocksizep;
2052780Sbostic {
2152780Sbostic 	static char header[20];
2252780Sbostic 	long blocksize;
2352780Sbostic 	char *ep, *p;
2452780Sbostic 
2552780Sbostic #define	Kb	1024
2652780Sbostic #define	Mb	1048576
2752780Sbostic #define	Gb	1073741824
2852780Sbostic 	if ((p = getenv("BLOCKSIZE")) != NULL && *p != '\0') {
2952780Sbostic 		blocksize = strtol(p, &ep, 10);
3052780Sbostic 		switch(*ep) {
3152780Sbostic 		case 'G': case 'g':
3252780Sbostic 			if (ep[1])
3352780Sbostic 				goto fmterr;
3452780Sbostic 			if (blocksize > 1)
3552780Sbostic 				goto overflow;
3652780Sbostic 			*headerlenp = snprintf(header, sizeof(header),
3752780Sbostic 			    "%dG-blocks", blocksize);
3852780Sbostic 			*blocksizep = blocksize * Gb;
3952780Sbostic 			return (header);
4052780Sbostic 		case 'M': case 'm':
4152780Sbostic 			if (ep[1])
4252780Sbostic 				goto fmterr;
4352780Sbostic 			*headerlenp = snprintf(header, sizeof(header),
4452780Sbostic 			    "%dM-blocks", blocksize);
4552780Sbostic 			*blocksizep = blocksize * Mb;
4652780Sbostic 			return (header);
4752780Sbostic 		case 'K': case 'k':
4852780Sbostic 			if (ep[1])
4952780Sbostic 				goto fmterr;
5052780Sbostic 			*headerlenp = snprintf(header, sizeof(header),
5152780Sbostic 			    "%dK-blocks", blocksize);
5252780Sbostic 			*blocksizep = blocksize * Kb;
5352780Sbostic 			return (header);
5452780Sbostic 		case '\0':
5552780Sbostic 			if (blocksize > Gb) {
5652780Sbostic overflow:			(void)fprintf(stderr,
5752780Sbostic 				    "%s: maximum blocksize is 1G\n", prog);
5852780Sbostic 				blocksize = 512;
5952780Sbostic 			} else if (blocksize < 512) {
6052780Sbostic 				(void)fprintf(stderr,
6152780Sbostic 				    "%s: minimum blocksize is 512\n", prog);
6252780Sbostic 				blocksize = 512;
6352780Sbostic 			}
6452780Sbostic 			break;
6552780Sbostic 		default:
6652780Sbostic fmterr:			(void)fprintf(stderr,
6752780Sbostic 			    "%s: %s: unknown blocksize\n", prog, p);
6852780Sbostic 			blocksize = 512;
6952780Sbostic 			break;
7052780Sbostic 		}
7152780Sbostic 	} else
7252780Sbostic 		blocksize = 512;
7352780Sbostic 
7452780Sbostic 	*headerlenp = snprintf(header, sizeof(header), "%d-blocks", blocksize);
7552780Sbostic 	*blocksizep = blocksize;
7652780Sbostic 	return (header);
7752780Sbostic }
78