123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- 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;
|