aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/cmd_line.c
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2023-04-29 22:14:41 +0200
committerEgor Tensin <Egor.Tensin@gmail.com>2023-04-29 22:16:42 +0200
commitb58e8bfe04f4f8bcbb18dd6cb7c01f4d44b1f9ec (patch)
tree4c7afa46057e73d111e3ef9004a95205f66b0179 /src/cmd_line.c
parentdedupe command line routines (diff)
downloadcimple-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.c51
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);
}