Module Name:    src
Committed By:   isaki
Date:           Sun May  5 02:20:36 UTC 2019

Modified Files:
        src/sys/dev/audio [isaki-audio2]: audio.c audiovar.h

Log Message:
Revive multiuser control.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.8 -r1.1.2.9 src/sys/dev/audio/audio.c
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/dev/audio/audiovar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/audio/audio.c
diff -u src/sys/dev/audio/audio.c:1.1.2.8 src/sys/dev/audio/audio.c:1.1.2.9
--- src/sys/dev/audio/audio.c:1.1.2.8	Sat May  4 07:41:50 2019
+++ src/sys/dev/audio/audio.c	Sun May  5 02:20:36 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: audio.c,v 1.1.2.8 2019/05/04 07:41:50 isaki Exp $	*/
+/*	$NetBSD: audio.c,v 1.1.2.9 2019/05/05 02:20:36 isaki Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -149,7 +149,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.1.2.8 2019/05/04 07:41:50 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.1.2.9 2019/05/05 02:20:36 isaki Exp $");
 
 #ifdef _KERNEL_OPT
 #include "audio.h"
@@ -577,6 +577,7 @@ static int audio_mixers_set_format(struc
 static void audio_mixers_get_format(struct audio_softc *, struct audio_info *);
 static int audio_sysctl_volume(SYSCTLFN_PROTO);
 static int audio_sysctl_blk_ms(SYSCTLFN_PROTO);
+static int audio_sysctl_multiuser(SYSCTLFN_PROTO);
 #if defined(AUDIO_DEBUG)
 static int audio_sysctl_debug(SYSCTLFN_PROTO);
 #endif
@@ -993,6 +994,13 @@ audioattach(device_t parent, device_t se
 		    audio_sysctl_blk_ms, 0, (void *)sc, 0,
 		    CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
 
+		sysctl_createv(&sc->sc_log, 0, NULL, NULL,
+		    CTLFLAG_READWRITE,
+		    CTLTYPE_BOOL, "multiuser",
+		    SYSCTL_DESCR("allow multiple user access"),
+		    audio_sysctl_multiuser, 0, (void *)sc, 0,
+		    CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
+
 #if defined(AUDIO_DEBUG)
 		sysctl_createv(&sc->sc_log, 0, NULL, NULL,
 		    CTLFLAG_READWRITE,
@@ -2070,9 +2078,9 @@ audio_open(dev_t dev, struct audio_softc
 					goto bad3;
 			}
 		}
-	} else /* if (sc->sc_multiuser == false) XXX not yet */ {
+	} else if (sc->sc_multiuser == false) {
 		uid_t euid = kauth_cred_geteuid(kauth_cred_get());
-		if (euid != 0 && kauth_cred_geteuid(sc->sc_cred) != euid) {
+		if (euid != 0 && euid != kauth_cred_geteuid(sc->sc_cred)) {
 			error = EPERM;
 			goto bad2;
 		}
@@ -7480,6 +7488,34 @@ abort:
 	return error;
 }
 
+/*
+ * Get or set multiuser mode.
+ */
+static int
+audio_sysctl_multiuser(SYSCTLFN_ARGS)
+{
+	struct sysctlnode node;
+	struct audio_softc *sc;
+	int t, error;
+
+	node = *rnode;
+	sc = node.sysctl_data;
+
+	mutex_enter(sc->sc_lock);
+
+	t = sc->sc_multiuser;
+	node.sysctl_data = &t;
+	error = sysctl_lookup(SYSCTLFN_CALL(&node));
+	if (error || newp == NULL)
+		goto abort;
+
+	sc->sc_multiuser = t;
+	error = 0;
+abort:
+	mutex_exit(sc->sc_lock);
+	return error;
+}
+
 #if defined(AUDIO_DEBUG)
 /*
  * Get or set debug verbose level. (0..4)

Index: src/sys/dev/audio/audiovar.h
diff -u src/sys/dev/audio/audiovar.h:1.1.2.2 src/sys/dev/audio/audiovar.h:1.1.2.3
--- src/sys/dev/audio/audiovar.h:1.1.2.2	Sat May  4 07:20:09 2019
+++ src/sys/dev/audio/audiovar.h	Sun May  5 02:20:36 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: audiovar.h,v 1.1.2.2 2019/05/04 07:20:09 isaki Exp $	*/
+/*	$NetBSD: audiovar.h,v 1.1.2.3 2019/05/05 02:20:36 isaki Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -221,6 +221,12 @@ struct audio_softc {
 	 */
 	bool		sc_dying;
 
+	/*
+	 * If multiuser is false, other users who have different euid
+	 * than the first user cannot open this device.
+	 * Must be protected by sc_lock.
+	 */
+	bool sc_multiuser;
 	kauth_cred_t sc_cred;
 
 	struct sysctllog *sc_log;

Reply via email to