diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2007-07-05 18:01:34 +0200 |
---|---|---|
committer | Sascha Hauer <sha@octopus.labnet.pengutronix.de> | 2007-07-05 18:01:34 +0200 |
commit | 8dcc816ba942e4db1622df05e4bb0e049684dacf (patch) | |
tree | 50f3042d32a1220646f92dce2ecd443cd0f180fe /lib_generic | |
parent | 62fb48c82b44436e85ae2a8a5c93ef178583cf65 (diff) | |
download | barebox-8dcc816ba942e4db1622df05e4bb0e049684dacf.tar.gz barebox-8dcc816ba942e4db1622df05e4bb0e049684dacf.tar.xz |
svn_rev_227
fix parameter handling
Diffstat (limited to 'lib_generic')
-rw-r--r-- | lib_generic/global.c | 32 | ||||
-rw-r--r-- | lib_generic/misc.c | 70 |
2 files changed, 81 insertions, 21 deletions
diff --git a/lib_generic/global.c b/lib_generic/global.c index 3d13a0311d..b671a0f52f 100644 --- a/lib_generic/global.c +++ b/lib_generic/global.c @@ -4,6 +4,7 @@ #include <driver.h> #include <malloc.h> #include <asm-generic/errno.h> +#include <errno.h> static struct device_d global_dev; @@ -36,22 +37,22 @@ coredevice_initcall(global_init); static int do_get( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { struct device_d *dev; - char *endp, *str; + struct param_d *param; if (argc < 3) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } - dev = device_from_spec_str(argv[1], &endp); + dev = device_from_spec_str(argv[1], NULL); if (!dev) { printf("no such device: %s\n", argv[1]); return 1; } - str = dev_get_param(dev, argv[2]); - printf("%s\n",str); - free(str); + param = dev_get_param(dev, argv[2]); + print_param(param); + printf("\n"); return 0; } @@ -67,6 +68,8 @@ static int do_set( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) struct device_d *dev; char *endp; int ret; + struct param_d *param; + value_t val; if (argc < 4) { printf ("Usage:\n%s\n", cmdtp->usage); @@ -79,9 +82,24 @@ static int do_set( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 1; } - ret = dev_set_param(dev, argv[2], argv[3]); + param = get_param_by_name(dev, argv[2]); + + switch (param->type) { + case PARAM_TYPE_STRING: + val.val_str = argv[3]; + break; + case PARAM_TYPE_ULONG: + val.val_ulong = simple_strtoul(argv[3], NULL, 0); + break; + case PARAM_TYPE_IPADDR: + val.val_ip = string_to_ip(argv[3]); + break; + } + + ret = dev_set_param(dev, argv[2], val); + if (ret) - printf("failed\n"); + perror("set parameter failed", ret); return ret; } diff --git a/lib_generic/misc.c b/lib_generic/misc.c index fbc1ae7032..34005d657b 100644 --- a/lib_generic/misc.c +++ b/lib_generic/misc.c @@ -396,7 +396,7 @@ int dummy_probe(struct device_d *dev) return 0; } -static struct param_d *get_param_by_name(struct device_d *dev, char *name) +struct param_d *get_param_by_name(struct device_d *dev, char *name) { struct param_d *param = dev->param; @@ -409,29 +409,71 @@ static struct param_d *get_param_by_name(struct device_d *dev, char *name) return NULL; } -/* - * Get a parameter from a device. - * The string is malloced with malloc and must be freed - * with free after usage - */ -char *dev_get_param(struct device_d *dev, char *name) +void print_param(struct param_d *param) { + switch (param->type) { + case PARAM_TYPE_STRING: + printf("%s", param->value.val_str); + break; + case PARAM_TYPE_ULONG: + printf("%ld", param->value.val_ulong); + break; + case PARAM_TYPE_IPADDR: + print_IPaddr(param->value.val_ip); + break; + } +} + +struct param_d* dev_get_param(struct device_d *dev, char *name) { struct param_d *param = get_param_by_name(dev, name); if (param && param->get) return param->get(dev, param); - return NULL; + return param; +} + +IPaddr_t dev_get_param_ip(struct device_d *dev, char *name) +{ + struct param_d *param = dev_get_param(dev, name); + + if (!param || param->type != PARAM_TYPE_IPADDR) + return -1; + + return param->value.val_ip; } -int dev_set_param(struct device_d *dev, char *name, char *val) +int dev_set_param_ip(struct device_d *dev, char *name, IPaddr_t ip) +{ + value_t val; + + val.val_ip = ip; + + return dev_set_param(dev, name, val); +} + +int dev_set_param(struct device_d *dev, char *name, value_t val) { struct param_d *param = get_param_by_name(dev, name); - if (param && param->set) + if (!param) + return -EINVAL; + + if (param->flags & PARAM_FLAG_RO) + return -EACCES; + + if (param->set) return param->set(dev, param, val); - return -1; + if (param->type == PARAM_TYPE_STRING) { + if (param->value.val_str) + free(param->value.val_str); + param->value.val_str = strdup(val.val_str); + return 0; + } + + param->value = val; + return 0; } int dev_add_parameter(struct device_d *dev, struct param_d *newparam) @@ -487,9 +529,9 @@ int do_devinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) printf("%s\n", param ? "Parameters:" : "no parameters available"); while (param) { - char *val = param->get(dev, param); - printf("%16s = %s\n", param->name, val); - free(param); + printf("%16s = ", param->name); + print_param(param); + printf("\n"); param = param->next; } |