#!/bin/mksh # Kernel constant definitions. EV_KEY=1 EV_REL=2 EV_ABS=3 EV_FF=21 BTN_MOUSE=272 ASCII_KEYS="30 48 46 32 18 33 34 35 23 36 37 38 50 49 24 25 16 19 31 20 22 47 17 45 21 44" INPUT_PROP_POINTER=0 INPUT_PROP_DIRECT=1 # Helper functions bitmap_contains() { hexstr="$1" bitnum="$2" char_from_right=$(( bitnum / 4 )) bit_in_char=$(( bitnum % 4 )) chars_per_group=16 group_index=$(( char_from_right / chars_per_group )) char_in_group=$(( char_from_right % chars_per_group )) set -A groups $hexstr n=${#groups[@]} idx=$(( n - 1 - group_index )) if [ "$idx" -lt 0 ] || [ "$idx" -ge "$n" ]; then return 1 fi group=${groups[idx]} while [ ${#group} -lt $chars_per_group ]; do group="0$group" done pos=$(( chars_per_group - 1 - char_in_group )) ch=${group:$pos:1} case "$ch" in 0) v=0 ;; 1) v=1 ;; 2) v=2 ;; 3) v=3 ;; 4) v=4 ;; 5) v=5 ;; 6) v=6 ;; 7) v=7 ;; 8) v=8 ;; 9) v=9 ;; a|A) v=10 ;; b|B) v=11 ;; c|C) v=12 ;; d|D) v=13 ;; e|E) v=14 ;; f|F) v=15 ;; *) return 1 ;; esac if [ $(( (v >> bit_in_char) & 1 )) -eq 1 ]; then return 0 else return 1 fi } ev_contains() { evstr="$1" evbit="$2" evstr=$(print "$evstr" | tr -d ' \t\r\n') val=$(( 16#${evstr} )) if [ $(( (val >> evbit) & 1 )) -eq 1 ]; then return 0 else return 1 fi } export "$@" SYSPATH="/sys/${DEVPATH}" if [[ "$SYSPATH" = */event* ]]; then SYSPATH="$SYSPATH/device" fi EV=$(cat "$SYSPATH/capabilities/ev") KEY=$(cat "$SYSPATH/capabilities/key") ABS=$(cat "$SYSPATH/capabilities/abs") REL=$(cat "$SYSPATH/capabilities/rel") PROPS=$(cat "$SYSPATH/properties") case "$MODE" in ID_INPUT) echo 1 ;; ID_INPUT_MOUSE) if bitmap_contains "$KEY" "$BTN_MOUSE" && ev_contains "$EV" "$EV_REL" ; then echo 1 else exit 1 fi ;; ID_INPUT_KEYBOARD) for i in $ASCII_KEYS; do if ! bitmap_contains "$KEY" "$i"; then exit 1 fi done echo 1 ;; ID_INPUT_TOUCHPAD) if ev_contains "$EV" "$EV_REL" && bitmap_contains "$PROPS" "$INPUT_PROP_POINTER"; then echo 1 else exit 1 fi ;; ID_INPUT_TOUCHSCREEN) if ev_contains "$EV" "$EV_ABS" && bitmap_contains "$PROPS" "$INPUT_PROP_DIRECT"; then echo 1 else exit 1 fi ;; ID_INPUT_JOYSTICK) exit 1 ;; *) exit 1 ;; esac