[PATCH] provide a workaround if program_invocation_short_name is missing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Try some replacements, such as getexecname() on Solaris and __progname
on BSDs and Darwin.  When not found, base program_invocation_short_name
on the source filename it is used in, as not to require argv[0] to be
passed along.  This latter approach is not dynamic, but doesn't require
code changes for all places where program_invocation_short_name is used
now.

Signed-off-by: Fabian Groffen <grobian@xxxxxxxxxx>

diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -191,6 +191,7 @@
 	strtoull \
 	sysconf \
 	getdtablesize \
+	getexecname \
 	getrlimit \
 	srandom \
 	setresgid \
@@ -248,6 +249,21 @@
 esac
 
 
+AC_MSG_CHECKING(whether program_invocation_short_name is defined)
+AC_TRY_COMPILE([#include <argp.h>],
+               [program_invocation_short_name = "test";],
+               AC_DEFINE(HAVE_PROGRAM_INVOCATION_SHORT_NAME, 1,
+                [Define if program_invocation_short_name is defined])
+                AC_MSG_RESULT(yes),
+               AC_MSG_RESULT(no))
+
+AC_MSG_CHECKING([whether __progname is defined])
+AC_LINK_IFELSE([AC_LANG_PROGRAM([extern char *__progname;],
+           [if (*__progname == 0) return;])],
+           AC_DEFINE(HAVE___PROGNAME, 1, [Define if __progname is defined])
+            AC_MSG_RESULT(yes),
+           AC_MSG_RESULT(no))
+
 dnl Static compilation
 m4_define([UTIL_STATIC_PROGRAMS], [losetup, mount, umount, fdisk, sfdisk, blkid])
 
diff --git a/include/c.h b/include/c.h
--- a/include/c.h
+++ b/include/c.h
@@ -82,5 +82,41 @@
 }
 #endif
 
+#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
+# ifdef HAVE___PROGNAME
+extern char *__progname;
+#  define program_invocation_short_name __progname
+# else
+#  include <string.h>
+#  ifdef HAVE_GETEXECNAME
+#   include <stdlib.h>
+#   define program_invocation_short_name \
+		prog_inv_sh_nm_from_file(getexecname(), 0)
+#  else
+#   define program_invocation_short_name \
+		prog_inv_sh_nm_from_file(__FILE__, 1)
+#  endif
+static char prog_inv_sh_nm_buf[256];
+static inline char *
+prog_inv_sh_nm_from_file(char *f, char stripext)
+{
+	char *t;
+
+	if ((t = strrchr(f, '/')) != NULL)
+		t++;
+	else
+		t = f;
+
+	strncpy(prog_inv_sh_nm_buf, t, sizeof(prog_inv_sh_nm_buf) - 1);
+	prog_inv_sh_nm_buf[sizeof(prog_inv_sh_nm_buf) - 1] = '\0';
+
+	if (stripext && (t = strrchr(prog_inv_sh_nm_buf, '.')) != NULL)
+		*t = '\0';
+
+	return prog_inv_sh_nm_buf;
+}
+# endif
+#endif
+
 
 #endif /* UTIL_LINUX_C_H */
diff --git a/shlibs/blkid/samples/partitions.c b/shlibs/blkid/samples/partitions.c
--- a/shlibs/blkid/samples/partitions.c
+++ b/shlibs/blkid/samples/partitions.c
@@ -14,6 +14,7 @@
 #include <errno.h>
 
 #include <blkid.h>
+#include "c.h"
 
 int main(int argc, char *argv[])
 {
--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux