Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/isaki-audio2]: src/sys/dev/audio Revive multiuser control.



details:   https://anonhg.NetBSD.org/src/rev/483015c988fa
branches:  isaki-audio2
changeset: 998540:483015c988fa
user:      isaki <isaki%NetBSD.org@localhost>
date:      Sun May 05 02:20:36 2019 +0000

description:
Revive multiuser control.

diffstat:

 sys/dev/audio/audio.c    |  44 ++++++++++++++++++++++++++++++++++++++++----
 sys/dev/audio/audiovar.h |   8 +++++++-
 2 files changed, 47 insertions(+), 5 deletions(-)

diffs (109 lines):

diff -r c1d3940fde50 -r 483015c988fa sys/dev/audio/audio.c
--- a/sys/dev/audio/audio.c     Sun May 05 02:01:34 2019 +0000
+++ b/sys/dev/audio/audio.c     Sun May 05 02:20:36 2019 +0000
@@ -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 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 @@
                    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 @@
                                        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 @@
        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)
diff -r c1d3940fde50 -r 483015c988fa sys/dev/audio/audiovar.h
--- a/sys/dev/audio/audiovar.h  Sun May 05 02:01:34 2019 +0000
+++ b/sys/dev/audio/audiovar.h  Sun May 05 02:20:36 2019 +0000
@@ -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 @@
         */
        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;



Home | Main Index | Thread Index | Old Index