- Use strsuftoull() from dd(1) to parse numbers, rather than home grown

version. The new version supports products, 'g' (GB) and 't' (TB)
  suffices, and `b' now means `blocks' instead of `bytes'.
  Functionality requested by perry.
- debug is now a u_int instead of an int.
- Ensure that various numbers have sane upper limits (e.g, 99 for %, etc)
This commit is contained in:
lukem 2001-11-25 11:22:09 +00:00
parent 5605d92740
commit ae62d656a9
4 changed files with 49 additions and 93 deletions

View File

@ -1,23 +1,25 @@
# $NetBSD: Makefile,v 1.3 2001/11/22 02:47:25 lukem Exp $
# $NetBSD: Makefile,v 1.4 2001/11/25 11:22:09 lukem Exp $
#
PROG= makefs
SRCS= makefs.c walk.c \
ffs.c mkfs.c buf.c \
misc.c spec.c pack_dev.c stat_flags.c \
misc.c spec.c pack_dev.c stat_flags.c strsuftoull.c \
ffs_alloc.c ffs_balloc.c ffs_bswap.c ffs_subr.c ffs_tables.c ufs_bmap.c
MAN= makefs.8
DPADD+= ${LIBUTIL}
LDADD+= -lutil
DDSRC= ${.CURDIR}/../../bin/dd
LSSRC= ${.CURDIR}/../../bin/ls
MKNODSRC= ${.CURDIR}/../../sbin/mknod
MTREESRC= ${.CURDIR}/../../usr.sbin/mtree
SYSSRC= ${.CURDIR}/../../sys
CPPFLAGS+= -I${.CURDIR} -I${SYSSRC} -I${LSSRC} -I${MKNODSRC} -I${MTREESRC}
CPPFLAGS+= -I${.CURDIR} -I${SYSSRC} \
-I${LSSRC} -I${MKNODSRC} -I${MTREESRC} -I${DDSRC}
.PATH: ${.CURDIR}/ffs ${SYSSRC}/ufs/ffs \
${LSSRC} ${MKNODSRC} ${MTREESRC}
${LSSRC} ${MKNODSRC} ${MTREESRC} ${DDSRC}
WARNS?= 2

View File

@ -1,4 +1,4 @@
.\" $NetBSD: makefs.8,v 1.2 2001/11/02 03:12:48 lukem Exp $
.\" $NetBSD: makefs.8,v 1.3 2001/11/25 11:22:09 lukem Exp $
.\"
.\" Copyright (c) 2001 Wasabi Systems, Inc.
.\" All rights reserved.
@ -33,7 +33,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd October 26, 2001
.Dd November 25, 2001
.Dt MAKEFS 8
.Os
.Sh NAME
@ -189,17 +189,24 @@ If
isn't provided, the current file flags will be used.
.El
.Pp
An optional suffix may be provided for numeric size arguments,
which changes the intrepretation of the argument as follows:
Where sizes are specified, a decimal number of bytes is expected.
Two or more numbers may be separated by an
.Dq x
to indicate a product.
Each number may have one of the following optional suffices:
.Bl -tag -width 3n -offset indent -compact
.It b
Causes no modification. (Default; optional)
Block; multiply by 512
.It k
Kilo; multiply the argument by 1024
Kilo; multiply by 1024 (1 KB)
.It m
Mega; multiply the argument by 1048576
Mega; multiply by 1048576 (1 MB)
.It g
Giga; multiply the argument by 1073741824
Giga; multiply by 1073741824 (1 GB)
.It t
Tera; multiply by 1099511627776 (1 TB)
.It w
Word; multiply by the number of bytes in an integer
.El
.\"
.\"

View File

@ -1,4 +1,4 @@
/* $NetBSD: makefs.c,v 1.5 2001/11/08 12:24:12 simonb Exp $ */
/* $NetBSD: makefs.c,v 1.6 2001/11/25 11:22:09 lukem Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#ifndef __lint
__RCSID("$NetBSD: makefs.c,v 1.5 2001/11/08 12:24:12 simonb Exp $");
__RCSID("$NetBSD: makefs.c,v 1.6 2001/11/25 11:22:09 lukem Exp $");
#endif /* !__lint */
#include <assert.h>
@ -51,6 +51,7 @@ __RCSID("$NetBSD: makefs.c,v 1.5 2001/11/08 12:24:12 simonb Exp $");
#include <unistd.h>
#include "makefs.h"
#include "strsuftoull.h"
/*
@ -68,12 +69,11 @@ static fstype_t fstypes[] = {
{ NULL },
};
int debug;
u_int debug;
struct timespec start_time;
static fstype_t *get_fstype(const char *);
static long long strsuftoll(const char *, const char *, long long, long long);
static void usage(void);
int main(int, char *[]);
@ -122,17 +122,18 @@ main(int argc, char *argv[])
if (optarg[len] == '%') {
optarg[len] = '\0';
fsoptions.freeblockpc =
strsuftoll("free block percentage",
optarg, 0, LLONG_MAX);
strsuftoull("free block percentage",
optarg, 0, 99);
} else {
fsoptions.freeblocks = strsuftoll("free blocks",
optarg, 0, LLONG_MAX);
fsoptions.freeblocks =
strsuftoull("free blocks",
optarg, 0, LLONG_MAX);
}
break;
case 'd':
debug = (int)strsuftoll("debug mask", optarg,
0, LLONG_MAX);
debug =
(int)strsuftoull("debug mask", optarg, 0, UINT_MAX);
break;
case 'f':
@ -140,11 +141,12 @@ main(int argc, char *argv[])
if (optarg[len] == '%') {
optarg[len] = '\0';
fsoptions.freefilepc =
strsuftoll("free file percentage",
optarg, 0, LLONG_MAX);
strsuftoull("free file percentage",
optarg, 0, 99);
} else {
fsoptions.freefiles = strsuftoll("free files",
optarg, 0, LLONG_MAX);
fsoptions.freefiles =
strsuftoull("free files",
optarg, 0, LLONG_MAX);
}
break;
@ -153,13 +155,13 @@ main(int argc, char *argv[])
break;
case 'M':
fsoptions.minsize = strsuftoll("minimum size",
optarg, 1LL, LLONG_MAX);
fsoptions.minsize =
strsuftoull("minimum size", optarg, 1LL, LLONG_MAX);
break;
case 'm':
fsoptions.maxsize = strsuftoll("maximum size",
optarg, 1LL, LLONG_MAX);
fsoptions.maxsize =
strsuftoull("maximum size", optarg, 1LL, LLONG_MAX);
break;
case 'o':
@ -177,12 +179,13 @@ main(int argc, char *argv[])
case 's':
fsoptions.minsize = fsoptions.maxsize =
strsuftoll("size", optarg, 1LL, LLONG_MAX);
strsuftoull("size", optarg, 1LL, LLONG_MAX);
break;
case 'S':
fsoptions.sectorsize = strsuftoll("sector size",
optarg, 1LL, LLONG_MAX);
fsoptions.sectorsize =
(int)strsuftoull("sector size", optarg,
1LL, INT_MAX);
break;
case 't':
@ -244,7 +247,7 @@ set_option(option_t *options, const char *var, const char *val)
for (i = 0; options[i].name != NULL; i++) {
if (strcmp(options[i].name, var) != 0)
continue;
*options[i].value = (int)strsuftoll(options[i].desc, val,
*options[i].value = (int)strsuftoull(options[i].desc, val,
options[i].minimum, options[i].maximum);
return (1);
}
@ -264,61 +267,6 @@ get_fstype(const char *type)
return (NULL);
}
static long long
strsuftoll(const char *desc, const char *arg, long long min, long long max)
{
long long result;
char *ep;
assert(desc != NULL);
assert(arg != NULL);
errno = 0;
result = strtoll(arg, &ep, 0);
if ((result == LLONG_MIN || result == LLONG_MAX) && errno == ERANGE) {
warn("%s `%s'", desc, arg);
usage();
}
if (ep[0] != '\0' && ep[1] != '\0') {
warnx("`%s' is not a valid number for %s.", optarg, desc);
usage();
}
switch (tolower((unsigned char)ep[0])) {
case '\0':
case 'b':
break;
case 'k':
result <<= 10;
break;
case 'm':
result <<= 20;
break;
case 'g':
result <<= 30;
break;
default:
warnx("`%s' is not a valid suffix for %s.", ep, desc);
usage();
}
if (result < min) {
warnx("%s `%s' (%lld) is less than %lld.",
desc, optarg, result, min);
usage();
}
if (result > max) {
warnx("%s `%s' (%lld) is greater than %lld.",
desc, optarg, result, max);
usage();
}
if (debug & DEBUG_STRSUFTOLL)
printf("strsuftoll: got %lld for %s %s\n",
result, desc, arg);
return (result);
}
static void
usage(void)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: makefs.h,v 1.2 2001/11/02 03:12:48 lukem Exp $ */
/* $NetBSD: makefs.h,v 1.3 2001/11/25 11:22:09 lukem Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@ -151,12 +151,11 @@ void ffs_makefs(const char *, const char *, fsnode *, fsinfo_t *);
extern int debug;
extern u_int debug;
extern struct timespec start_time;
#define DEBUG_TIME 0x00000001
/* debug bits 1..2 reserved at this time */
#define DEBUG_STRSUFTOLL 0x00000008
/* debug bits 1..3 unused at this time */
#define DEBUG_WALK_DIR 0x00000010
#define DEBUG_WALK_DIR_NODE 0x00000020
#define DEBUG_WALK_DIR_LINKCHECK 0x00000040