status_t user_fd_kernel_ioctl(int fd, uint32 op, void* buffer, size_t length) { TRACE(("user_fd_kernel_ioctl: fd %d\n", fd)); return fd_ioctl(false, fd, op, buffer, length); }
int ioctl(int fd, unsigned long int request, ...) { static int (*orig_ioctl)(int fd, unsigned long int request, ...); void *argp; int ret; int i; ASSIGN(ioctl); va_list ap; va_start(ap, request); argp = va_arg(ap, void*); va_end(ap); for (i = 0; ioctl_sockios[i].request; i++) if (ioctl_sockios[i].request == request) break; ret = fd_ioctl(fd, request, argp); if (ret == FD_NONE) ret = orig_ioctl(fd, request, argp); if (ioctl_sockios[i].request) dbg("%s(fd=%d, request=%s, argp=%p) = %d\n", __func__, fd, ioctl_sockios[i].name, argp, ret); else dbg("%s(fd=%d, request=%ld, argp=%p) = %d\n", __func__, fd, request, argp, ret); return ret; }
status_t _kern_ioctl(int fd, uint32 op, void* buffer, size_t length) { TRACE(("kern_ioctl: fd %d\n", fd)); SyscallFlagUnsetter _; return fd_ioctl(true, fd, op, buffer, length); }
status_t _user_ioctl(int fd, uint32 op, void* buffer, size_t length) { if (!IS_USER_ADDRESS(buffer)) return B_BAD_ADDRESS; TRACE(("user_ioctl: fd %d\n", fd)); SyscallRestartWrapper<status_t> status; return status = fd_ioctl(false, fd, op, buffer, length); }