The warning() function is used in a lot of places in the libracefs library, and it is implemented as a dummy weak function. There is a weak implementation of the same function in traceevent library, which could cause a problem when both are used in an application. Replaced warning() with tracefs_warning() and implemented it as a weak function, specific to this library. Added a __weak define in the library internal header file. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> --- include/tracefs-local.h | 3 ++- src/tracefs-events.c | 2 +- src/tracefs-instance.c | 8 ++++---- src/tracefs-utils.c | 31 ++++++++++++++++++++++++++----- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/include/tracefs-local.h b/include/tracefs-local.h index 73ec113..5a69ef7 100644 --- a/include/tracefs-local.h +++ b/include/tracefs-local.h @@ -7,6 +7,7 @@ #define _TRACE_FS_LOCAL_H #define __hidden __attribute__((visibility ("hidden"))) +#define __weak __attribute__((weak)) #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) @@ -22,7 +23,7 @@ struct tracefs_instance { }; /* Can be overridden */ -void warning(const char *fmt, ...); +void tracefs_warning(const char *fmt, ...); int str_read_file(const char *file, char **buffer); char *trace_append_file(const char *dir, const char *name); diff --git a/src/tracefs-events.c b/src/tracefs-events.c index da56943..9a706ab 100644 --- a/src/tracefs-events.c +++ b/src/tracefs-events.c @@ -43,7 +43,7 @@ page_to_kbuf(struct tep_handle *tep, void *page, int size) kbuffer_load_subbuffer(kbuf, page); if (kbuffer_subbuffer_size(kbuf) > size) { - warning("%s: page_size > size", __func__); + tracefs_warning("%s: page_size > size", __func__); kbuffer_free(kbuf); kbuf = NULL; } diff --git a/src/tracefs-instance.c b/src/tracefs-instance.c index bf2fabf..e87b360 100644 --- a/src/tracefs-instance.c +++ b/src/tracefs-instance.c @@ -203,7 +203,7 @@ int tracefs_instance_destroy(struct tracefs_instance *instance) int ret = -1; if (!instance || !instance->name) { - warning("Cannot remove top instance"); + tracefs_warning("Cannot remove top instance"); return -1; } @@ -265,8 +265,8 @@ char *tracefs_instance_get_dir(struct tracefs_instance *instance) ret = asprintf(&path, "%s/instances/%s", instance->trace_dir, instance->name); if (ret < 0) { - warning("Failed to allocate path for instance %s", - instance->name); + tracefs_warning("Failed to allocate path for instance %s", + instance->name); return NULL; } @@ -308,7 +308,7 @@ static int write_file(const char *file, const char *str) fd = open(file, O_WRONLY | O_TRUNC); if (fd < 0) { - warning("Failed to open '%s'", file); + tracefs_warning("Failed to open '%s'", file); return -1; } ret = write(fd, str, strlen(str)); diff --git a/src/tracefs-utils.c b/src/tracefs-utils.c index 0e96f8e..9a70175 100644 --- a/src/tracefs-utils.c +++ b/src/tracefs-utils.c @@ -13,6 +13,7 @@ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> +#include <errno.h> #include "tracefs.h" #include "tracefs-local.h" @@ -23,8 +24,28 @@ #define _STR(x) #x #define STR(x) _STR(x) -void __attribute__((weak)) warning(const char *fmt, ...) +static int __vlib_warning(const char *fmt, va_list ap) { + int ret = errno; + + if (errno) + perror("libtracefs"); + + fprintf(stderr, " "); + vfprintf(stderr, fmt, ap); + + fprintf(stderr, "\n"); + + return ret; +} + +void __weak tracefs_warning(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __vlib_warning(fmt, ap); + va_end(ap); } static int mount_tracefs(void) @@ -76,7 +97,7 @@ __hidden char *trace_find_tracing_dir(void) fp = fopen("/proc/mounts", "r"); if (!fp) { - warning("Can't open /proc/mounts for read"); + tracefs_warning("Can't open /proc/mounts for read"); return NULL; } @@ -103,7 +124,7 @@ __hidden char *trace_find_tracing_dir(void) fspath[PATH_MAX] = 0; } else { if (mount_debugfs() < 0) { - warning("debugfs not mounted, please mount"); + tracefs_warning("debugfs not mounted, please mount"); free(debug_str); return NULL; } @@ -200,7 +221,7 @@ __hidden int str_read_file(const char *file, char **buffer) fd = open(file, O_RDONLY); if (fd < 0) { - warning("File %s not found", file); + tracefs_warning("File %s not found", file); return -1; } @@ -210,7 +231,7 @@ __hidden int str_read_file(const char *file, char **buffer) continue; nbuf = realloc(buf, size+r+1); if (!nbuf) { - warning("Failed to allocate file buffer"); + tracefs_warning("Failed to allocate file buffer"); size = -1; break; } -- 2.30.2