aboutsummaryrefslogtreecommitdiffstats
path: root/meta-rcar-gen3-adas/recipes-support/netevent/netevent/0001-fix-endian-for-cross-arch.patch
blob: e984447ebf35a11ac03506d6758e6f005d2fb728 (plain)
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