From b5e4871b39d1b6322ce5d03572bca45efe77348e Mon Sep 17 00:00:00 2001 From: Hamish Moffatt Date: Thu, 7 Feb 2008 00:51:57 +0000 Subject: [PATCH] Added a package for fconfig, which allows you to modify RedBoot configuration parameters from linux. --- package/Config.in | 1 + package/fconfig/Config.in | 6 + package/fconfig/fconfig-listmode.patch | 177 +++++++++++++++++++++++++ package/fconfig/fconfig.mk | 50 +++++++ 4 files changed, 234 insertions(+) create mode 100644 package/fconfig/Config.in create mode 100644 package/fconfig/fconfig-listmode.patch create mode 100644 package/fconfig/fconfig.mk diff --git a/package/Config.in b/package/Config.in index 929e8752ca..5de1feff23 100644 --- a/package/Config.in +++ b/package/Config.in @@ -66,6 +66,7 @@ source "package/bsdiff/Config.in" source "package/customize/Config.in" source "package/dash/Config.in" source "package/file/Config.in" +source "package/fconfig/Config.in" source "package/kexec/Config.in" if !BR2_PACKAGE_BUSYBOX_HIDE_OTHERS source "package/less/Config.in" diff --git a/package/fconfig/Config.in b/package/fconfig/Config.in new file mode 100644 index 0000000000..8a1633cad8 --- /dev/null +++ b/package/fconfig/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_FCONFIG + bool "fconfig" + default n + help + fconfig - get/set RedBoot configuration parameters from Linux. + diff --git a/package/fconfig/fconfig-listmode.patch b/package/fconfig/fconfig-listmode.patch new file mode 100644 index 0000000000..e7f2418f2d --- /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; diff --git a/package/fconfig/fconfig.mk b/package/fconfig/fconfig.mk new file mode 100644 index 0000000000..19ab3e8538 --- /dev/null +++ b/package/fconfig/fconfig.mk @@ -0,0 +1,50 @@ +############################################################# +# +# fconfig +# +############################################################# +FCONFIG_VERSION:=20060419 +FCONFIG_SOURCE:=fconfig-$(FCONFIG_VERSION).tar.gz +FCONFIG_SITE:=http://andrzejekiert.ovh.org/software/fconfig/ +FCONFIG_CAT:=$(ZCAT) +FCONFIG_DIR:=$(BUILD_DIR)/fconfig +FCONFIG_BINARY:=fconfig +FCONFIG_TARGET_BINARY:=sbin/fconfig + +$(DL_DIR)/$(FCONFIG_SOURCE): + $(WGET) -P $(DL_DIR) $(FCONFIG_SITE)/$(FCONFIG_SOURCE) + +fconfig-source: $(DL_DIR)/$(FCONFIG_SOURCE) + +$(FCONFIG_DIR)/.unpacked: $(DL_DIR)/$(FCONFIG_SOURCE) + $(FCONFIG_CAT) $(DL_DIR)/$(FCONFIG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + toolchain/patch-kernel.sh $(FCONFIG_DIR) package/fconfig \*.patch + touch $@ + +$(FCONFIG_DIR)/$(FCONFIG_BINARY): $(FCONFIG_DIR)/.unpacked + $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(FCONFIG_DIR) \ + CFLAGS="$(TARGET_CFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" + +$(TARGET_DIR)/$(FCONFIG_TARGET_BINARY): $(FCONFIG_DIR)/$(FCONFIG_BINARY) + rm -f $(TARGET_DIR)/$(FCONFIG_TARGET_BINARY) + $(INSTALL) -D -m 0755 $(FCONFIG_DIR)/$(FCONFIG_BINARY) $(TARGET_DIR)/$(FCONFIG_TARGET_BINARY) + $(STRIPCMD) $(STRIP_STRIP_ALL) $@ + +fconfig: uclibc $(TARGET_DIR)/$(FCONFIG_TARGET_BINARY) + +fconfig-clean: + -$(MAKE) -C $(FCONFIG_DIR) clean + rm -f $(TARGET_DIR)/$(FCONFIG_TARGET_BINARY) + +fconfig-dirclean: + rm -rf $(FCONFIG_DIR) + +############################################################# +# +# Toplevel Makefile options +# +############################################################# +ifeq ($(strip $(BR2_PACKAGE_FCONFIG)),y) +TARGETS+=fconfig +endif -- 2.30.2