From f0df110ba42a6d23cb222069e4c2a4712d48d9f1 Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@tavianator.com>
Date: Sat, 24 Jun 2023 12:47:09 -0400
Subject: bfstd: Add a getprogname() wrapper

---
 src/bfstd.c | 15 +++++++++++++++
 src/bfstd.h |  8 ++++++++
 src/diag.c  | 12 +-----------
 3 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/src/bfstd.c b/src/bfstd.c
index 0e8ba5f..1f4bbb2 100644
--- a/src/bfstd.c
+++ b/src/bfstd.c
@@ -143,6 +143,21 @@ char *xgetdelim(FILE *file, char delim) {
 	}
 }
 
+const char *xgetprogname(void) {
+	const char *cmd = NULL;
+#if __GLIBC__
+	cmd = program_invocation_short_name;
+#elif BSD
+	cmd = getprogname();
+#endif
+
+	if (!cmd) {
+		cmd = BFS_COMMAND;
+	}
+
+	return cmd;
+}
+
 /** Compile and execute a regular expression for xrpmatch(). */
 static int xrpregex(nl_item item, const char *response) {
 	const char *pattern = nl_langinfo(item);
diff --git a/src/bfstd.h b/src/bfstd.h
index cafe28f..ebbcdb9 100644
--- a/src/bfstd.h
+++ b/src/bfstd.h
@@ -105,6 +105,14 @@ char *xgetdelim(FILE *file, char delim);
 
 // #include <stdlib.h>
 
+/**
+ * Wrapper for getprogname() or equivalent functionality.
+ *
+ * @return
+ *         The basename of the currently running program.
+ */
+const char *xgetprogname(void);
+
 /**
  * Process a yes/no prompt.
  *
diff --git a/src/diag.c b/src/diag.c
index 99b487a..acea9ad 100644
--- a/src/diag.c
+++ b/src/diag.c
@@ -14,17 +14,7 @@
 #include <string.h>
 
 noreturn void bfs_abortf(const struct bfs_loc *loc, const char *format, ...) {
-	const char *cmd = NULL;
-#if __GLIBC__
-	cmd = program_invocation_short_name;
-#elif BSD
-	cmd = getprogname();
-#endif
-	if (!cmd) {
-		cmd = BFS_COMMAND;
-	}
-
-	fprintf(stderr, "%s: %s@%s:%d: ", cmd, loc->func, loc->file, loc->line);
+	fprintf(stderr, "%s: %s@%s:%d: ", xgetprogname(), loc->func, loc->file, loc->line);
 
 	va_list args;
 	va_start(args, format);
-- 
cgit v1.2.3