util: implement pa_get_binary_name on FreeBSD without procfs requirement

procfs is not mounted by default, sysctl offers a bulletproof way
of requesting this information.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/277>
This commit is contained in:
Greg V 2020-04-02 18:49:58 +03:00 committed by PulseAudio Marge Bot
parent e6560becf1
commit f57ceec7a2

View file

@ -91,6 +91,10 @@ static int _main() PA_GCC_WEAKREF(main);
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif #endif
#ifdef __FreeBSD__
#include <sys/sysctl.h>
#endif
#ifdef HAVE_DBUS #ifdef HAVE_DBUS
#include <pulsecore/rtkit.h> #include <pulsecore/rtkit.h>
#endif #endif
@ -224,7 +228,7 @@ char *pa_get_binary_name(char *s, size_t l) {
} }
#endif #endif
#if defined(__linux__) || defined(__FreeBSD_kernel__) #if defined(__linux__) || (defined(__FreeBSD_kernel__) && !defined(__FreeBSD__))
{ {
char *rp; char *rp;
/* This works on Linux and Debian/kFreeBSD */ /* This works on Linux and Debian/kFreeBSD */
@ -239,11 +243,12 @@ char *pa_get_binary_name(char *s, size_t l) {
#ifdef __FreeBSD__ #ifdef __FreeBSD__
{ {
char *rp; char path[PATH_MAX + 1];
size_t len = PATH_MAX;
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
if ((rp = pa_readlink("/proc/curproc/file"))) { if (sysctl(mib, 4, &path, &len, NULL, 0) == 0) {
pa_strlcpy(s, pa_path_get_filename(rp), l); pa_strlcpy(s, pa_path_get_filename(path), l);
pa_xfree(rp);
return s; return s;
} }
} }