xref: /netbsd-src/share/examples/devpubd/hooks/99-ugen-perms-tigard (revision 4e13543e2b57c2673c3a2f9cf3e103f2f9e69f67)
1#!/bin/sh -
2#
3# $NetBSD: 99-ugen-perms-tigard,v 1.1 2024/03/30 06:42:10 thorpej Exp $
4#
5# Look for a Tigard (https://github.com/tigard-tools/tigard) debug
6# board and change the permissions to 0660.
7#
8# Written by Jason R. Thorpe, March 2024.  Public domain.
9#
10
11export LC_ALL=C
12
13event="$1"
14shift
15devices=$@
16
17orig_perms=0600
18new_perms=0660
19
20orig_group=wheel
21new_group=wheel
22
23device_name=tigard
24
25is_target_device()
26{
27	local vendor_string
28	local product_string
29
30	vendor_string="$(drvctl -p $1 vendor-string)"
31	product_string="$(drvctl -p $1 product-string)"
32
33	if [ x"$vendor_string" = x"SecuringHardware.com" -a \
34	     x"$product_string" = x"Tigard V1.1" ]; then
35		echo "yes"
36		return
37	fi
38
39	echo "no"
40}
41
42set_permissions()
43{
44	if [ x$(is_target_device $1) = xyes ]; then
45		chgrp $new_group /dev/"${2}".*
46		chmod $new_perms /dev/"${2}".*
47		#
48		# We need to create a symlink here to remember
49		# the ugen device node that was used, since we
50		# can't recover it from the device name that
51		# comes from the kernel later because we get the
52		# event *after* the device is gone, and thus
53		# cannot query any properties.
54		#
55		rm -f /dev/${1}-${device_name}
56		ln -sf ${2} /dev/${1}-${device_name}
57	fi
58}
59
60restore_permissions()
61{
62	if [ -h "/dev/${1}-${device_name}" ]; then
63		devnode=$(readlink "/dev/${1}-${device_name}")
64		if [ x"$devnode" != x ]; then
65			chmod $orig_perms /dev/"${devnode}".*
66			chgrp $orig_group /dev/"${devnode}".*
67		fi
68		rm -f "/dev/${1}-${device_name}"
69	fi
70}
71
72get_ugen_devnode()
73{
74	# Because "ugen" and "ugenif" share the same /dev/ugenN.*
75	# namespace, we have to query an additional property to
76	# determine which one it is.
77	local ugen_unit
78
79	ugen_unit=$(drvctl -p $1 ugen-unit)
80	case "$ugen_unit" in
81	[0-9]*)
82		echo "ugen$ugen_unit"
83		;;
84	esac
85}
86
87for device in $devices; do
88	case $device in
89	ugensa*)
90		# Ignore ugensa(4).
91		;;
92	ugen*)
93		case $event in
94		device-attach)
95			devnode=$(get_ugen_devnode $1)
96			if [ x"$devnode" != x ]; then
97				set_permissions $device $devnode
98			fi
99			;;
100		device-detach)
101			restore_permissions $device
102			;;
103		esac
104	esac
105done
106