evdev: fix build with old kernel headers

* configure.ac: Check whether struct input_absinfo.resolution is defined
in <linux/input.h>.
* evdev.c (SYN_MAX): Add fallback definition.
(abs_ioctl): Wrap use of struct input_absinfo.resolution in #ifdef check.
(keycode_V2_ioctl, mtslots_ioctl, repeat_ioctl): Wrap in #ifdef checks.
(evdev_read_ioctl): Wrap in #ifdef checks the code that uses EV_SW,
EVIOCGREP, EVIOCGKEYCODE_V2, EVIOCGMTSLOTS, EVIOCGPROP, and EVIOCGSW.
(evdev_write_ioctl): Wrap in #ifdef checks the code that uses EVIOCSREP,
EVIOCSKEYCODE_V2, EVIOCSCLOCKID, and EVIOCREVOKE.
diff --git a/evdev.c b/evdev.c
index 0faa487..e26896f 100644
--- a/evdev.c
+++ b/evdev.c
@@ -44,6 +44,10 @@
 #include "xlat/evdev_switch.h"
 #include "xlat/evdev_sync.h"
 
+#ifndef SYN_MAX
+# define SYN_MAX 0xf
+#endif
+
 static void
 decode_envelope(struct ff_envelope *envelope)
 {
@@ -139,8 +143,10 @@
 	if (!abbrev(tcp)) {
 		tprintf(", maximum=%" PRIu32 ", fuzz=%" PRIu32,
 			absinfo.maximum, absinfo.fuzz);
-		tprintf(", flat=%" PRIu32 ", resolution=%" PRIu32,
-			absinfo.flat, absinfo.resolution);
+		tprintf(", flat=%" PRIu32, absinfo.flat);
+#ifdef HAVE_STRUCT_INPUT_ABSINFO_RESOLUTION
+		tprintf(", resolution=%" PRIu32, absinfo.resolution);
+#endif
 		tprints("}");
 	} else {
 		tprints(", ...}");
@@ -167,6 +173,7 @@
 	return 1;
 }
 
+#ifdef EVIOCGKEYCODE_V2
 static int
 keycode_V2_ioctl(struct tcb *tcp, long arg)
 {
@@ -195,6 +202,7 @@
 	}
 	return 1;
 }
+#endif /* EVIOCGKEYCODE_V2 */
 
 static int
 getid_ioctl(struct tcb *tcp, long arg)
@@ -257,6 +265,7 @@
 	return 1;
 }
 
+#ifdef EVIOCGMTSLOTS
 static int
 mtslots_ioctl(struct tcb *tcp, const unsigned int code, long arg)
 {
@@ -281,7 +290,9 @@
 	tprints("]}");
 	return 1;
 }
+#endif /* EVIOCGMTSLOTS */
 
+#ifdef EVIOCGREP
 static int
 repeat_ioctl(struct tcb *tcp, long arg)
 {
@@ -293,6 +304,7 @@
 	tprintf(", [%" PRIu32 " %" PRIu32 "]", val[0], val[1]);
 	return 1;
 }
+#endif /* EVIOCGREP */
 
 static int
 evdev_read_ioctl(struct tcb *tcp, const unsigned int code, long arg)
@@ -320,9 +332,11 @@
 			case EV_MSC:
 				return decode_bitset(tcp, arg,
 						evdev_misc, MSC_MAX, "MSC_???");
+#ifdef EV_SW
 			case EV_SW:
 				return decode_bitset(tcp, arg,
 						evdev_switch, SW_MAX, "SW_???");
+#endif
 			case EV_LED:
 				return decode_bitset(tcp, arg,
 						evdev_leds, LED_MAX, "LED_???");
@@ -360,32 +374,42 @@
 			return 1;
 		case EVIOCGID:
 			return getid_ioctl(tcp, arg);
+#ifdef EVIOCGREP
 		case EVIOCGREP:
 			return repeat_ioctl(tcp, arg);;
+#endif
 		case EVIOCGKEYCODE:
 			return keycode_ioctl(tcp, arg);
+#ifdef EVIOCGKEYCODE_V2
 		case EVIOCGKEYCODE_V2:
 			return keycode_V2_ioctl(tcp, arg);
+#endif
 	}
 
 	switch (_IOC_NR(code)) {
+#ifdef EVIOCGMTSLOTS
 		case _IOC_NR(EVIOCGMTSLOTS(0)):
 			return mtslots_ioctl(tcp, code, arg);
+#endif
 		case _IOC_NR(EVIOCGNAME(0)):
 		case _IOC_NR(EVIOCGPHYS(0)):
 		case _IOC_NR(EVIOCGUNIQ(0)):
 			tprints(", ");
 			printstr(tcp, arg, tcp->u_rval - 1);
 			return 1;
+#ifdef EVIOCGPROP
 		case _IOC_NR(EVIOCGPROP(0)):
 			return decode_bitset(tcp, arg,
 					evdev_prop, INPUT_PROP_MAX, "PROP_???");
+#endif
 		case _IOC_NR(EVIOCGSND(0)):
 			return decode_bitset(tcp, arg,
 					evdev_snd, SND_MAX, "SND_???");
+#ifdef EVIOCGSW
 		case _IOC_NR(EVIOCGSW(0)):
 			return decode_bitset(tcp, arg,
 					evdev_switch, SW_MAX, "SW_???");
+#endif
 		case _IOC_NR(EVIOCGKEY(0)):
 			return decode_bitset(tcp, arg,
 					evdev_keycode, KEY_MAX, "KEY_???");
@@ -407,18 +431,26 @@
 		return abs_ioctl(tcp, arg);
 
 	switch (code) {
+#ifdef EVIOCSREP
 		case EVIOCSREP:
 			return repeat_ioctl(tcp, arg);
+#endif
 		case EVIOCSKEYCODE:
 			return keycode_ioctl(tcp, arg);
+#ifdef EVIOCSKEYCODE_V2
 		case EVIOCSKEYCODE_V2:
 			return keycode_V2_ioctl(tcp, arg);
+#endif
 		case EVIOCSFF:
 			return ff_effect_ioctl(tcp, arg);
 		case EVIOCRMFF:
+#ifdef EVIOCSCLOCKID
 		case EVIOCSCLOCKID:
+#endif
 		case EVIOCGRAB:
+#ifdef EVIOCREVOKE
 		case EVIOCREVOKE:
+#endif
 			tprints(", ");
 			printnum_int(tcp, arg, "%u");
 			return 1;