static long ktap_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct ktap_user_parm uparm; int ret; switch (cmd) { case KTAP_CMD_VERSION: print_version(); return 0; case KTAP_CMD_RUN: ret = copy_from_user(&uparm, (void __user *)arg, sizeof(struct ktap_user_parm)); if (ret < 0) return -EFAULT; return ktap_main(file, &uparm); case KTAP_CMD_USER_COMPLETE: { ktap_State *ks = file->private_data; kp_user_complete(ks); break; } default: return -EINVAL; }; return 0; }
static long ktap_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { ktap_option_t parm; int ret; switch (cmd) { case KTAP_CMD_IOC_VERSION: print_version(); return 0; case KTAP_CMD_IOC_RUN: /* * must be root to run ktap script (at least for now) * * TODO: check perf_paranoid sysctl and allow non-root user * to use ktap for tracing process(like uprobe) ? */ if (!capable(CAP_SYS_ADMIN)) return -EACCES; ret = copy_from_user(&parm, (void __user *)arg, sizeof(ktap_option_t)); if (ret < 0) return -EFAULT; return ktap_main(file, &parm); default: return -EINVAL; }; return 0; }
static long ktap_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { ktap_parm parm; int ret; switch (cmd) { case KTAP_CMD_IOC_VERSION: print_version(); return 0; case KTAP_CMD_IOC_RUN: ret = copy_from_user(&parm, (void __user *)arg, sizeof(ktap_parm)); if (ret < 0) return -EFAULT; return ktap_main(file, &parm); default: return -EINVAL; }; return 0; }