diff --git a/src/barebox-state.c b/src/barebox-state.c index 0ed6700..25f3bc3 100644 --- a/src/barebox-state.c +++ b/src/barebox-state.c @@ -37,8 +37,6 @@ #include
#include -static int verbose; - struct state_variable; static int __state_uint8_set(struct state_variable *var, const char *val); @@ -323,7 +321,7 @@ root = of_read_proc_devicetree(); if (IS_ERR(root)) { - fprintf(stderr, "Unable to read devicetree. %s\n", + pr_err("Unable to read devicetree. %s\n", strerror(-PTR_ERR(root))); return ERR_CAST(root); } @@ -333,7 +331,7 @@ if (name) { node = of_find_node_by_path_or_alias(root, name); if (!node) { - fprintf(stderr, "no such node: %s\n", name); + pr_err("no such node: %s\n", name); return ERR_PTR(-ENOENT); } } else { @@ -341,31 +339,30 @@ if (!node) node = of_find_node_by_path_or_alias(root, "/state"); if (!node) { - fprintf(stderr, "Neither /aliases/state nor /state found\n"); + pr_err("Neither /aliases/state nor /state found\n"); return ERR_PTR(-ENOENT); } } - if (verbose > 1) { - printf("found state node %s:\n", node->full_name); + pr_debug("found state node %s:\n", node->full_name); + if (pr_level_get() > 6) of_print_nodes(node, 0); - } partition_node = of_parse_phandle(node, "backend", 0); if (!partition_node) { - fprintf(stderr, "cannot find backend node in %s\n", node->full_name); + pr_err("cannot find backend node in %s\n", node->full_name); exit (1); } ret = of_get_devicepath(partition_node, &devpath, &offset, &size); if (ret) { - fprintf(stderr, "Cannot find backend path in %s\n", node->full_name); + pr_err("Cannot find backend path in %s\n", node->full_name); return ERR_PTR(ret); } state = state_new_from_node(node, devpath, offset, size, readonly); if (IS_ERR(state)) { - fprintf(stderr, "unable to initialize state: %s\n", + pr_err("unable to initialize state: %s\n", strerror(PTR_ERR(state))); return ERR_CAST(state); } @@ -398,6 +395,7 @@ "-d, --dump dump the state\n" "--dump-shell dump the state suitable for shell sourcing\n" "-v, --verbose increase verbosity\n" +"-q, --quiet decrease verbosity\n" "--help this help\n", name); } @@ -429,12 +427,13 @@ int lock_fd; int nr_states = 0; bool readonly = true; + int pr_level = 5; INIT_LIST_HEAD(&sg_list); INIT_LIST_HEAD(&state_list.list); while (1) { - c = getopt_long(argc, argv, "hg:s:dvn:", long_options, &option_index); + c = getopt_long(argc, argv, "hg:s:dvn:q", long_options, &option_index); if (c < 0) break; switch (c) { @@ -461,7 +460,10 @@ do_dump_shell = 1; break; case 'v': - verbose++; + pr_level++; + break; + case 'q': + pr_level--; break; case 'n': { @@ -483,6 +485,8 @@ } } + pr_level_set(pr_level); + if (nr_states == 0) { struct state_list *new_state; @@ -495,13 +499,13 @@ lock_fd = open("/var/lock/barebox-state", O_CREAT | O_RDWR, 0600); if (lock_fd < 0) { - fprintf(stderr, "Failed to open lock-file /var/lock/barebox-state\n"); + pr_err("Failed to open lock-file /var/lock/barebox-state\n"); exit(1); } ret = flock(lock_fd, LOCK_EX | LOCK_NB); if (ret < 0) { - fprintf(stderr, "Failed to lock. Already locked by other process /var/lock/barebox-state.\n"); + pr_err("Failed to lock. Already locked by other process /var/lock/barebox-state.\n"); close(lock_fd); exit(1); } @@ -523,7 +527,7 @@ vtype = state_find_type(v->type); if (!vtype) { - fprintf(stderr, "no such type: %d\n", v->type); + pr_err("no such type: %d\n", v->type); ret = 1; goto out_unlock; } @@ -533,7 +537,7 @@ vtype->get(v)); else printf("%s=%s", v->name, vtype->get(v)); - if (verbose) { + if (pr_level_get() > 5) { printf(", type=%s", vtype->type_name); if (vtype->info) vtype->info(v); @@ -584,7 +588,7 @@ if (sg->get) { char *val = state_get_var(state->state, arg); if (!val) { - fprintf(stderr, "no such variable: %s\n", arg); + pr_err("no such variable: %s\n", arg); ret = 1; goto out_unlock; } @@ -596,14 +600,14 @@ var = arg; val = index(arg, '='); if (!val) { - fprintf(stderr, "usage: -s var=val\n"); + pr_err("usage: -s var=val\n"); ret = 1; goto out_unlock; } *val++ = '\0'; ret = state_set_var(state->state, var, val); if (ret) { - fprintf(stderr, "Failed to set variable %s in state %s to %s: %s\n", + pr_err("Failed to set variable %s in state %s to %s: %s\n", var, state->name, val, strerror(-ret)); ret = 1; @@ -616,7 +620,7 @@ if (state->state->dirty) { ret = state_save(state->state); if (ret) { - fprintf(stderr, "Failed to save state: %s\n", strerror(-ret)); + pr_err("Failed to save state: %s\n", strerror(-ret)); ret = 1; goto out_unlock; } diff --git a/src/dt/common.h b/src/dt/common.h index 2c45c11..f6bad44 100644 --- a/src/dt/common.h +++ b/src/dt/common.h @@ -35,19 +35,31 @@ #undef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#ifdef DEBUG -#define pr_debug(fmt, arg...) fprintf(stderr, fmt, ##arg) -#else -#define pr_debug(fmt, arg...) -#endif +struct device_d; -#define pr_err(fmt, arg...) fprintf(stderr, fmt, ##arg) -#define pr_warn(fmt, arg...) pr_err(fmt, ##arg) -#define pr_info(fmt, arg...) pr_err(fmt, ##arg) -#define dev_err(dev, fmt, arg...) pr_err(fmt, ##arg) -#define dev_warn(dev, fmt, arg...) pr_err(fmt, ##arg) -#define dev_info(dev, fmt, arg...) pr_err(fmt, ##arg) -#define dev_dbg(dev, fmt, arg...) pr_debug(fmt, ##arg) +void pr_level_set(int level); +int pr_level_get(void); + +int pr_printf(int level, const char *format, ...) + __attribute__ ((format(__printf__, 2, 3))); +int dev_printf(int level, const struct device_d *dev, const char *format, ...) + __attribute__ ((format(__printf__, 3, 4))); + +#define pr_err(fmt, arg...) pr_printf(3, fmt, ##arg) +#define pr_warn(fmt, arg...) pr_printf(4, fmt, ##arg) +#define pr_notice(fmt, arg...) pr_printf(5, fmt, ##arg) +#define pr_info(fmt, arg...) pr_printf(6, fmt, ##arg) +#define pr_debug(fmt, arg...) pr_printf(7, fmt, ##arg) +#define dev_err(dev, format, arg...) \ + dev_printf(3, (dev) , format , ## arg) +#define dev_warn(dev, format, arg...) \ + dev_printf(4, (dev) , format , ## arg) +#define dev_notice(dev, format, arg...) \ + dev_printf(5, (dev) , format , ## arg) +#define dev_info(dev, format, arg...) \ + dev_printf(6, (dev) , format , ## arg) +#define dev_dbg(dev, format, arg...) \ + dev_printf(7, (dev) , format , ## arg) #define __WARN() do { \ printf("WARNING: at %s:%d/%s()!\n", __FILE__, __LINE__, __FUNCTION__); \ diff --git a/src/libdt-utils.sym b/src/libdt-utils.sym index 106bccd..ee7f430 100644 --- a/src/libdt-utils.sym +++ b/src/libdt-utils.sym @@ -2,6 +2,7 @@ global: crc32; crc32_no_comp; + dev_printf; device_find_partition; of_alias_get; of_alias_get_id; @@ -70,6 +71,9 @@ of_set_property; of_set_root_node; of_unflatten_dtb; + pr_level_get; + pr_level_set; + pr_printf; local: *; }; diff --git a/src/libdt.c b/src/libdt.c index 853259f..2c730cd 100644 --- a/src/libdt.c +++ b/src/libdt.c @@ -35,6 +35,60 @@ #include #include +static int pr_level = 5; + +void pr_level_set(int level) +{ + pr_level = level; +} + +int pr_level_get(void) +{ + return pr_level; +} + +int pr_printf(int level, const char *format, ...) +{ + va_list args; + int ret = 0; + char printbuffer[1025] = {}; + + if (level > pr_level) + return 0; + + va_start(args, format); + + ret += vsnprintf(printbuffer + ret, 1024 - ret, format, args); + + va_end(args); + + fprintf(stderr, "%s", printbuffer); + + return ret; +} + +int dev_printf(int level, const struct device_d *dev, const char *format, ...) +{ + va_list args; + int ret = 0; + char printbuffer[1025] = {}; + + if (level > pr_level) + return 0; + + ret += sprintf(printbuffer + ret, "%s: ", dev->name); + + va_start(args, format); + + ret += vsnprintf(printbuffer + ret, 1024 - ret, format, args); + + va_end(args); + + fprintf(stderr, "%s", printbuffer); + + return ret; +} + static int is_printable_string(const void *data, int len) { const char *s = data;