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