From 9ffd416db51912bee7fb89058a9dd87dc6b122fd Mon Sep 17 00:00:00 2001 From: Burt P Date: Mon, 17 Jul 2017 01:59:04 -0500 Subject: device tree: attempt to clean the labels for hardinfo shell Signed-off-by: Burt P --- modules/devices/devicetree.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) (limited to 'modules/devices/devicetree.c') diff --git a/modules/devices/devicetree.c b/modules/devices/devicetree.c index f9697f28..c61a6846 100644 --- a/modules/devices/devicetree.c +++ b/modules/devices/devicetree.c @@ -57,6 +57,28 @@ static struct { { NULL, 0 }, }; +/* Hardinfo labels that have # are truncated and/or hidden. + * Labels can't have $ because that is the delimiter in + * moreinfo. */ +gchar *hardinfo_clean_label(const gchar *v, int replacing) { + gchar *clean, *p; + + p = clean = g_strdup(v); + while (*p != 0) { + switch(*p) { + case '#': case '$': case '&': + *p = '_'; + break; + default: + break; + } + p++; + } + if (replacing) + g_free((gpointer)v); + return clean; +} + static int dt_guess_type(dt_raw *prop) { char *tmp, *slash; int i = 0, anc = 0, might_be_str = 1; @@ -181,7 +203,7 @@ gchar *dtree_info = NULL; gchar *get_node(char *np) { gchar *nodes = NULL, *props = NULL, *ret = NULL; - gchar *tmp = NULL, *pstr = NULL; + gchar *tmp = NULL, *pstr = NULL, *lstr = NULL; gchar *dir_path = g_strdup_printf("/proc/device-tree/%s", np); gchar *node_path; const gchar *fn; @@ -197,19 +219,21 @@ gchar *get_node(char *np) { node_path = g_strdup_printf("%s/%s", np, fn); prop = get_dt_raw(node_path); pstr = dt_str(prop); + lstr = hardinfo_clean_label(fn, 0); if (prop->type == DT_NODE) { tmp = g_strdup_printf("%s%s=%s\n", - nodes, fn, pstr); + nodes, lstr, pstr); g_free(nodes); nodes = tmp; } else if (prop->type == DT_PROPERTY) { tmp = g_strdup_printf("%s%s=%s\n", - props, fn, pstr); + props, lstr, pstr); g_free(props); props = tmp; } dt_raw_free(prop); g_free(pstr); + g_free(lstr); g_free(node_path); } } @@ -258,12 +282,15 @@ gchar *get_summary() { } void mi_add(const char *key, const char *value) { - gchar *rkey; - rkey = g_strdup_printf("%s:%s", "DTREE", key); + gchar *ckey, *rkey; + + ckey = hardinfo_clean_label(key, 0); + rkey = g_strdup_printf("%s:%s", "DTREE", ckey); - dtree_info = g_strdup_printf("%s$%s$%s=\n", dtree_info, rkey, key); + dtree_info = g_strdup_printf("%s$%s$%s=\n", dtree_info, rkey, ckey); moreinfo_add_with_prefix("DEV", rkey, g_strdup(value)); + g_free(ckey); g_free(rkey); } -- cgit v1.2.3