git: 93a234a694f3 - main - virtual_oss(8): Make sndstat FD global

From: Christos Margiolis <christos_at_FreeBSD.org>
Date: Thu, 11 Jun 2026 09:31:10 UTC
The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=93a234a694f37d373acf303a247d129dda28044e

commit 93a234a694f37d373acf303a247d129dda28044e
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2026-06-09 13:36:48 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2026-06-11 09:30:29 +0000

    virtual_oss(8): Make sndstat FD global
    
    There is no reason to have per-profile copies, plus this way we open
    /dev/sndstat multiple times if more than 1 profile is created.
    
    Also close the FD on exit to avoid leaking.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Reviewed by:    jrm
    Pull-Request:   https://ron-dev.freebsd.org/FreeBSD/src/pulls/41
---
 usr.sbin/virtual_oss/virtual_oss/int.h  |  1 -
 usr.sbin/virtual_oss/virtual_oss/main.c | 16 +++++++++-------
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/usr.sbin/virtual_oss/virtual_oss/int.h b/usr.sbin/virtual_oss/virtual_oss/int.h
index 7b7cabd62743..3cff923b2cfb 100644
--- a/usr.sbin/virtual_oss/virtual_oss/int.h
+++ b/usr.sbin/virtual_oss/virtual_oss/int.h
@@ -144,7 +144,6 @@ struct virtual_profile {
 	double rx_compressor_gain[VMAX_CHAN];
 	uint8_t synchronized;
 	uint32_t rec_delay;
-	int fd_sta;
 	struct {
 		const char * host;
 		const char * port;
diff --git a/usr.sbin/virtual_oss/virtual_oss/main.c b/usr.sbin/virtual_oss/virtual_oss/main.c
index 9eafd5549a5c..5b50f8e5ef6c 100644
--- a/usr.sbin/virtual_oss/virtual_oss/main.c
+++ b/usr.sbin/virtual_oss/virtual_oss/main.c
@@ -1640,6 +1640,7 @@ struct voss_backend *voss_tx_backend;
 static int voss_dups;
 static int voss_ntds;
 static pthread_t *voss_tds;
+static int voss_fd_sta = -1;
 
 /* XXX I do not like the prefix argument... */
 static struct voss_backend *
@@ -1845,7 +1846,7 @@ init_sndstat(vprofile_t *ptr)
 		warn("Failed to pack nvlist");
 		goto done;
 	}
-	err = ioctl(ptr->fd_sta, SNDSTIOC_ADD_USER_DEVS, &arg);
+	err = ioctl(voss_fd_sta, SNDSTIOC_ADD_USER_DEVS, &arg);
 	free(arg.buf);
 	if (err != 0) {
 		warn("Failed to issue ioctl(SNDSTIOC_ADD_USER_DEVS)");
@@ -1912,7 +1913,6 @@ dup_profile(vprofile_t *pvp, int *pamp, int pol, int rx_mute,
 	memcpy(ptr, pvp, sizeof(*ptr));
 
 	ptr->synchronized = synchronized;
-	ptr->fd_sta = -1;
 	TAILQ_INIT(&ptr->head);
 
 	for (x = 0; x != ptr->channels; x++) {
@@ -1953,12 +1953,13 @@ dup_profile(vprofile_t *pvp, int *pamp, int pol, int rx_mute,
 		ptr->oss_dev = pdev;
 
 		/* register to sndstat */
-		ptr->fd_sta = open("/dev/sndstat", O_WRONLY);
-		if (ptr->fd_sta < 0) {
-			warn("Could not open /dev/sndstat");
-		} else {
-			init_sndstat(ptr);
+		if (voss_fd_sta < 0) {
+			if ((voss_fd_sta = open("/dev/sndstat", O_WRONLY)) < 0) {
+				errstr = "Could not open /dev/sndstat";
+				goto err;
+			}
 		}
+		init_sndstat(ptr);
 	}
 	/* create WAV device */
 	if (ptr->wav_name[0] != 0) {
@@ -2678,6 +2679,7 @@ main(int argc, char **argv)
 	}
 
 	cuse_uninit();
+	close(voss_fd_sta);
 
 	return (0);
 }