From b5e4871b39d1b6322ce5d03572bca45efe77348e Mon Sep 17 00:00:00 2001 From: Hamish Moffatt Date: Thu, 7 Feb 2008 00:51:57 +0000 Subject: Added a package for fconfig, which allows you to modify RedBoot configuration parameters from linux. --- package/fconfig/fconfig-listmode.patch | 177 +++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 package/fconfig/fconfig-listmode.patch (limited to 'package/fconfig/fconfig-listmode.patch') diff --git a/package/fconfig/fconfig-listmode.patch b/package/fconfig/fconfig-listmode.patch new file mode 100644 index 000000000..e7f2418f2 --- /dev/null +++ b/package/fconfig/fconfig-listmode.patch @@ -0,0 +1,177 @@ +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; -- cgit v1.2.3