[PATCH 1/3] import acpi-fakekey tool

Colin Ian King colin.king at canonical.com
Fri Jul 11 09:49:22 UTC 2014


On 11/07/14 09:20, Keng-Yu Lin wrote:
> This tool is imported from acpi-support v0.141.
> The tool can find the correct input event node of
> the keyboard and send a keycode to it. The keycode
> value is specified as an parameter of the command.
> 
> Signed-off-by: Keng-Yu Lin <kengyu at canonical.com>
> ---
>  debian/copyright             |  8 +++++
>  debian/fwts.install          |  1 +
>  debian/rules                 |  3 ++
>  src/Makefile.am              |  3 +-
>  src/utilities/Makefile.am    |  4 ++-
>  src/utilities/acpi_fakekey.c | 77 ++++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 94 insertions(+), 2 deletions(-)
>  create mode 100644 src/utilities/acpi_fakekey.c
> 
> diff --git a/debian/copyright b/debian/copyright
> index eaefaee..a3f1a9c 100644
> --- a/debian/copyright
> +++ b/debian/copyright
> @@ -153,3 +153,11 @@ License: other
>     United States government or any agency thereof requires an export license,
>     other governmental approval, or letter of assurance, without first obtaining
>     such license, approval or letter.
> +
> +Files: src/utilities/acpi_fakekey.c
> +Copyright: 2004-2014, Canonical Ltd
> +           2004, Matthew Garrett <mjg59 at srcf.ucam.org>
> +           2004-2014, Thom May <thom at canonical.com>
> +License: GPL-2
> + On Debian systems, the complete text of the GNU General Public
> + License can be found in `/usr/share/common-licenses/GPL-2'.
> diff --git a/debian/fwts.install b/debian/fwts.install
> index 2630f4e..8400417 100644
> --- a/debian/fwts.install
> +++ b/debian/fwts.install
> @@ -4,3 +4,4 @@ usr/bin/fwts usr/bin
>  usr/share/man/man1/fwts.1 usr/share/man/man1
>  scripts/fwts-collect usr/bin
>  usr/share/man/man1/fwts-collect.1 usr/share/man/man1
> +usr/lib/fwts/acpi_fakekey usr/lib/fwts
> diff --git a/debian/rules b/debian/rules
> index 0887c38..5011334 100755
> --- a/debian/rules
> +++ b/debian/rules
> @@ -21,6 +21,9 @@ override_dh_auto_install:
>  override_dh_dkms:
>  	dh_dkms -V $(VERSION)
>  
> +override_dh_auto_configure:
> +	dh_auto_configure -- --libexecdir=/usr/lib/fwts
> +
>  override_dh_auto_test:
>  ifneq ($(DEB_BUILD_ARCH),arm64)
>  	dh_auto_test $@
> diff --git a/src/Makefile.am b/src/Makefile.am
> index ace23d6..eff1e31 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -11,7 +11,8 @@ AM_CPPFLAGS = \
>  	-I$(top_srcdir)/src/acpica/source/include \
>  	-I$(top_srcdir)/src/acpica/source/compiler \
>  	-I$(top_srcdir)/efi_runtime \
> -	-Wall -Werror -Wextra
> +	-Wall -Werror -Wextra \
> +	-DLIBEXECDIR='"$(libexecdir)"'
>  
>  bin_PROGRAMS = fwts
>  
> diff --git a/src/utilities/Makefile.am b/src/utilities/Makefile.am
> index 01b534a..ecededa 100644
> --- a/src/utilities/Makefile.am
> +++ b/src/utilities/Makefile.am
> @@ -1,6 +1,8 @@
>  AM_CPPFLAGS = -Wall -Werror -Wextra -DDATAROOTDIR=\"$(datarootdir)\"
>  
>  bin_PROGRAMS = kernelscan
> +libexec_PROGRAMS = acpi_fakekey
>  kernelscan_SOURCES = kernelscan.c
>  kernelscan_LDFLAGS = -lpcre
> -
> +acpi_fakekey_SOURCES = acpi_fakekey.c
> +acpi_fakekey_CFLAGS = -w
> diff --git a/src/utilities/acpi_fakekey.c b/src/utilities/acpi_fakekey.c
> new file mode 100644
> index 0000000..a2f3f85
> --- /dev/null
> +++ b/src/utilities/acpi_fakekey.c
> @@ -0,0 +1,77 @@
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <linux/input.h>
> +
> +#define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))
> +
> +int find_keyboard() {
> +	int i, j;
> +        int fd;
> +        char filename[32];
> +        char key_bitmask[(KEY_MAX + 7) / 8];
> +
> +        for (i=0; i<32; i++) {
> +                snprintf(filename,sizeof(filename), "/dev/input/event%d", i);
> +
> +                fd = open(filename, O_RDWR);
> +		if (fd < 0) {
> +			perror("open");
> +			exit(EXIT_FAILURE);
> +		}
> +
> +                ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask);
> +
> +		/* We assume that anything that has an alphabetic key in the
> +		   QWERTYUIOP range in it is the main keyboard. */
> +		for (j = KEY_Q; j <= KEY_P; j++) {
> +			if (TestBit(j, key_bitmask))
> +				return fd;
> +		}
> +
> +                close (fd);
> +        }
> +        return 0;
> +}
> +
> +int main(int argc, char** argv) {
> +	int fd;
> +	int key;
> +	struct input_event event;
> +
> +	if (argc == 2) {
> +		key = atoi(argv[1]);
> +	} else {
> +		return 1;
> +	}
> +
> +	fd = find_keyboard();
> +
> +	if (!fd) {
> +		return 2;
> +	}
> +	event.type = EV_SYN;
> +	event.code = SYN_REPORT;
> +	event.value = 0;
> +	write(fd, &event, sizeof event);
> +
> +	event.type = EV_KEY;
> +	event.code = key;
> +	event.value = 1;
> +	write(fd, &event, sizeof event);
> +
> +	event.type = EV_KEY;
> +	event.code = key;
> +	event.value = 0;
> +	write(fd, &event, sizeof event);
> +
> +	event.type = EV_SYN;
> +	event.code = SYN_REPORT;
> +	event.value = 0;
> +	write(fd, &event, sizeof event);
> +
> +	return 0;
> +}
> +
> 

Rather than just pulling in this code as an external binrary and then
exec'ing it, why not put the functionality into libfwts and remove the
need to exec this small program.  I'm keen to remove the need to exec
anything unless absolutely necessary.

Colin



More information about the fwts-devel mailing list