int ioctl(int d, unsigned long request, ...) { libc_func(ioctl, int, int, unsigned long, ...); int result; va_list ap; void* arg; /* one cannot reliably forward arbitrary varargs * (http://c-faq.com/varargs/handoff.html), but we know that ioctl gets at * most one extra argument, and almost all of them are pointers or ints, * both of which fit into a void*. */ va_start(ap, request); arg = va_arg(ap, void*); va_end(ap); result = ioctl_emulate(d, request, arg); if (result != UNHANDLED) { DBG(DBG_IOCTL, "ioctl fd %i request %lX: emulated, result %i\n", d, request, result); return result; } /* call original ioctl */ result = _ioctl(d, request, arg); DBG(DBG_IOCTL, "ioctl fd %i request %lX: original, result %i\n", d, request, result); if (result != -1 && ioctl_record_fd == d) record_ioctl(request, arg, result); return result; }
int ioctl(int d, unsigned long request, void *arg) { libc_func(ioctl, int, int, unsigned long, void *); int result; result = ioctl_emulate(d, request, arg); if (result != -2) { DBG("ioctl fd %i request %lX: emulated, result %i\n", d, request, result); return result; } /* call original ioctl */ result = _ioctl(d, request, arg); DBG("ioctl fd %i request %lX: original, result %i\n", d, request, result); if (result != -1 && ioctl_record_fd == d) record_ioctl(request, arg, result); return result; }