diff options
Diffstat (limited to 'modules/devices')
-rw-r--r-- | modules/devices/devicetree.c | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/modules/devices/devicetree.c b/modules/devices/devicetree.c index 9aa31b51..5430bf28 100644 --- a/modules/devices/devicetree.c +++ b/modules/devices/devicetree.c @@ -88,26 +88,34 @@ gchar *hardinfo_clean_value(const gchar *v, int replacing) { if (v == NULL) return NULL; vl = g_strsplit(v, "&", -1); - clean = g_strjoinv("&", vl); + if (g_strv_length(vl) > 1) + clean = g_strjoinv("&", vl); + else + clean = g_strdup(v); g_strfreev(vl); vl = g_strsplit(clean, "<", -1); - tmp = g_strjoinv("<", vl); + if (g_strv_length(vl) > 1) { + tmp = g_strjoinv("<", vl); + g_free(clean); + clean = tmp; + } g_strfreev(vl); - g_free(clean); - clean = tmp; vl = g_strsplit(clean, ">", -1); - tmp = g_strjoinv(">", vl); + if (g_strv_length(vl) > 1) { + tmp = g_strjoinv(">", vl); + g_free(clean); + clean = tmp; + } g_strfreev(vl); - g_free(clean); - clean = tmp; if (replacing) g_free((gpointer)v); return clean; } +/*cstd*/ static int dt_guess_type(dt_raw *prop) { char *tmp, *slash, *dash; int i = 0, anc = 0, might_be_str = 1; @@ -155,6 +163,7 @@ static int dt_guess_type(dt_raw *prop) { return DTP_UNK; } +/*cstd*/ static char* dt_hex_list(uint32_t *list, int count) { char *ret, *dest, buff[11] = ""; int i, l; @@ -171,51 +180,56 @@ static char* dt_hex_list(uint32_t *list, int count) { return ret; } +/*cstd, except for g_strescape()*/ static char* dt_str(dt_raw *prop) { - char *tmp, *esc, *next_str, *ret = NULL; + char *tmp, *esc, *next_str; + char ret[1024] = ""; int i, l, tl; if (prop == NULL) return NULL; if (prop->type == DT_NODE) - ret = strdup("{node}"); + strcpy(ret, "{node}"); else if (prop->data == NULL) - ret = strdup("{null}"); + strcpy(ret, "{null}"); else if (prop->length == 0) - ret = strdup("{empty}"); + strcpy(ret, "{empty}"); else { i = dt_guess_type(prop); if (i == DTP_STR) { /* treat as null-separated string list */ tl = 0; - ret = g_strdup(""); + strcpy(ret, ""); + tmp = ret; next_str = prop->data; while(next_str != NULL) { l = strlen(next_str); esc = g_strescape(next_str, NULL); - tmp = g_strdup_printf("%s%s\"%s\"", - ret, strlen(ret) ? ", " : "", esc); - g_free(ret); - g_free(esc); - ret = tmp; + sprintf(tmp, "%s\"%s\"", + strlen(ret) ? ", " : "", esc); + free(esc); + tmp += strlen(tmp); tl += l + 1; next_str += l + 1; if (tl >= prop->length) break; } } else if (i == DTP_INT && prop->length == 4) { /* still use uint32_t for the byte-order conversion */ - ret = g_strdup_printf("%d", be32toh(*(uint32_t*)prop->data) ); + sprintf(ret, "%d", be32toh(*(uint32_t*)prop->data) ); } else if (i == DTP_UINT && prop->length == 4) { - ret = g_strdup_printf("%u", be32toh(*(uint32_t*)prop->data) ); + sprintf(ret, "%u", be32toh(*(uint32_t*)prop->data) ); } else if (i == DTP_HEX && !(prop->length % 4)) { l = prop->length / 4; - ret = dt_hex_list((uint32_t*)prop->data, l); + tmp = dt_hex_list((uint32_t*)prop->data, l); + strcpy(ret, tmp); + free(tmp); } else { - ret = g_strdup_printf("{data} (%lu bytes)", prop->length); + sprintf(ret, "{data} (%lu bytes)", prop->length); } } - return ret; + return strdup(ret); } +/*glib, but dt_raw *prop uses malloc() and std types */ static dt_raw *get_dt_raw(char *p) { gchar *full_path; dt_raw *prop; @@ -223,7 +237,7 @@ static dt_raw *get_dt_raw(char *p) { if (prop != NULL) { memset(prop, 0, sizeof(dt_raw)); full_path = g_strdup_printf("/proc/device-tree/%s", p); - prop->path = g_strdup(p); + prop->path = strdup(p); if ( g_file_test(full_path, G_FILE_TEST_IS_DIR) ) { prop->type = DT_NODE; } else { @@ -235,6 +249,7 @@ static dt_raw *get_dt_raw(char *p) { return NULL; } +/*cstd*/ void dt_raw_free(dt_raw *s) { if (s != NULL) { free(s->path); @@ -243,6 +258,7 @@ void dt_raw_free(dt_raw *s) { free(s); } +/*cstd*/ static char *get_dt_string(char *p, int decode) { dt_raw *prop; char *ret, *rep; @@ -251,7 +267,7 @@ static char *get_dt_string(char *p, int decode) { if (decode) ret = dt_str(prop); else { - ret = g_strdup(prop->data); + ret = strdup(prop->data); if (ret) while((rep = strchr(ret, '\n'))) *rep = ' '; } |