summaryrefslogtreecommitdiffstats
path: root/package/fconfig/fconfig-listmode.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/fconfig/fconfig-listmode.patch')
-rw-r--r--package/fconfig/fconfig-listmode.patch177
1 files changed, 177 insertions, 0 deletions
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 <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;