summaryrefslogtreecommitdiffstats
path: root/lib_generic
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-05 18:01:34 +0200
committerSascha Hauer <sha@octopus.labnet.pengutronix.de>2007-07-05 18:01:34 +0200
commit8dcc816ba942e4db1622df05e4bb0e049684dacf (patch)
tree50f3042d32a1220646f92dce2ecd443cd0f180fe /lib_generic
parent62fb48c82b44436e85ae2a8a5c93ef178583cf65 (diff)
downloadbarebox-8dcc816ba942e4db1622df05e4bb0e049684dacf.tar.gz
barebox-8dcc816ba942e4db1622df05e4bb0e049684dacf.tar.xz
svn_rev_227
fix parameter handling
Diffstat (limited to 'lib_generic')
-rw-r--r--lib_generic/global.c32
-rw-r--r--lib_generic/misc.c70
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;
}