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