summaryrefslogtreecommitdiffstats
path: root/perl-install/c
diff options
context:
space:
mode:
authorArnaud Patard <rtp@mageia.org>2011-03-18 21:28:23 +0000
committerArnaud Patard <rtp@mageia.org>2011-03-18 21:28:23 +0000
commiteea2f8ef9ddf7e461702d8fda0b8e98e623694c2 (patch)
treec2730cd4433035feeddb3c00a6cfd5cf9e282c93 /perl-install/c
parent071f701fb4148c83c8c9c0f121150468fa5a064b (diff)
downloaddrakx-eea2f8ef9ddf7e461702d8fda0b8e98e623694c2.tar
drakx-eea2f8ef9ddf7e461702d8fda0b8e98e623694c2.tar.gz
drakx-eea2f8ef9ddf7e461702d8fda0b8e98e623694c2.tar.bz2
drakx-eea2f8ef9ddf7e461702d8fda0b8e98e623694c2.tar.xz
drakx-eea2f8ef9ddf7e461702d8fda0b8e98e623694c2.zip
- use EVIOCGBIT ioctl instead of trying to parse key field from
/proc/bus/input/devices to avoid issues on 64bit kernel with 32bit userspace
Diffstat (limited to 'perl-install/c')
-rwxr-xr-xperl-install/c/stuff.xs.pl34
1 files changed, 34 insertions, 0 deletions
diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl
index cd2c6bf03..b2c4c2512 100755
--- a/perl-install/c/stuff.xs.pl
+++ b/perl-install/c/stuff.xs.pl
@@ -36,6 +36,7 @@ print '
#include <net/route.h>
#include <netinet/in.h>
#include <linux/sockios.h>
+#include <linux/input.h>
// for ethtool structs:
typedef unsigned long long u64;
@@ -485,7 +486,40 @@ strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
}
}
+#define BITS_PER_LONG (sizeof(long) * 8)
+#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
+#define OFF(x) ((x)%BITS_PER_LONG)
+#define BIT(x) (1UL<<OFF(x))
+#define LONG(x) ((x)/BITS_PER_LONG)
+#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)
+void
+EVIocGBitKey (char *file)
+ PPCODE:
+ int fd;
+ int i;
+ long bitmask[NBITS(KEY_MAX)];
+
+ fd = open (file, O_RDONLY);
+ if (fd < 0) {
+ perror("Cannot open /dev/input/eventX");
+ return;
+ }
+
+ if (ioctl (fd, EVIOCGBIT(EV_KEY, sizeof (bitmask)), bitmask) < 0) {
+ perror ("ioctl EVIOCGBIT failed");
+ close (fd);
+ return;
+ }
+
+ for (i = NBITS(KEY_MAX) - 1; i > 0; i--)
+ if (bitmask[i])
+ break;
+
+ for (; i >= 0; i--) {
+ EXTEND(sp, 1);
+ PUSHs(sv_2mortal(newSViv(bitmask[i])));
+ }
char *
kernel_version()