+static ssize_t w_read(int fd, void *buf, size_t count)
+{
+ ssize_t ret;
+ if (fd != FAKEDEV_GPIO)
+ return read(fd, buf, count);
+
+ ret = emu_read_gpiodev(buf, count);
+ //strace("read(%d, %p, %d) = %d\n", fd, buf, count, ret);
+ return ret;
+}
+
+static int w_ioctl(int fd, int request, void *argp)
+{
+ int ret;
+
+ if ((FAKEDEV_MEM <= fd && fd < FAKEDEV_FD_BOUNDARY) ||
+ fd == emu_interesting_fds[IFD_SOUND].fd)
+ ret = emu_do_ioctl(fd, request, argp);
+ else
+ ret = ioctl(fd, request, argp);
+
+ strace("ioctl(%d, %08x, %p) = %d\n", fd, request, argp, ret);
+ return ret;
+}
+
+static int w_sigaction(int signum, const void *act, void *oldact)
+{
+ strace("sigaction(%d, %p, %p) = %d\n", signum, act, oldact, 0);
+ return 0;
+}
+
+#define PATCH(f) { sig_##f, sig_mask_##f, ARRAY_SIZE(sig_##f), w_##f }