diff options
| author | Egor Tensin <Egor.Tensin@gmail.com> | 2023-04-29 22:14:41 +0200 |
|---|---|---|
| committer | Egor Tensin <Egor.Tensin@gmail.com> | 2023-04-29 22:16:42 +0200 |
| commit | b58e8bfe04f4f8bcbb18dd6cb7c01f4d44b1f9ec (patch) | |
| tree | 4c7afa46057e73d111e3ef9004a95205f66b0179 /src/cmd_line.c | |
| parent | dedupe command line routines (diff) | |
| download | cimple-b58e8bfe04f4f8bcbb18dd6cb7c01f4d44b1f9ec.tar.gz cimple-b58e8bfe04f4f8bcbb18dd6cb7c01f4d44b1f9ec.zip | |
cmd_line: read executable name from /proc/self/exe
Diffstat (limited to 'src/cmd_line.c')
| -rw-r--r-- | src/cmd_line.c | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/src/cmd_line.c b/src/cmd_line.c index 9527d6f..fee18d4 100644 --- a/src/cmd_line.c +++ b/src/cmd_line.c @@ -6,29 +6,68 @@ */ #include "cmd_line.h" +#include "file.h" +#include "log.h" #include <stdio.h> #include <stdlib.h> +#include <string.h> -void exit_with_usage(int ec, const char *argv0) +static char *get_current_binary_path() { - FILE *dest = stdout; + return my_readlink("/proc/self/exe"); +} + +static char *get_current_binary_name() +{ + char *path, *name, *result; + + path = get_current_binary_path(); + if (!path) + return NULL; + + name = basename(path); + + result = strdup(name); + if (!result) { + log_errno("strdup"); + goto free_path; + } + +free_path: + free(path); + + return result; +} + +void exit_with_usage(int ec) +{ + char *binary; + FILE *dest; + + dest = stdout; if (ec) dest = stderr; - fprintf(dest, "usage: %s %s\n", argv0, get_usage_string()); + binary = get_current_binary_name(); + + fprintf(dest, "usage: %s %s\n", binary ?: "prog", get_usage_string()); + free(binary); exit(ec); } -void exit_with_usage_err(const char *argv0, const char *msg) +void exit_with_usage_err(const char *msg) { if (msg) fprintf(stderr, "usage error: %s\n", msg); - exit_with_usage(1, argv0); + exit_with_usage(1); } void exit_with_version() { - printf("%s\n", VERSION); + char *binary = get_current_binary_name(); + + printf("%s %s\n", binary ?: "prog", VERSION); + free(binary); exit(0); } |
