[PATCH 1/3] import acpi-fakekey tool

Keng-Yu Lin keng-yu.lin at canonical.com
Mon Jul 14 05:09:43 UTC 2014


@Colin,
  I have no preference on either way. I am happy to work on another
patch to make the code in libfwts.

On Fri, Jul 11, 2014 at 5:49 PM, Colin Ian King
<colin.king at canonical.com> wrote:
> 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
>
> --
> fwts-devel mailing list
> fwts-devel at lists.ubuntu.com
> Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/fwts-devel



More information about the fwts-devel mailing list