1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
From d9e02e86cacb6771381c4cde45f6badd71ec01cf Mon Sep 17 00:00:00 2001
From: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
Date: Tue, 13 Sep 2016 15:51:33 +0300
Subject: [PATCH 1/2] fix endian for cross-arch
Signed-off-by: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
---
reader.cpp | 21 +++++++++++++++------
write.cpp | 21 ++++++++++++++++-----
2 files changed, 31 insertions(+), 11 deletions(-)
diff --git a/reader.cpp b/reader.cpp
index ab047bd..651967a 100644
--- a/reader.cpp
+++ b/reader.cpp
@@ -3,9 +3,18 @@
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
+#include <arpa/inet.h>
#include <stdint.h>
#include <unistd.h>
+int64_t htonll(int64_t value){
+ int num = 42;
+ if(*(char *)&num == 42) //test big/little endian
+ return (((int64_t)htonl(value)) << 32) + htonl(value >> 32);
+ else
+ return value;
+}
+
static bool running = true;
bool on = true;
static int fd = 0;
@@ -159,7 +168,7 @@ int read_device(const char *devfile)
// First thing to write is the size of the structures as a 16 bit uint!
uint16_t strsz;
- strsz = sizeof(dev);
+ strsz = htons(sizeof(dev));
if (!cout.write((const char*)&strsz, sizeof(strsz)))
exit(1);
if (cout.eof())
@@ -272,11 +281,11 @@ int read_device(const char *devfile)
}
else if (on) {
input_event_t et;
- et.tv_sec = ev.time.tv_sec;
- et.tv_usec = ev.time.tv_usec;
- et.type = ev.type;
- et.code = ev.code;
- et.value = ev.value;
+ et.tv_sec = htonll(ev.time.tv_sec);
+ et.tv_usec = htonl(ev.time.tv_usec);
+ et.type = htons(ev.type);
+ et.code = htons(ev.code);
+ et.value = htonl(ev.value);
if (!cout.write((const char*)&et, sizeof(et)))
exit(1);
if (cout.eof())
diff --git a/write.cpp b/write.cpp
index 7d58bf6..91c956c 100644
--- a/write.cpp
+++ b/write.cpp
@@ -1,9 +1,18 @@
#include "main.h"
#include <sys/wait.h>
#include <sys/types.h>
+#include <arpa/inet.h>
#include <stdint.h>
#include <unistd.h>
+int64_t ntohll(int64_t value){
+ int num = 42;
+ if(*(char *)&num == 42) //test big/little endian
+ return value;
+ else
+ return (((int64_t)ntohl(value)) << 32) + ntohl(value >> 32);
+}
+
static const char *uinput_file[] = {
"/dev/uinput",
"/dev/input/uinput",
@@ -35,6 +44,7 @@ int spawn_device()
struct input_event ev;
cin.read((char*)&strsz, sizeof(strsz));
+ strsz = ntohs(strsz);
if (strsz != sizeof(uinput_user_dev)) {
cerr << "Device information field sizes do not match. Sorry." << endl;
return 1;
@@ -126,11 +136,12 @@ int spawn_device()
cerr << "End of data" << endl;
break;
}
- ev.time.tv_sec = et.tv_sec;
- ev.time.tv_usec = et.tv_usec;
- ev.type = et.type;
- ev.code = et.code;
- ev.value = et.value;
+ ev.time.tv_sec = ntohll(et.tv_sec);
+ ev.time.tv_usec = ntohl(et.tv_usec);
+ ev.type = ntohs(et.type);
+ ev.code = ntohs(et.code);
+ ev.value = ntohl(et.value);
+ //cErr << "EV " << ev.time.tv_sec << "." << ev.time.tv_usec << ": type " << ev.type << ", code " << ev.code << ", value " << ev.value << endl;
if (hotkey_hook(ev.type, ev.code, ev.value))
continue;
if (write(fd, &ev, sizeof(ev)) < (ssize_t)sizeof(ev)) {
--
1.7.10.4
|