From 85771440500ca6234a3bc9d609123dd99b680a4c Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 3 Oct 1999 10:23:20 +0000 Subject: 1999-10-03 Roland McGrath * ext2fs.h (sblock_block): Declare new variable. (SBLOCK_LBLOCK): Macro removed. (SBLOCK_OFFS): Define in terms of sblock_block. * ext2fs.c (options): Add --sblock/-S. (parse_opt): Parse it to set sblock_block. * hyper.c (sblock_block): New variable. (get_hypermetadata): Use sblock_block instead of constant SBLOCK_BLOCK. * ext2fs.c (options): List --debug/-D unconditionally, adding to help text #ifndef EXT2FS_DEBUG (parse_opt): Always grok -D. #ifndef EXT2FS_DEBUG, reject it with message saying debugging support not compiled in. --- ext2fs/ext2fs.c | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) (limited to 'ext2fs') diff --git a/ext2fs/ext2fs.c b/ext2fs/ext2fs.c index 584e14ba..8cca73ed 100644 --- a/ext2fs/ext2fs.c +++ b/ext2fs/ext2fs.c @@ -63,9 +63,13 @@ int ext2_debug_flag = 0; static const struct argp_option options[] = { -#ifdef EXT2FS_DEBUG - {"debug", 'D', 0, 0, "Toggle debugging output" }, + {"debug", 'D', 0, 0, "Toggle debugging output" +#ifndef EXT2FS_DEBUG + " (not compiled in)" #endif + }, + {"sblock", 'S', "BLOCKNO", 0, + "Use alternate superblock location (1kb blocks)"}, {0} }; @@ -73,26 +77,50 @@ options[] = static error_t parse_opt (int key, char *arg, struct argp_state *state) { + /* We save our parsed values in this structure, hung off STATE->hook. + Only after parsing all options successfully will we use these values. */ + struct + { + int debug_flag; + unsigned int sb_block; + } *values = state->hook; + switch (key) { -#ifdef EXT2FS_DEBUG case 'D': - state->hook = (void *)1; /* Do it at the end */ + values->debug_flag = 1; + break; + case 'S': + values->sb_block = strtoul (arg, &arg, 0); + if (!arg || *arg != '\0') + { + argp_error (state, "invalid number for --sblock"); + return EINVAL; + } break; -#endif case ARGP_KEY_INIT: state->child_inputs[0] = state->input; -#ifdef EXT2FS_DEBUG - state->hook = 0; -#endif + values = malloc (sizeof *values); + if (values == 0) + return ENOMEM; + state->hook = values; + bzero (values, sizeof *values); + values->sb_block = SBLOCK_BLOCK; break; + case ARGP_KEY_SUCCESS: /* All options parse successfully, so implement ours if possible. */ + if (values->debug_flag) + { #ifdef EXT2FS_DEBUG - if (state->hook) - ext2_debug_flag = !ext2_debug_flag; + ext2_debug_flag = !ext2_debug_flag; +#else + argp_failure (state, 2, 0, "debugging support not compiled in"); + return EINVAL; #endif + } + break; default: -- cgit v1.2.3