Merge lp:~oif-team/evemu/trunk.prop into lp:evemu
- trunk.prop
- Merge into trunk
Proposed by
Henrik Rydberg
Status: | Merged |
---|---|
Merged at revision: | 11 |
Proposed branch: | lp:~oif-team/evemu/trunk.prop |
Merge into: | lp:evemu |
Diff against target: |
450 lines (+199/-66) 6 files modified
include/evemu.h (+15/-20) src/evemu-impl.h (+20/-0) src/evemu.c (+112/-11) tools/evemu-describe.c (+12/-7) tools/evemu-device.c (+28/-20) tools/evemu-echo.c (+12/-8) |
To merge this branch: | bzr merge lp:~oif-team/evemu/trunk.prop |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Chase Douglas (community) | Approve | ||
Review via email: mp+44372@code.launchpad.net |
Commit message
Description of the change
Support the upcoming device properties.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'include/evemu.h' | |||
2 | --- include/evemu.h 2010-09-18 17:10:11 +0000 | |||
3 | +++ include/evemu.h 2010-12-21 17:21:49 +0000 | |||
4 | @@ -26,28 +26,23 @@ | |||
5 | 26 | * | 26 | * |
6 | 27 | ****************************************************************************/ | 27 | ****************************************************************************/ |
7 | 28 | 28 | ||
10 | 29 | #ifndef _EVPLAY_H | 29 | #ifndef _EVEMU_H |
11 | 30 | #define _EVPLAY_H | 30 | #define _EVEMU_H |
12 | 31 | 31 | ||
13 | 32 | #include <linux/uinput.h> | ||
14 | 33 | #include <stdio.h> | 32 | #include <stdio.h> |
32 | 34 | 33 | #include <errno.h> | |
33 | 35 | #define EVPLAY_NBITS KEY_CNT | 34 | #include <linux/input.h> |
34 | 36 | #define EVPLAY_NBYTES ((EVPLAY_NBITS + 7) / 8) | 35 | |
35 | 37 | 36 | #define EVEMU_VERSION_MAJOR 1 | |
36 | 38 | struct evemu_device { | 37 | #define EVEMU_VERSION_MINOR 1 |
37 | 39 | char name[UINPUT_MAX_NAME_SIZE]; | 38 | |
38 | 40 | struct input_id id; | 39 | struct evemu_device *evemu_new(const char *name); |
39 | 41 | unsigned char mask[EV_CNT][EVPLAY_NBYTES]; | 40 | void evemu_delete(struct evemu_device *dev); |
40 | 42 | int bytes[EV_CNT]; | 41 | |
41 | 43 | struct input_absinfo abs[ABS_CNT]; | 42 | const char *evemu_get_name(const struct evemu_device *dev); |
42 | 44 | }; | 43 | |
43 | 45 | 44 | int evemu_has_prop(const struct evemu_device *dev, int code); | |
44 | 46 | static inline int evemu_has(const struct evemu_device *dev, | 45 | int evemu_has_event(const struct evemu_device *dev, int type, int code); |
28 | 47 | int type, int code) | ||
29 | 48 | { | ||
30 | 49 | return (dev->mask[type][code >> 3] >> (code & 7)) & 1; | ||
31 | 50 | } | ||
45 | 51 | 46 | ||
46 | 52 | int evemu_extract(struct evemu_device *dev, int fd); | 47 | int evemu_extract(struct evemu_device *dev, int fd); |
47 | 53 | int evemu_write(const struct evemu_device *dev, FILE *fp); | 48 | int evemu_write(const struct evemu_device *dev, FILE *fp); |
48 | 54 | 49 | ||
49 | === added file 'src/evemu-impl.h' | |||
50 | --- src/evemu-impl.h 1970-01-01 00:00:00 +0000 | |||
51 | +++ src/evemu-impl.h 2010-12-21 17:21:49 +0000 | |||
52 | @@ -0,0 +1,20 @@ | |||
53 | 1 | #ifndef _EVEMU_IMPL_H | ||
54 | 2 | #define _EVEMU_IMPL_H | ||
55 | 3 | |||
56 | 4 | #include <evemu.h> | ||
57 | 5 | #include <linux/uinput.h> | ||
58 | 6 | |||
59 | 7 | #define EVPLAY_NBITS KEY_CNT | ||
60 | 8 | #define EVPLAY_NBYTES ((EVPLAY_NBITS + 7) / 8) | ||
61 | 9 | |||
62 | 10 | struct evemu_device { | ||
63 | 11 | int version_major, version_minor; | ||
64 | 12 | char name[UINPUT_MAX_NAME_SIZE]; | ||
65 | 13 | struct input_id id; | ||
66 | 14 | unsigned char prop[EVPLAY_NBYTES]; | ||
67 | 15 | unsigned char mask[EV_CNT][EVPLAY_NBYTES]; | ||
68 | 16 | int pbytes, mbytes[EV_CNT]; | ||
69 | 17 | struct input_absinfo abs[ABS_CNT]; | ||
70 | 18 | }; | ||
71 | 19 | |||
72 | 20 | #endif | ||
73 | 0 | 21 | ||
74 | === modified file 'src/evemu.c' | |||
75 | --- src/evemu.c 2010-09-19 07:54:48 +0000 | |||
76 | +++ src/evemu.c 2010-12-21 17:21:49 +0000 | |||
77 | @@ -26,13 +26,25 @@ | |||
78 | 26 | * | 26 | * |
79 | 27 | ****************************************************************************/ | 27 | ****************************************************************************/ |
80 | 28 | 28 | ||
82 | 29 | #include "evemu.h" | 29 | #include "evemu-impl.h" |
83 | 30 | #include <stdlib.h> | ||
84 | 30 | #include <string.h> | 31 | #include <string.h> |
85 | 31 | #include <stdio.h> | 32 | #include <stdio.h> |
86 | 32 | #include <fcntl.h> | 33 | #include <fcntl.h> |
87 | 33 | #include <errno.h> | 34 | #include <errno.h> |
88 | 34 | #include <poll.h> | 35 | #include <poll.h> |
89 | 35 | 36 | ||
90 | 37 | #ifndef UI_SET_PROPBIT | ||
91 | 38 | #define UI_SET_PROPBIT _IOW(UINPUT_IOCTL_BASE, 110, int) | ||
92 | 39 | #define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len) | ||
93 | 40 | #define INPUT_PROP_POINTER 0x00 | ||
94 | 41 | #define INPUT_PROP_DIRECT 0x01 | ||
95 | 42 | #define INPUT_PROP_BUTTONPAD 0x02 | ||
96 | 43 | #define INPUT_PROP_SEMI_MT 0x03 | ||
97 | 44 | #define INPUT_PROP_MAX 0x1f | ||
98 | 45 | #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) | ||
99 | 46 | #endif | ||
100 | 47 | |||
101 | 36 | #define SYSCALL(call) while (((call) == -1) && (errno == EINTR)) | 48 | #define SYSCALL(call) while (((call) == -1) && (errno == EINTR)) |
102 | 37 | 49 | ||
103 | 38 | static void copy_bits(unsigned char *mask, const unsigned long *bits, int bytes) | 50 | static void copy_bits(unsigned char *mask, const unsigned long *bits, int bytes) |
104 | @@ -44,6 +56,39 @@ | |||
105 | 44 | } | 56 | } |
106 | 45 | } | 57 | } |
107 | 46 | 58 | ||
108 | 59 | struct evemu_device *evemu_new(const char *name) | ||
109 | 60 | { | ||
110 | 61 | struct evemu_device *dev = calloc(1, sizeof(struct evemu_device)); | ||
111 | 62 | |||
112 | 63 | dev->version_major = EVEMU_VERSION_MAJOR; | ||
113 | 64 | dev->version_minor = EVEMU_VERSION_MINOR; | ||
114 | 65 | |||
115 | 66 | if (name && strlen(name) < sizeof(dev->name)) | ||
116 | 67 | strcpy(dev->name, name); | ||
117 | 68 | |||
118 | 69 | return dev; | ||
119 | 70 | } | ||
120 | 71 | |||
121 | 72 | void evemu_delete(struct evemu_device *dev) | ||
122 | 73 | { | ||
123 | 74 | free(dev); | ||
124 | 75 | } | ||
125 | 76 | |||
126 | 77 | const char *evemu_get_name(const struct evemu_device *dev) | ||
127 | 78 | { | ||
128 | 79 | return dev->name; | ||
129 | 80 | } | ||
130 | 81 | |||
131 | 82 | int evemu_has_prop(const struct evemu_device *dev, int code) | ||
132 | 83 | { | ||
133 | 84 | return (dev->prop[code >> 3] >> (code & 7)) & 1; | ||
134 | 85 | } | ||
135 | 86 | |||
136 | 87 | int evemu_has_event(const struct evemu_device *dev, int type, int code) | ||
137 | 88 | { | ||
138 | 89 | return (dev->mask[type][code >> 3] >> (code & 7)) & 1; | ||
139 | 90 | } | ||
140 | 91 | |||
141 | 47 | int evemu_extract(struct evemu_device *dev, int fd) | 92 | int evemu_extract(struct evemu_device *dev, int fd) |
142 | 48 | { | 93 | { |
143 | 49 | unsigned long bits[64]; | 94 | unsigned long bits[64]; |
144 | @@ -62,16 +107,22 @@ | |||
145 | 62 | if (rc < 0) | 107 | if (rc < 0) |
146 | 63 | return rc; | 108 | return rc; |
147 | 64 | 109 | ||
148 | 110 | SYSCALL(rc = ioctl(fd, EVIOCGPROP(sizeof(bits)), bits)); | ||
149 | 111 | if (rc >= 0) { | ||
150 | 112 | copy_bits(dev->prop, bits, rc); | ||
151 | 113 | dev->pbytes = rc; | ||
152 | 114 | } | ||
153 | 115 | |||
154 | 65 | for (i = 0; i < EV_CNT; i++) { | 116 | for (i = 0; i < EV_CNT; i++) { |
155 | 66 | SYSCALL(rc = ioctl(fd, EVIOCGBIT(i, sizeof(bits)), bits)); | 117 | SYSCALL(rc = ioctl(fd, EVIOCGBIT(i, sizeof(bits)), bits)); |
156 | 67 | if (rc < 0) | 118 | if (rc < 0) |
157 | 68 | continue; | 119 | continue; |
158 | 69 | copy_bits(dev->mask[i], bits, rc); | 120 | copy_bits(dev->mask[i], bits, rc); |
160 | 70 | dev->bytes[i] = rc; | 121 | dev->mbytes[i] = rc; |
161 | 71 | } | 122 | } |
162 | 72 | 123 | ||
163 | 73 | for (i = 0; i < ABS_CNT; i++) { | 124 | for (i = 0; i < ABS_CNT; i++) { |
165 | 74 | if (!evemu_has(dev, EV_ABS, i)) | 125 | if (!evemu_has_event(dev, EV_ABS, i)) |
166 | 75 | continue; | 126 | continue; |
167 | 76 | SYSCALL(rc = ioctl(fd, EVIOCGABS(i), &dev->abs[i])); | 127 | SYSCALL(rc = ioctl(fd, EVIOCGABS(i), &dev->abs[i])); |
168 | 77 | if (rc < 0) | 128 | if (rc < 0) |
169 | @@ -81,6 +132,15 @@ | |||
170 | 81 | return 0; | 132 | return 0; |
171 | 82 | } | 133 | } |
172 | 83 | 134 | ||
173 | 135 | static void write_prop(FILE * fp, const unsigned char *mask, int bytes) | ||
174 | 136 | { | ||
175 | 137 | int i; | ||
176 | 138 | for (i = 0; i < bytes; i += 8) | ||
177 | 139 | fprintf(fp, "P: %02x %02x %02x %02x %02x %02x %02x %02x\n", | ||
178 | 140 | mask[i], mask[i + 1], mask[i + 2], mask[i + 3], | ||
179 | 141 | mask[i + 4], mask[i + 5], mask[i + 6], mask[i + 7]); | ||
180 | 142 | } | ||
181 | 143 | |||
182 | 84 | static void write_mask(FILE * fp, int index, | 144 | static void write_mask(FILE * fp, int index, |
183 | 85 | const unsigned char *mask, int bytes) | 145 | const unsigned char *mask, int bytes) |
184 | 86 | { | 146 | { |
185 | @@ -107,14 +167,28 @@ | |||
186 | 107 | dev->id.bustype, dev->id.vendor, | 167 | dev->id.bustype, dev->id.vendor, |
187 | 108 | dev->id.product, dev->id.version); | 168 | dev->id.product, dev->id.version); |
188 | 109 | 169 | ||
189 | 170 | write_prop(fp, dev->prop, dev->pbytes); | ||
190 | 171 | |||
191 | 110 | for (i = 0; i < EV_CNT; i++) | 172 | for (i = 0; i < EV_CNT; i++) |
193 | 111 | write_mask(fp, i, dev->mask[i], dev->bytes[i]); | 173 | write_mask(fp, i, dev->mask[i], dev->mbytes[i]); |
194 | 112 | 174 | ||
195 | 113 | for (i = 0; i < ABS_CNT; i++) | 175 | for (i = 0; i < ABS_CNT; i++) |
197 | 114 | if (evemu_has(dev, EV_ABS, i)) | 176 | if (evemu_has_event(dev, EV_ABS, i)) |
198 | 115 | write_abs(fp, i, &dev->abs[i]); | 177 | write_abs(fp, i, &dev->abs[i]); |
199 | 116 | } | 178 | } |
200 | 117 | 179 | ||
201 | 180 | static void read_prop(struct evemu_device *dev, FILE *fp) | ||
202 | 181 | { | ||
203 | 182 | unsigned int mask[8]; | ||
204 | 183 | int i; | ||
205 | 184 | while (fscanf(fp, "P: %02x %02x %02x %02x %02x %02x %02x %02x\n", | ||
206 | 185 | mask + 0, mask + 1, mask + 2, mask + 3, | ||
207 | 186 | mask + 4, mask + 5, mask + 6, mask + 7) > 0) { | ||
208 | 187 | for (i = 0; i < 8; i++) | ||
209 | 188 | dev->prop[dev->pbytes++] = mask[i]; | ||
210 | 189 | } | ||
211 | 190 | } | ||
212 | 191 | |||
213 | 118 | static void read_mask(struct evemu_device *dev, FILE *fp) | 192 | static void read_mask(struct evemu_device *dev, FILE *fp) |
214 | 119 | { | 193 | { |
215 | 120 | unsigned int mask[8]; | 194 | unsigned int mask[8]; |
216 | @@ -123,7 +197,7 @@ | |||
217 | 123 | &index, mask + 0, mask + 1, mask + 2, mask + 3, | 197 | &index, mask + 0, mask + 1, mask + 2, mask + 3, |
218 | 124 | mask + 4, mask + 5, mask + 6, mask + 7) > 0) { | 198 | mask + 4, mask + 5, mask + 6, mask + 7) > 0) { |
219 | 125 | for (i = 0; i < 8; i++) | 199 | for (i = 0; i < 8; i++) |
221 | 126 | dev->mask[index][dev->bytes[index]++] = mask[i]; | 200 | dev->mask[index][dev->mbytes[index]++] = mask[i]; |
222 | 127 | } | 201 | } |
223 | 128 | } | 202 | } |
224 | 129 | 203 | ||
225 | @@ -157,6 +231,8 @@ | |||
226 | 157 | dev->id.product = product; | 231 | dev->id.product = product; |
227 | 158 | dev->id.version = version; | 232 | dev->id.version = version; |
228 | 159 | 233 | ||
229 | 234 | read_prop(dev, fp); | ||
230 | 235 | |||
231 | 160 | read_mask(dev, fp); | 236 | read_mask(dev, fp); |
232 | 161 | 237 | ||
233 | 162 | read_abs(dev, fp); | 238 | read_abs(dev, fp); |
234 | @@ -225,7 +301,14 @@ | |||
235 | 225 | return 0; | 301 | return 0; |
236 | 226 | } | 302 | } |
237 | 227 | 303 | ||
239 | 228 | static int set_bit(int fd, int type, int code) | 304 | static int set_prop_bit(int fd, int code) |
240 | 305 | { | ||
241 | 306 | int ret; | ||
242 | 307 | SYSCALL(ret = ioctl(fd, UI_SET_PROPBIT, code)); | ||
243 | 308 | return ret; | ||
244 | 309 | } | ||
245 | 310 | |||
246 | 311 | static int set_event_bit(int fd, int type, int code) | ||
247 | 229 | { | 312 | { |
248 | 230 | int ret = 0; | 313 | int ret = 0; |
249 | 231 | 314 | ||
250 | @@ -262,14 +345,28 @@ | |||
251 | 262 | return ret; | 345 | return ret; |
252 | 263 | } | 346 | } |
253 | 264 | 347 | ||
254 | 348 | static int set_prop(const struct evemu_device *dev, int fd) | ||
255 | 349 | { | ||
256 | 350 | int bits = 8 * dev->pbytes; | ||
257 | 351 | int ret, i; | ||
258 | 352 | for (i = 0; i < bits; i++) { | ||
259 | 353 | if (!evemu_has_prop(dev, i)) | ||
260 | 354 | continue; | ||
261 | 355 | ret = set_prop_bit(fd, i); | ||
262 | 356 | if (ret < 0) | ||
263 | 357 | return ret; | ||
264 | 358 | } | ||
265 | 359 | return 0; | ||
266 | 360 | } | ||
267 | 361 | |||
268 | 265 | static int set_mask(const struct evemu_device *dev, int type, int fd) | 362 | static int set_mask(const struct evemu_device *dev, int type, int fd) |
269 | 266 | { | 363 | { |
271 | 267 | int bits = 8 * dev->bytes[type]; | 364 | int bits = 8 * dev->mbytes[type]; |
272 | 268 | int ret, i; | 365 | int ret, i; |
273 | 269 | for (i = 0; i < bits; i++) { | 366 | for (i = 0; i < bits; i++) { |
275 | 270 | if (!evemu_has(dev, type, i)) | 367 | if (!evemu_has_event(dev, type, i)) |
276 | 271 | continue; | 368 | continue; |
278 | 272 | ret = set_bit(fd, type, i); | 369 | ret = set_event_bit(fd, type, i); |
279 | 273 | if (ret < 0) | 370 | if (ret < 0) |
280 | 274 | return ret; | 371 | return ret; |
281 | 275 | } | 372 | } |
282 | @@ -285,7 +382,7 @@ | |||
283 | 285 | memcpy(udev.name, dev->name, sizeof(udev.name)); | 382 | memcpy(udev.name, dev->name, sizeof(udev.name)); |
284 | 286 | udev.id = dev->id; | 383 | udev.id = dev->id; |
285 | 287 | for (i = 0; i < ABS_CNT; i++) { | 384 | for (i = 0; i < ABS_CNT; i++) { |
287 | 288 | if (!evemu_has(dev, EV_ABS, i)) | 385 | if (!evemu_has_event(dev, EV_ABS, i)) |
288 | 289 | continue; | 386 | continue; |
289 | 290 | udev.absmax[i] = dev->abs[i].maximum; | 387 | udev.absmax[i] = dev->abs[i].maximum; |
290 | 291 | udev.absmin[i] = dev->abs[i].minimum; | 388 | udev.absmin[i] = dev->abs[i].minimum; |
291 | @@ -293,6 +390,10 @@ | |||
292 | 293 | udev.absflat[i] = dev->abs[i].flat; | 390 | udev.absflat[i] = dev->abs[i].flat; |
293 | 294 | } | 391 | } |
294 | 295 | 392 | ||
295 | 393 | ret = set_prop(dev, fd); | ||
296 | 394 | if (ret < 0) | ||
297 | 395 | return ret; | ||
298 | 396 | |||
299 | 296 | for (i = 0; i < EV_CNT; i++) { | 397 | for (i = 0; i < EV_CNT; i++) { |
300 | 297 | ret = set_mask(dev, i, fd); | 398 | ret = set_mask(dev, i, fd); |
301 | 298 | if (ret < 0) | 399 | if (ret < 0) |
302 | 299 | 400 | ||
303 | === modified file 'tools/evemu-describe.c' | |||
304 | --- tools/evemu-describe.c 2010-09-18 17:10:11 +0000 | |||
305 | +++ tools/evemu-describe.c 2010-12-21 17:21:49 +0000 | |||
306 | @@ -26,22 +26,27 @@ | |||
307 | 26 | * | 26 | * |
308 | 27 | ****************************************************************************/ | 27 | ****************************************************************************/ |
309 | 28 | 28 | ||
311 | 29 | #include "evemu.h" | 29 | #include <evemu.h> |
312 | 30 | #include <stdio.h> | 30 | #include <stdio.h> |
313 | 31 | #include <fcntl.h> | 31 | #include <fcntl.h> |
314 | 32 | #include <string.h> | 32 | #include <string.h> |
315 | 33 | 33 | ||
316 | 34 | static int describe_device(int fd) | 34 | static int describe_device(int fd) |
317 | 35 | { | 35 | { |
320 | 36 | struct evemu_device dev; | 36 | struct evemu_device *dev; |
321 | 37 | int ret; | 37 | int ret = -ENOMEM; |
322 | 38 | 38 | ||
324 | 39 | ret = evemu_extract(&dev, fd); | 39 | dev = evemu_new(0); |
325 | 40 | if (!dev) | ||
326 | 41 | goto out; | ||
327 | 42 | ret = evemu_extract(dev, fd); | ||
328 | 40 | if (ret) | 43 | if (ret) |
331 | 41 | return ret; | 44 | goto out; |
330 | 42 | evemu_write(&dev, stdout); | ||
332 | 43 | 45 | ||
334 | 44 | return 0; | 46 | evemu_write(dev, stdout); |
335 | 47 | out: | ||
336 | 48 | evemu_delete(dev); | ||
337 | 49 | return ret; | ||
338 | 45 | } | 50 | } |
339 | 46 | 51 | ||
340 | 47 | int main(int argc, char *argv[]) | 52 | int main(int argc, char *argv[]) |
341 | 48 | 53 | ||
342 | === modified file 'tools/evemu-device.c' | |||
343 | --- tools/evemu-device.c 2010-09-23 15:53:46 +0000 | |||
344 | +++ tools/evemu-device.c 2010-12-21 17:21:49 +0000 | |||
345 | @@ -50,7 +50,7 @@ | |||
346 | 50 | ret = read(fd, name, sizeof(name)); | 50 | ret = read(fd, name, sizeof(name)); |
347 | 51 | if (ret > 0) | 51 | if (ret > 0) |
348 | 52 | name[ret - 1] = 0; | 52 | name[ret - 1] = 0; |
350 | 53 | if (!strcmp(dev->name, name)) | 53 | if (!strcmp(evemu_get_name(dev), name)) |
351 | 54 | sprintf(node, "/dev/input/event%d", i + 1); | 54 | sprintf(node, "/dev/input/event%d", i + 1); |
352 | 55 | close(fd); | 55 | close(fd); |
353 | 56 | } | 56 | } |
354 | @@ -58,7 +58,7 @@ | |||
355 | 58 | fd = open(node, O_RDONLY); | 58 | fd = open(node, O_RDONLY); |
356 | 59 | if (fd < 0) | 59 | if (fd < 0) |
357 | 60 | return; | 60 | return; |
359 | 61 | fprintf(stdout, "%s: %s\n", dev->name, node); | 61 | fprintf(stdout, "%s: %s\n", evemu_get_name(dev), node); |
360 | 62 | fflush(stdout); | 62 | fflush(stdout); |
361 | 63 | while ((ret = read(fd, data, sizeof(data))) > 0); | 63 | while ((ret = read(fd, data, sizeof(data))) > 0); |
362 | 64 | close(fd); | 64 | close(fd); |
363 | @@ -66,28 +66,36 @@ | |||
364 | 66 | 66 | ||
365 | 67 | static int evemu_device(FILE *fp) | 67 | static int evemu_device(FILE *fp) |
366 | 68 | { | 68 | { |
371 | 69 | struct evemu_device dev; | 69 | struct evemu_device *dev; |
372 | 70 | int ret, fd; | 70 | char name[64]; |
373 | 71 | 71 | int ret = -ENOMEM; | |
374 | 72 | ret = evemu_read(&dev, fp); | 72 | int fd; |
375 | 73 | |||
376 | 74 | sprintf(name, "evemu-%d", getpid()); | ||
377 | 75 | |||
378 | 76 | dev = evemu_new(name); | ||
379 | 77 | if (!dev) | ||
380 | 78 | goto out; | ||
381 | 79 | ret = evemu_read(dev, fp); | ||
382 | 73 | if (ret <= 0) | 80 | if (ret <= 0) |
396 | 74 | return ret; | 81 | goto out; |
397 | 75 | 82 | ||
398 | 76 | sprintf(dev.name, "evemu-%d", getpid()); | 83 | ret = fd = open(UINPUT_NODE, O_WRONLY); |
399 | 77 | 84 | if (ret < 0) | |
400 | 78 | fd = open(UINPUT_NODE, O_WRONLY); | 85 | goto out; |
401 | 79 | if (fd < 0) | 86 | |
402 | 80 | return fd; | 87 | ret = evemu_create(dev, fd); |
403 | 81 | ret = evemu_create(&dev, fd); | 88 | if (ret < 0) |
404 | 82 | if (ret < 0) | 89 | goto out_close; |
405 | 83 | return ret; | 90 | hold_device(dev); |
393 | 84 | |||
394 | 85 | hold_device(&dev); | ||
395 | 86 | |||
406 | 87 | evemu_destroy(fd); | 91 | evemu_destroy(fd); |
407 | 92 | |||
408 | 93 | out_close: | ||
409 | 88 | close(fd); | 94 | close(fd); |
410 | 95 | out: | ||
411 | 96 | evemu_delete(dev); | ||
412 | 89 | 97 | ||
414 | 90 | return 0; | 98 | return ret; |
415 | 91 | } | 99 | } |
416 | 92 | 100 | ||
417 | 93 | int main(int argc, char *argv[]) | 101 | int main(int argc, char *argv[]) |
418 | 94 | 102 | ||
419 | === modified file 'tools/evemu-echo.c' | |||
420 | --- tools/evemu-echo.c 2010-09-18 17:10:11 +0000 | |||
421 | +++ tools/evemu-echo.c 2010-12-21 17:21:49 +0000 | |||
422 | @@ -33,16 +33,20 @@ | |||
423 | 33 | 33 | ||
424 | 34 | static int evemu_echo_describe(FILE *fp) | 34 | static int evemu_echo_describe(FILE *fp) |
425 | 35 | { | 35 | { |
428 | 36 | struct evemu_device dev; | 36 | struct evemu_device *dev; |
429 | 37 | int ret; | 37 | int ret = -ENOMEM; |
430 | 38 | 38 | ||
432 | 39 | ret = evemu_read(&dev, fp); | 39 | dev = evemu_new(0); |
433 | 40 | if (!dev) | ||
434 | 41 | goto out; | ||
435 | 42 | ret = evemu_read(dev, fp); | ||
436 | 40 | if (ret <= 0) | 43 | if (ret <= 0) |
442 | 41 | return ret; | 44 | goto out; |
443 | 42 | 45 | ||
444 | 43 | evemu_write(&dev, stdout); | 46 | evemu_write(dev, stdout); |
445 | 44 | 47 | out: | |
446 | 45 | return 0; | 48 | evemu_delete(dev); |
447 | 49 | return ret; | ||
448 | 46 | } | 50 | } |
449 | 47 | 51 | ||
450 | 48 | static int evemu_echo_event(FILE *fp) | 52 | static int evemu_echo_event(FILE *fp) |
Seems good.