From 7e29400b52db944f8bd7db7135ac57a5ed0fd0f6 Mon Sep 17 00:00:00 2001 From: Patrick Lipka Date: Mon, 18 Aug 2025 17:30:05 +0200 Subject: [PATCH] add program name resolution --- src/rvprof_utils.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/rvprof_utils.c diff --git a/src/rvprof_utils.c b/src/rvprof_utils.c new file mode 100644 index 0000000..7861eed --- /dev/null +++ b/src/rvprof_utils.c @@ -0,0 +1,46 @@ +#include "rvprof_internal.h" + +char* rvprof_utils_get_program_name(void){ + static char resolved_name[256]; + char link_path[32]; + ssize_t len; + + // option 1: try /proc/self/exe (Linux only) + snprintf(link_path, sizeof(link_path), "/proc/self/exe"); + len = readlink(link_path, resolved_name, sizeof(resolved_name) - 1); + if (len > 0) { + resolved_name[len] = '\0'; + // Extract just the filename from full path + char* basename = strrchr(resolved_name, '/'); + if (basename) { + return basename + 1; // Skip the '/' + } + return resolved_name; + } + + // option 2: try /proc/self/cmdline (fallback) + FILE* cmdline = fopen("/proc/self/cmdline", "r"); + if (cmdline) { + if (fgets(resolved_name, sizeof(resolved_name), cmdline)) { + fclose(cmdline); + char* basename = strrchr(resolved_name, '/'); + if (basename) { + return basename + 1; + } + return resolved_name; + } + fclose(cmdline); + } + + // option 3: use provided program name if available + if (g_rvprof.config.program_name) { + char* basename = strrchr(g_rvprof.config.program_name, '/'); + if (basename) { + return basename + 1; + } + return g_rvprof.config.program_name; + } + + // option 4: fallback + return "unknown_program"; +} \ No newline at end of file