diff -x.svn -u fconfig/crunchfc.c ../../../snapgear_avila/user/fconfig/crunchfc.c --- fconfig/crunchfc.c 2006-03-15 01:18:17.000000000 +1100 +++ ../../../snapgear_avila/user/fconfig/crunchfc.c 2007-09-06 13:48:38.000000000 +1000 @@ -320,6 +320,48 @@ } /* + * List known keys. + */ +int8_t list_keys(struct config_data *data) +{ + struct fconfig_key key; + uint32_t len = data->reallen; + uint8_t *keyptr = NULL; + uint8_t *ptr = data->buf+8; + uint8_t *ptrend = data->buf+len-9; + printer_t printer; + + while (ptr < ptrend-4) { + keyptr = ptr; + ptr = get_key(ptr, &key); + if (ptr == NULL) { + MESSAGE(VERB_LOW, "Error in structure\n"); + return -1; + } + if (ptr > ptrend) { + MESSAGE(VERB_LOW, "Parser went out of struct!\n"); + return -1; + } + + if ((key.type == 0) && (key.namelen==0)) { + MESSAGE(VERB_NORMAL, "EOF reached - key not found\n"); + return -1; + } + + print_key(&key, VERB_HIGH, data->swab); + + printf("%s: ", key.keyname); + printer = TYPE_PRINTER(key.type); + if (printer == NULL) { + MESSAGE(VERB_LOW, "Printer missing for type %d\n", key.type); + return -1; + } + printer(key.dataval); + printf("\n"); + } +} + +/* * Find a key with given nickname, check its type and set value * Assumes that verify_fconfig() has been called on 'data' before. */ diff -x.svn -u fconfig/crunchfc.h ../../../snapgear_avila/user/fconfig/crunchfc.h --- fconfig/crunchfc.h 2006-03-15 01:18:17.000000000 +1100 +++ ../../../snapgear_avila/user/fconfig/crunchfc.h 2007-09-06 13:48:38.000000000 +1000 @@ -31,6 +31,7 @@ int8_t verify_fconfig(struct config_data *data); int8_t get_key_value(struct config_data *data, uint8_t *nickname); int8_t set_key_value(struct config_data *data, uint8_t *nickname, void *value); +int8_t list_keys(struct config_data *data); void recalculate_crc(struct config_data *data); #endif //CRUNCHFC_H diff -x.svn -u fconfig/fconfig.c ../../../snapgear_avila/user/fconfig/fconfig.c --- fconfig/fconfig.c 2006-03-15 01:18:18.000000000 +1100 +++ ../../../snapgear_avila/user/fconfig/fconfig.c 2007-09-06 13:48:38.000000000 +1000 @@ -35,8 +35,9 @@ #include #include #include +#include #include "debug.h" #include "ftypes.h" #include "crunchfc.h" @@ -72,7 +73,7 @@ } fputs("Read or write Redboot configuration\n", stdout); - fputs("usage: fconfig [-r|-w] -d dev -n nickname -x value\n", stdout); + fputs("usage: fconfig [-r|-w|-l] -d dev -n nickname -x value\n", stdout); fputs("'dev' may be a char device, block device or a file\n", stdout); fputs("Supported types: \n", stdout); for (i = 0; i < NUM_TYPES; i++) { @@ -181,7 +182,33 @@ close_fconfig_handle(data); return 0; -exit_fail: +exit_fail: + close_fconfig_handle(data); + return 1; +} + +/* + * List mode of operation: list parameter values from the configuration. + */ +static int list_mode(struct config_data *data, uint8_t *device) +{ + if (get_fconfig_handle(data, device, O_RDONLY) == NULL) { + MESSAGE(VERB_LOW, "Could not get a config data handle!\n"); + return 1; + } + if (verify_fconfig(data)) { + MESSAGE(VERB_LOW, "Config verification failed!\n"); + goto exit_fail; + } + + if (list_keys(data)) { + goto exit_fail; + } + + close_fconfig_handle(data); + return 0; + +exit_fail: close_fconfig_handle(data); return 1; } @@ -189,6 +216,7 @@ #define MODE_NONE 0 #define MODE_WRITE 1 #define MODE_READ 2 +#define MODE_LIST 3 /* * main(). ...nuff said. @@ -202,14 +230,17 @@ uint8_t *value = NULL; uint8_t *device = NULL; - while ((c = getopt(argc, argv, "hrwvsd:n:x:")) != -1) { + while ((c = getopt(argc, argv, "hrwlvsd:n:x:")) != -1) { switch (c) { case 'r': mode = MODE_READ; break; - case 'w': + case 'w': mode = MODE_WRITE; break; + case 'l': + mode = MODE_LIST; + break; case 'n': nickname = optarg; break; @@ -240,7 +271,7 @@ MESSAGE(VERB_NORMAL, "Normal verbosity messages are printed.\n"); MESSAGE(VERB_HIGH, "High verbosity messages are printed.\n"); - if (nickname == NULL) { + if (nickname == NULL && mode != MODE_LIST) { usage(); exit(1); } @@ -251,13 +282,16 @@ } switch (mode) { - case MODE_WRITE : + case MODE_WRITE : ret = write_mode(&data, device, nickname, value); break; - case MODE_READ : + case MODE_READ : ret = read_mode(&data, device, nickname); break; - default : + case MODE_LIST : + ret = list_mode(&data, device); + break; + default : MESSAGE(VERB_LOW, "Unknown mode of operation\n"); usage(); ret = 1;