| 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 <string.h> |
| #include <unistd.h> |
| #include <fcntl.h> |
| +#include <getopt.h> |
| |
| #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; |