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;