From a804f444eb6c0a5232e37db3a58193fa2a549cd9 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Tue, 25 Jan 2011 21:40:46 +0100 Subject: [PATCH] provide a workaround if program_invocation_short_name is missing 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 Signed-off-by: Karel Zak --- configure.ac | 16 ++++++++++++++ include/c.h | 36 +++++++++++++++++++++++++++++++ shlibs/blkid/samples/partitions.c | 1 + 3 files changed, 53 insertions(+) diff --git a/configure.ac b/configure.ac index 59b55ea0..f27ba3e1 100644 --- a/configure.ac +++ b/configure.ac @@ -191,6 +191,7 @@ AC_CHECK_FUNCS( strtoull \ sysconf \ getdtablesize \ + getexecname \ getrlimit \ srandom \ setresgid \ @@ -248,6 +249,21 @@ no:no) esac +AC_MSG_CHECKING(whether program_invocation_short_name is defined) +AC_TRY_COMPILE([#include ], + [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 index b37c4422..70e911dd 100644 --- a/include/c.h +++ b/include/c.h @@ -82,5 +82,41 @@ static inline int dirfd(DIR *d) } #endif +#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME +# ifdef HAVE___PROGNAME +extern char *__progname; +# define program_invocation_short_name __progname +# else +# include +# ifdef HAVE_GETEXECNAME +# include +# 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 index db1b5ff2..8ee55996 100644 --- a/shlibs/blkid/samples/partitions.c +++ b/shlibs/blkid/samples/partitions.c @@ -14,6 +14,7 @@ #include #include +#include "c.h" int main(int argc, char *argv[]) { -- 2.39.5