Add setprogname(3) for those without it.

This commit is contained in:
Todd C. Miller
2021-01-06 13:01:09 -07:00
parent 7788581473
commit 9e068c15e0
4 changed files with 45 additions and 5 deletions

17
configure vendored
View File

@@ -22930,7 +22930,8 @@ if test "x$ac_cv_func_getprogname" = xyes; then :
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define HAVE_GETPROGNAME 1 #define HAVE_GETPROGNAME 1
_ACEOF _ACEOF
for ac_func in setprogname
for ac_func in setprogname
do : do :
ac_fn_c_check_func "$LINENO" "setprogname" "ac_cv_func_setprogname" ac_fn_c_check_func "$LINENO" "setprogname" "ac_cv_func_setprogname"
if test "x$ac_cv_func_setprogname" = xyes; then : 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 #define HAVE_SETPROGNAME 1
_ACEOF _ACEOF
else
for _sym in sudo_setprogname; do
COMPAT_EXP="${COMPAT_EXP}${_sym}
"
done
fi fi
done done
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __progname" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __progname" >&5
@@ -22982,6 +22991,12 @@ $as_echo "$sudo_cv___progname" >&6; }
done done
for _sym in sudo_setprogname; do
COMPAT_EXP="${COMPAT_EXP}${_sym}
"
done
fi fi
done done

View File

@@ -3309,9 +3309,11 @@ esac
LIBS="$OLIBS" LIBS="$OLIBS"
dnl dnl
dnl Check for getprogname() or __progname dnl Check for getprogname()/setprogname() or __progname
dnl 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_MSG_CHECKING([for __progname])
AC_CACHE_VAL(sudo_cv___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])]) 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 fi
AC_MSG_RESULT($sudo_cv___progname) AC_MSG_RESULT($sudo_cv___progname)
SUDO_APPEND_COMPAT_EXP(sudo_getprogname) SUDO_APPEND_COMPAT_EXP(sudo_getprogname)
SUDO_APPEND_COMPAT_EXP(sudo_setprogname)
]) ])
dnl dnl
dnl Check for __func__ or __FUNCTION__ dnl Check for __func__ or __FUNCTION__

View File

@@ -575,6 +575,11 @@ sudo_dso_public const char *sudo_getprogname(void);
# undef getprogname # undef getprogname
# define getprogname() sudo_getprogname() # define getprogname() sudo_getprogname()
#endif /* HAVE_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 #ifndef HAVE_REALLOCARRAY
sudo_dso_public void *sudo_reallocarray(void *ptr, size_t nmemb, size_t size); sudo_dso_public void *sudo_reallocarray(void *ptr, size_t nmemb, size_t size);
# undef reallocarray # undef reallocarray

View File

@@ -31,10 +31,21 @@
#ifdef HAVE_GETPROGNAME #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 void
initprogname2(const char *name, const char * const * allowed) initprogname2(const char *name, const char * const * allowed)
{ {
# ifdef HAVE_SETPROGNAME
const char *progname; const char *progname;
int i; int i;
@@ -61,7 +72,6 @@ initprogname2(const char *name, const char * const * allowed)
/* Update internal progname if needed. */ /* Update internal progname if needed. */
if (name != progname) if (name != progname)
setprogname(name); setprogname(name);
# endif
return; return;
} }
@@ -109,6 +119,13 @@ sudo_getprogname(void)
{ {
return progname; return progname;
} }
void
sudo_setprogname(const char *name)
{
const char *base = strrchr(name, '/');
progname = base ? base : name;
}
#endif /* !HAVE_GETPROGNAME */ #endif /* !HAVE_GETPROGNAME */
void void