Date: Tue, 18 Nov 2025 00:52:18 GMT From: Christos Margiolis <christos@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: ea9d875a6477 - stable/15 - virtual_oss(8): Improve hw.snd.basename_clone handling Message-ID: <202511180052.5AI0qI7V047042@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch stable/15 has been updated by christos: URL: https://cgit.FreeBSD.org/src/commit/?id=ea9d875a6477b5394b6687e6308783c4564fac22 commit ea9d875a6477b5394b6687e6308783c4564fac22 Author: Christos Margiolis <christos@FreeBSD.org> AuthorDate: 2025-11-11 12:07:44 +0000 Commit: Christos Margiolis <christos@FreeBSD.org> CommitDate: 2025-11-18 00:51:24 +0000 virtual_oss(8): Improve hw.snd.basename_clone handling If we request a /dev/dsp virtual_oss(8) device, we have to replace the sound(4) one by first disabling hw.snd.basename_clone. This sysctl tells sound(4) to not create the /dev/dsp alias for the default device. There are currently two issues with the way this is handled by virtual_oss(8), however: 1. It uses system(3) instead of sysctlbyname(3). 2. It does not restore hw.snd.basename_clone to its original value, so if prior to virtual_oss(8) running, hw.snd.basename_clone was enabled (which is the case by default), and it is closed at some point, hw.snd.basename_clone stays disabled, which is annoying, because users have to manually restore it, otherwise applications that open the default device (i.e., most) will not work. Fix both issues. Sponsored by: The FreeBSD Foundation MFC after: 1 week Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D53621 (cherry picked from commit e5c0d7020f3d040b28dc7ca0cda9926e07e5aaf4) --- usr.sbin/virtual_oss/virtual_oss/main.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/usr.sbin/virtual_oss/virtual_oss/main.c b/usr.sbin/virtual_oss/virtual_oss/main.c index f2fd085664ed..28095880c201 100644 --- a/usr.sbin/virtual_oss/virtual_oss/main.c +++ b/usr.sbin/virtual_oss/virtual_oss/main.c @@ -31,6 +31,7 @@ #include <sys/nv.h> #include <sys/sndstat.h> #include <sys/soundcard.h> +#include <sys/sysctl.h> #include <dlfcn.h> #include <errno.h> @@ -52,6 +53,8 @@ #include "int.h" #include "virtual_oss.h" +#define SYSCTL_BASECLONE "hw.snd.basename_clone" + pthread_mutex_t atomic_mtx; pthread_cond_t atomic_cv; @@ -1617,6 +1620,7 @@ volatile sig_atomic_t voss_exit = 0; static int voss_dsp_perm = 0666; static int voss_do_background; +static int voss_baseclone = 0; static const char *voss_pid_path; uint32_t voss_dsp_rx_refresh; @@ -1739,6 +1743,20 @@ usage(void) exit(EX_USAGE); } +/* + * Restore hw.snd.basename_clone if it was disabled by us. + */ +static void +restore_baseclone(void) +{ + if (voss_baseclone) { + if (sysctlbyname(SYSCTL_BASECLONE, NULL, NULL, &voss_baseclone, + sizeof(int)) < 0) + warn("Could not enable " SYSCTL_BASECLONE); + printf(SYSCTL_BASECLONE ": 0 -> %d\n", voss_baseclone); + } +} + static void init_compressor(struct virtual_profile *pvp) { @@ -1883,8 +1901,18 @@ dup_profile(vprofile_t *pvp, int *pamp, int pol, int rx_mute, * Detect /dev/dsp creation and try to disable system * basename cloning automatically: */ - if (strcmp(ptr->oss_name, "dsp") == 0) - system("sysctl hw.snd.basename_clone=0"); + if (strcmp(ptr->oss_name, "dsp") == 0) { + size_t size; + + x = 0; + size = sizeof(int); + if (sysctlbyname(SYSCTL_BASECLONE, &voss_baseclone, + &size, &x, size) < 0) + return ("Could not disable " SYSCTL_BASECLONE); + printf(SYSCTL_BASECLONE ": %d -> 0\n", voss_baseclone); + if (atexit(restore_baseclone) < 0) + return ("Could not set atexit callback"); + } /* create DSP character device */ pdev = cuse_dev_create(&vclient_oss_methods, ptr, NULL,help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202511180052.5AI0qI7V047042>
