diff --git a/configure b/configure index 7ea34399a..2467429c8 100755 --- a/configure +++ b/configure @@ -22930,7 +22930,8 @@ if test "x$ac_cv_func_getprogname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPROGNAME 1 _ACEOF - for ac_func in setprogname + + for ac_func in setprogname do : ac_fn_c_check_func "$LINENO" "setprogname" "ac_cv_func_setprogname" if test "x$ac_cv_func_setprogname" = xyes; then : @@ -22938,9 +22939,17 @@ if test "x$ac_cv_func_setprogname" = xyes; then : #define HAVE_SETPROGNAME 1 _ACEOF +else + + for _sym in sudo_setprogname; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + fi done + else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __progname" >&5 @@ -22982,6 +22991,12 @@ $as_echo "$sudo_cv___progname" >&6; } done + for _sym in sudo_setprogname; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + fi done diff --git a/configure.ac b/configure.ac index 7c1503fdd..4221dbec8 100644 --- a/configure.ac +++ b/configure.ac @@ -3309,9 +3309,11 @@ esac LIBS="$OLIBS" dnl -dnl Check for getprogname() or __progname +dnl Check for getprogname()/setprogname() or __progname dnl -AC_CHECK_FUNCS([getprogname], [AC_CHECK_FUNCS([setprogname])], [ +AC_CHECK_FUNCS([getprogname], [ + AC_CHECK_FUNCS([setprogname], [], [SUDO_APPEND_COMPAT_EXP(sudo_setprogname)]) +], [ AC_MSG_CHECKING([for __progname]) AC_CACHE_VAL(sudo_cv___progname, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[extern char *__progname; if (__progname[0] == '\0') return 1;]])], [sudo_cv___progname=yes], [sudo_cv___progname=no])]) @@ -3320,6 +3322,7 @@ AC_CHECK_FUNCS([getprogname], [AC_CHECK_FUNCS([setprogname])], [ fi AC_MSG_RESULT($sudo_cv___progname) SUDO_APPEND_COMPAT_EXP(sudo_getprogname) + SUDO_APPEND_COMPAT_EXP(sudo_setprogname) ]) dnl dnl Check for __func__ or __FUNCTION__ diff --git a/include/sudo_compat.h b/include/sudo_compat.h index 095dd04d0..15aeeca70 100644 --- a/include/sudo_compat.h +++ b/include/sudo_compat.h @@ -575,6 +575,11 @@ sudo_dso_public const char *sudo_getprogname(void); # undef getprogname # define getprogname() sudo_getprogname() #endif /* HAVE_GETPROGNAME */ +#ifndef HAVE_SETPROGNAME +sudo_dso_public void sudo_setprogname(const char *name); +# undef setprogname +# define setprogname(_a) sudo_setprogname(_a) +#endif /* HAVE_SETPROGNAME */ #ifndef HAVE_REALLOCARRAY sudo_dso_public void *sudo_reallocarray(void *ptr, size_t nmemb, size_t size); # undef reallocarray diff --git a/lib/util/progname.c b/lib/util/progname.c index d1bf15d15..57a8c03af 100644 --- a/lib/util/progname.c +++ b/lib/util/progname.c @@ -31,10 +31,21 @@ #ifdef HAVE_GETPROGNAME +# ifndef HAVE_SETPROGNAME +/* Assume __progname if have getprogname(3) but not setprogname(3). */ +extern const char *__progname; + +void +sudo_setprogname(const char *name) +{ + const char *base = strrchr(name, '/'); + __progname = base ? base : name; +} +# endif + void initprogname2(const char *name, const char * const * allowed) { -# ifdef HAVE_SETPROGNAME const char *progname; int i; @@ -61,7 +72,6 @@ initprogname2(const char *name, const char * const * allowed) /* Update internal progname if needed. */ if (name != progname) setprogname(name); -# endif return; } @@ -109,6 +119,13 @@ sudo_getprogname(void) { return progname; } + +void +sudo_setprogname(const char *name) +{ + const char *base = strrchr(name, '/'); + progname = base ? base : name; +} #endif /* !HAVE_GETPROGNAME */ void