wok-6.x rev 12208

acpid: fix broken events handling
author Dominique Corbex <domcox@slitaz.org>
date Fri Mar 30 14:25:23 2012 +0200 (2012-03-30)
parents 9ffc10ecf210
children fa389f5b7eb9
files acpid/receipt acpid/stuff/acpi/acpi_handler.sh acpid/stuff/acpi/button.sh acpid/stuff/acpi/events/ac.conf acpid/stuff/acpi/events/ac_adapter acpid/stuff/acpi/events/battery.conf acpid/stuff/acpi/events/button.conf acpid/stuff/acpi/events/buttons acpid/stuff/acpi/power-supply.sh acpid/stuff/acpi_fakekey.c
line diff
     1.1 --- a/acpid/receipt	Fri Mar 30 00:41:00 2012 +0200
     1.2 +++ b/acpid/receipt	Fri Mar 30 14:25:23 2012 +0200
     1.3 @@ -1,35 +1,21 @@
     1.4  # SliTaz package receipt.
     1.5  
     1.6  PACKAGE="acpid"
     1.7 -VERSION="2.0.12"
     1.8 +VERSION="2.0.14"
     1.9  CATEGORY="system-tools"
    1.10 -SHORT_DESC="The ACPI event daemon"
    1.11 -MAINTAINER="domcox@users.sourceforge.net"
    1.12 +SHORT_DESC="The ACPI event daemon with netlink"
    1.13 +MAINTAINER="domcox@slitaz.org"
    1.14  TARBALL="$PACKAGE-$VERSION.tar.gz"
    1.15  WEB_SITE="http://tedfelix.com/linux/acpid-netlink.html"
    1.16  WGET_URL="http://www.tedfelix.com/linux/$TARBALL"
    1.17  KEY_FILE="key-constants"
    1.18  TAGS="power-management"
    1.19 +SUGGESTED="pm-utils"
    1.20  
    1.21  # Rules to configure and make the package.
    1.22  compile_rules()
    1.23  {
    1.24 -	# Build acpi_fakekey utility
    1.25 -	cp -a $stuff/acpi_fakekey.c .
    1.26 -	gcc -g -Wall -o acpi_fakekey acpi_fakekey.c
    1.27 -	# Generate key constants file
    1.28 -	INPUT_H="/usr/include/linux/input.h"
    1.29 -	echo -n '# Generated from $INPUT dated ' > $KEY_FILE
    1.30 -	date -r $INPUT_H >> $KEY_FILE
    1.31 -   	echo "KEY_RESERVED=0" >> $KEY_FILE
    1.32 -	awk '/define KEY_/{if($3 <= 255 && $3 > 0) print $2"="$3}' $INPUT_H | sort -nt'=' -k2 >> $KEY_FILE
    1.33 -	echo "KEY_LOCK=\$KEY_COFFEE" >> $KEY_FILE
    1.34 -	echo "KEY_LIGHT=\$KEY_F19" >> $KEY_FILE
    1.35 -	echo "KEY_VIDEOOUT=\$KEY_F20" >> $KEY_FILE
    1.36 -	echo "KEY_ROTATESCREEN=\$KEY_F21" >> $KEY_FILE
    1.37 -	echo "KEY_VIDEOMODECYCLE=\$KEY_F22" >> $KEY_FILE
    1.38 -	echo "KEY_PRESENTATION=\KEY_F23" >> $KEY_FILE
    1.39 -	# Build acpid
    1.40 +	# Build
    1.41  	cd $src
    1.42  	make clean && make
    1.43  	make DESTDIR=$DESTDIR install
    1.44 @@ -47,28 +33,26 @@
    1.45  	mkdir -p $fs/etc
    1.46  	cp -a $stuff/init.d $fs/etc/
    1.47  	cp -a $stuff/acpi $fs/etc/
    1.48 -	# acpi_fakekey
    1.49 -	cp -a $src/acpi_fakekey $fs/usr/bin
    1.50 -	cp -a $src/$KEY_FILE $fs/etc/acpi/
    1.51 +	chmod go-rwx $fs/etc/acpi/*.sh
    1.52 +	chmod go-rwx $fs/etc/acpi/events/*
    1.53  }
    1.54  
    1.55 -# Pre and post remove commands for Tazpkg                                                                              
    1.56 +# Pre and post remove commands for Tazpkg
    1.57 +post_install()
    1.58 +{
    1.59 +	local root
    1.60 +	root=$1
    1.61 +	if [ -z "$root" ]; then
    1.62 +		/etc/init.d/acpid start || continue
    1.63 +	fi
    1.64 +	if ! grep -q ^ACPID_OPTIONS $root/etc/daemons.conf; then
    1.65 +		echo '# ACPI daemon options.' >> $root/etc/daemons.conf
    1.66 +		echo 'ACPID_OPTIONS=""' >> $root/etc/daemons.conf
    1.67 +		echo '' >> $root/etc/daemons.conf
    1.68 +	fi
    1.69 +}	
    1.70  
    1.71  pre_remove()
    1.72  {
    1.73  	/etc/init.d/acpid stop
    1.74  }
    1.75 -
    1.76 -post_remove()
    1.77 -{
    1.78 -	if [ `ls /etc/acpi/events | wc -l` -eq 0 ]; then
    1.79 -		echo -n "Removing /etc/acpi/events"
    1.80 -		rm -rf /etc/acpi/events
    1.81 -		status
    1.82 -	fi
    1.83 -	if [ `ls /etc/acpi | wc -l` -eq 0 ]; then
    1.84 -		echo -n "Removing /etc/acpi"
    1.85 -		rm -rf /etc/acpi
    1.86 -		status
    1.87 -	fi
    1.88 -}
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/acpid/stuff/acpi/acpi_handler.sh	Fri Mar 30 14:25:23 2012 +0200
     2.3 @@ -0,0 +1,31 @@
     2.4 +#!/bin/sh
     2.5 +# A script for handling ACPI events.
     2.6 +# See events/*.conf for a configuration file that can be used to
     2.7 +# run this script.
     2.8 +
     2.9 +if [ $# != 1 ]; then
    2.10 +	exit 1
    2.11 +fi
    2.12 +set $*
    2.13 +
    2.14 +case "$1" in
    2.15 +	button/lid)
    2.16 +		[ -e /usr/sbin/pm-suspend ] && /usr/sbin/pm-suspend \
    2.17 +		|| logger "acpid: pm-suspend not found, skipping.." ;;
    2.18 +	ac_adapter)
    2.19 +		case "$2" in
    2.20 +		 AC*|AD*)
    2.21 +			case "$4" in
    2.22 +				00000000) # disconnected
    2.23 +					[ -e /usr/sbin/pm-powersave ] \
    2.24 +					&& /usr/sbin/pm-powersave battery \
    2.25 +					|| logger "acpid: pm-powersave not found, skipping.." ;;
    2.26 +				00000001) # connected
    2.27 +					[ -e /usr/sbin/pm-powersave ] \
    2.28 +					&& /usr/sbin/pm-powersave ac \
    2.29 +					|| logger "acpid: pm-powersave not found, skipping.." ;;
    2.30 +            esac ;;
    2.31 +		esac ;;
    2.32 +	*) 
    2.33 +		logger "acpid: action $1 $2 is not defined" ;;
    2.34 +esac
     3.1 --- a/acpid/stuff/acpi/button.sh	Fri Mar 30 00:41:00 2012 +0200
     3.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.3 @@ -1,39 +0,0 @@
     3.4 -#!/bin/sh
     3.5 -# button.sh - Managing button events for SliTaz
     3.6 -# 
     3.7 -
     3.8 -source /etc/acpi/key-constants
     3.9 -
    3.10 -# logger "button.sh: event=$1"
    3.11 -
    3.12 -# take care about the way events are reported
    3.13 -
    3.14 -EVENT_TYPE=`echo $1 | cut -d/ -f1`
    3.15 -if [ $EVENT_TYPE = $1 ]; then
    3.16 -	EVENT=$2
    3.17 -else
    3.18 -	EVENT=`echo "$1" | cut -d/ -f2`
    3.19 -fi
    3.20 -
    3.21 -case $EVENT in
    3.22 -	power)
    3.23 -		logger "Event: button/power - sending KEY_EXIT($KEY_EXIT)"
    3.24 -		/usr/bin/acpi_fakekey $KEY_EXIT
    3.25 -	;;
    3.26 -	lid)
    3.27 -		if [ -e /usr/bin/suspend ] ; then
    3.28 -			logger "Event: button/lid - suspending"
    3.29 -			/usr/bin/suspend
    3.30 -		else
    3.31 -			logger "Event: button/lid - /usr/bin/suspend not found, skipping.."
    3.32 -		fi
    3.33 -	;;
    3.34 -	sleep)
    3.35 -		if [ -e /usr/bin/hibernate ] ; then
    3.36 -			logger "Event: button/sleep - hibernating"
    3.37 -			/usr/bin/hibernate
    3.38 -		else
    3.39 -			logger "Event: button/sleep - /usr/bin/hibernate not found, skipping.."
    3.40 -		fi
    3.41 -	;;
    3.42 -esac
     4.1 --- a/acpid/stuff/acpi/events/ac.conf	Fri Mar 30 00:41:00 2012 +0200
     4.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.3 @@ -1,6 +0,0 @@
     4.4 -# /etc/acpi/event/ac.conf
     4.5 -# ac power events
     4.6 -
     4.7 -event=ac_adapter
     4.8 -action=/etc/acpi/power-supply.sh
     4.9 -
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/acpid/stuff/acpi/events/ac_adapter	Fri Mar 30 14:25:23 2012 +0200
     5.3 @@ -0,0 +1,5 @@
     5.4 +# /etc/acpi/event/ac.conf
     5.5 +# ac power events
     5.6 +event=ac_adapter .*
     5.7 +action=/etc/acpi/acpi_handler.sh "%e"
     5.8 +
     6.1 --- a/acpid/stuff/acpi/events/battery.conf	Fri Mar 30 00:41:00 2012 +0200
     6.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.3 @@ -1,6 +0,0 @@
     6.4 -# /etc/acpi/event/battery.conf
     6.5 -# Battery events
     6.6 -
     6.7 -event=battery
     6.8 -action=/etc/acpi/power-supply.sh
     6.9 -
     7.1 --- a/acpid/stuff/acpi/events/button.conf	Fri Mar 30 00:41:00 2012 +0200
     7.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.3 @@ -1,6 +0,0 @@
     7.4 -# /etc/acpi/event/button
     7.5 -# lid, sleep or power button events
     7.6 -
     7.7 -event=button
     7.8 -action=/etc/acpi/button.sh %e
     7.9 -
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/acpid/stuff/acpi/events/buttons	Fri Mar 30 14:25:23 2012 +0200
     8.3 @@ -0,0 +1,5 @@
     8.4 +# /etc/acpi/event/button
     8.5 +# lid, sleep or power button events
     8.6 +event=button.*
     8.7 +action=/etc/acpi/acpi_handler.sh "%e"
     8.8 +
     9.1 --- a/acpid/stuff/acpi/power-supply.sh	Fri Mar 30 00:41:00 2012 +0200
     9.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.3 @@ -1,235 +0,0 @@
     9.4 -#!/bin/sh
     9.5 -# /etc/acpi/power-supply.sh - Managing power events for SliTaz
     9.6 -# For Tips & Tricks see http://www.lesswatts.org
     9.7 -
     9.8 -# This script turns off power savings mode on ac or when the 
     9.9 -# battery almost runs out in a attempt to limit data loss in
    9.10 -# a case of power failure.
    9.11 -
    9.12 -ENABLED=1
    9.13 -DISABLED=0
    9.14 -
    9.15 -# AC status (from /sys/class/power_supply/online)
    9.16 -ON_LINE=1
    9.17 -OFF_LINE=0
    9.18 -
    9.19 -# Battery status 
    9.20 -LOW_BAT=0
    9.21 -HIGH_BAT=1
    9.22 -
    9.23 -# Determining the power state.
    9.24 -
    9.25 -ac_status()
    9.26 -{
    9.27 -	POWER_SUPPLY_MAINS=$DISABLED
    9.28 -	AC_STATUS=$OFF_LINE
    9.29 -	for POWER_SUPPLY in /sys/class/power_supply/* ; do
    9.30 -		if [ -f $POWER_SUPPLY/type ] ; then
    9.31 -			if [ "$(cat $POWER_SUPPLY/type)" = "Mains" ] ;then
    9.32 -				echo -n "Determining power state from $POWER_SUPPLY: "
    9.33 -				POWER_SUPPLY_MAINS=$ENABLED
    9.34 -				if [ "$(cat $POWER_SUPPLY/online)" = 1 ] ; then
    9.35 -					AC_STATUS=$ON_LINE
    9.36 -					echo "on-line"
    9.37 -				else
    9.38 -					echo "off-line"
    9.39 -				fi
    9.40 -			fi
    9.41 -		fi
    9.42 -	done
    9.43 -	if [ $POWER_SUPPLY_MAINS -eq $DISABLED ] ; then
    9.44 -		$AC_STATUS=$ON_LINE
    9.45 -	fi
    9.46 -}
    9.47 -
    9.48 -# Determining the battery state.
    9.49 -
    9.50 -battery_status()
    9.51 -{
    9.52 -	BATTERY_STATUS=$LOW_BAT
    9.53 -	for BATT in /sys/class/power_supply/* ; do
    9.54 -		BATT_TYPE=$(cat $BATT/type)
    9.55 -		echo "$BATT is of type $BATT_TYPE."
    9.56 -		if [ "$BATT_TYPE" = "Battery" ] ; then
    9.57 -			echo "  Checking levels for $BATT."
    9.58 -			# Only do if the battery is present
    9.59 -	        if [ $(cat $BATT/present) -eq 1 ] ; then
    9.60 -
    9.61 -				# Get the remaining capacity.
    9.62 -				if [ -f $BATT/charge_now ] ; then
    9.63 -					REMAINING=$(cat $BATT/charge_now)
    9.64 -				elif [ -f $BATT/energy_now ] ; then
    9.65 -					REMAINING=$(cat $BATT/energy_now)
    9.66 -				else
    9.67 -					REMAINING=0
    9.68 -				fi
    9.69 -				if [ -z "$REMAINING" -o "$REMAINING" -eq 0 ] ; then
    9.70 -					echo "  Battery does not report remaining charge. Perhaps it is not present?"
    9.71 -				else
    9.72 -					echo "  Remaining charge: $REMAINING"
    9.73 -
    9.74 -					# Get the alarm level
    9.75 -					ALARM_LEVEL=$(cat $BATT/alarm)
    9.76 -					if [ "$ALARM_LEVEL" -eq 0 ] ; then
    9.77 -
    9.78 -						# Get the full capacity.
    9.79 -
    9.80 -						if [ -f $BATT/charge_full_design ] ; then
    9.81 -							CAPACITY=$(cat $BATT/charge_full_design)
    9.82 -						elif [ -f $BATT/energy_full_design ] ; then
    9.83 -							CAPACITY=$(cat $BATT/energy_full_design)
    9.84 -						else
    9.85 -							CAPACITY=0
    9.86 -						fi
    9.87 -						if [ -z "$CAPACITY" -o "$CAPACITY" -eq 0 ] ; then
    9.88 -							echo "  Battery does not report design full charge, using non-design full charge."
    9.89 -
    9.90 -							if [ -f $BATT/charge_full ] ; then
    9.91 -								CAPACITY=$(cat $BATT/charge_full)
    9.92 -							elif [ -f $BATT/energy_full_design ] ; then
    9.93 -								CAPACITY=$(cat $BATT/energy_full)
    9.94 -							else
    9.95 -								CAPACITY=0
    9.96 -							fi
    9.97 -							if [ -z "$CAPACITY" -o "$CAPACITY" -eq 0] ; then
    9.98 -								echo "  Battery does not report non-design full charge."
    9.99 -							fi
   9.100 -						fi
   9.101 -						echo "  Full capacity: $CAPACITY"
   9.102 -						ALARM_LEVEL=$((CAPACITY*5/100))
   9.103 -					fi
   9.104 -					echo "  Alarm level: $ALARM_LEVEL"
   9.105 -					if [ "$ALARM_LEVEL" -ne 0 ] ; then
   9.106 -						if [ "$REMAINING" -ge "$ALARM_LEVEL" ] ; then
   9.107 -							# this battery does count as having enough charge.
   9.108 -							BATTERY_STATUS=$HIGH_BAT
   9.109 -							echo "  Battery status: high"
   9.110 -						else
   9.111 -							echo "  Battery status: low"
   9.112 -						fi
   9.113 -					fi
   9.114 -				fi
   9.115 -			else
   9.116 -				echo "Battery is not present."
   9.117 -			fi
   9.118 -		fi
   9.119 -	done
   9.120 -}
   9.121 -
   9.122 -online_mode()
   9.123 -{
   9.124 -	# Disable laptop mode
   9.125 -	# When laptop mode is enabled, the kernel will try to be smart
   9.126 -	# about when to do IO, to give the disk and the SATA links as
   9.127 -	# much time as possible in a low power state.
   9.128 -
   9.129 -	if [ -e /proc/sys/vm/laptop_mode ] ; then
   9.130 -		echo "Disabling laptop mode"
   9.131 -		echo 0 > /proc/sys/vm/laptop_mode
   9.132 -	fi
   9.133 -
   9.134 -	# AC97 audio power saving mode
   9.135 -	# The AC97 onboard audio chips support power saving, where the
   9.136 -	# analog parts (codec) are powered down when no program is using
   9.137 -	# the audio device.
   9.138 -
   9.139 -	if [ -e /sys/module/snd_ac97_codec/parameters/power_save ] ; then
   9.140 -		echo "Disabling AC97 audio power saving mode"
   9.141 -		echo 0 > /sys/module/snd_ac97_codec/parameters/power_save
   9.142 -	fi
   9.143 -
   9.144 -	# The VM writeback time
   9.145 -	# The VM subsystem caching allows the kernel to group consecutive
   9.146 -	# writes into one big write, and to generally optimize the disk IO
   9.147 -	# to be the most efficient. 
   9.148 -
   9.149 -	if [ -e /proc/sys/vm/dirty_writeback_centisecs ] ; then
   9.150 -		echo "Writeback time reset to 500ms"
   9.151 -		echo 500 > /proc/sys/vm/dirty_writeback_centisecs
   9.152 -	fi
   9.153 -}
   9.154 -
   9.155 -offline_mode()
   9.156 -{
   9.157 -	# Enable laptop mode
   9.158 -	# When laptop mode is enabled, the kernel will try to be smart
   9.159 -	# about when to do IO, to give the disk and the SATA links as
   9.160 -	# much time as possible in a low power state. 
   9.161 -
   9.162 -	if [ ! -e /proc/sys/vm/laptop_mode ] ; then
   9.163 -		echo "Kernel does not have support for laptop mode." 
   9.164 -	else
   9.165 -		echo "Enabling laptop mode"
   9.166 -		echo 5 > /proc/sys/vm/laptop_mode
   9.167 -	fi
   9.168 -
   9.169 -	# AC97 audio power saving mode
   9.170 -	# The AC97 onboard audio chips support power saving, where the
   9.171 -	# analog parts (codec) are powered down when no program is using
   9.172 -	# the audio device.
   9.173 -
   9.174 -	if [ -e /sys/module/snd_ac97_codec/parameters/power_save ] ; then
   9.175 -		echo "Enabling AC97 audio power saving mode"
   9.176 -		echo 1 > /sys/module/snd_ac97_codec/parameters/power_save
   9.177 -		echo 1 > /dev/dsp
   9.178 -	fi
   9.179 -
   9.180 -	# The VM writeback time
   9.181 -	# The VM subsystem caching allows the kernel to group consecutive
   9.182 -	# writes into one big write, and to generally optimize the disk IO
   9.183 -	# to be the most efficient.
   9.184 -
   9.185 -	if [ -e /proc/sys/vm/dirty_writeback_centisecs ] ; then
   9.186 -		echo "Writeback time set to 1500ms"
   9.187 -		echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
   9.188 -	fi
   9.189 -}
   9.190 -
   9.191 -power_status()
   9.192 -{
   9.193 -	if [ $(cat /proc/sys/vm/dirty_writeback_centisecs) -gt 1000 ]; then
   9.194 -		POWER_SAVINGS=$ENABLED
   9.195 -		echo "power-savings-mode enabled"
   9.196 -	else
   9.197 -		POWER_SAVINGS=$DISABLED
   9.198 -		echo "power-savings-mode disabled"
   9.199 -	fi
   9.200 -}
   9.201 -
   9.202 -custom_scripts()
   9.203 -{
   9.204 -	# Custom scripts in /etc/acpi/ac.d
   9.205 -
   9.206 -	if [ -d /etc/acpi/ac.d ]; then
   9.207 -		for SCRIPT in /etc/acpi/ac.d/*.sh; do
   9.208 -			. $SCRIPT $AC_STATUS $BATTERY_STATUS $0
   9.209 -		done
   9.210 -	fi
   9.211 -
   9.212 -	# Custom scripts in /etc/acpi/battery.d
   9.213 -
   9.214 -	if [ -d /etc/acpi/battery.d ]; then
   9.215 -		for SCRIPT in /etc/acpi/battery.d/*.sh; do
   9.216 -			. $SCRIPT $AC_STATUS $BATTERY_STATUS $0
   9.217 -		done
   9.218 -	fi
   9.219 -}
   9.220 -
   9.221 -ac_status
   9.222 -battery_status
   9.223 -power_status
   9.224 -case "$AC_STATUS+$BATTERY_STATUS" in
   9.225 -	"$OFF_LINE+$HIGH_BAT")
   9.226 -		if [ $POWER_SAVINGS = $DISABLED ]; then 
   9.227 -			logger "Start power savings mode"
   9.228 -			offline_mode
   9.229 -		fi
   9.230 -	;;
   9.231 -	*)
   9.232 -		if [ $POWER_SAVINGS = $ENABLED ]; then
   9.233 -			logger "Stop power savings mode"
   9.234 -			online_mode
   9.235 -		fi
   9.236 -	;;
   9.237 -esac
   9.238 -custom_scripts
   9.239 \ No newline at end of file
    10.1 --- a/acpid/stuff/acpi_fakekey.c	Fri Mar 30 00:41:00 2012 +0200
    10.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.3 @@ -1,64 +0,0 @@
    10.4 -#include <unistd.h>
    10.5 -#include <fcntl.h>
    10.6 -#include <string.h>
    10.7 -#include <stdlib.h>
    10.8 -#include <stdio.h>
    10.9 -#include <linux/input.h>
   10.10 -
   10.11 -#define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))
   10.12 -
   10.13 -int find_keyboard() {
   10.14 -	int i, j;
   10.15 -        int fd;
   10.16 -        char filename[32];
   10.17 -        char key_bitmask[(KEY_MAX + 7) / 8];
   10.18 -
   10.19 -        for (i=0; i<32; i++) {
   10.20 -                snprintf(filename,sizeof(filename), "/dev/input/event%d", i);
   10.21 -
   10.22 -                fd = open(filename, O_RDWR);
   10.23 -                ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask);
   10.24 -
   10.25 -		for (j = 0; j < BTN_MISC; j++) {
   10.26 -			if (TestBit(j, key_bitmask))
   10.27 -				break;
   10.28 -		}
   10.29 -
   10.30 -                if (j < BTN_MISC) {
   10.31 -                        return fd;
   10.32 -                }
   10.33 -		close (fd);
   10.34 -        }
   10.35 -        return 0;
   10.36 -}
   10.37 -
   10.38 -int main(int argc, char** argv) {
   10.39 -	int fd;
   10.40 -	int key;
   10.41 -	struct input_event event;
   10.42 -
   10.43 -	if (argc == 2) {
   10.44 -		key = atoi(argv[1]);
   10.45 -	} else {
   10.46 -		return 1;
   10.47 -	}
   10.48 -
   10.49 -	fd = find_keyboard();
   10.50 -
   10.51 -	if (!fd) {
   10.52 -		return 2;
   10.53 -	}
   10.54 -
   10.55 -	event.type = EV_KEY;
   10.56 -	event.code = key;
   10.57 -	event.value = 1;
   10.58 -	write(fd, &event, sizeof event);
   10.59 -
   10.60 -	event.type = EV_KEY;
   10.61 -	event.code = key;
   10.62 -	event.value = 0;
   10.63 -	write(fd, &event, sizeof event);
   10.64 -	
   10.65 -	return 0;
   10.66 -}
   10.67 -