dev->dev_type = type;
device_init_meta(dev_meta(dev), parent, DEV_STRUCT);
+ llist_init_head(&dev->capabilities);
mutex_init(&dev->lock);
iopoll_init_evt_q(&dev->pollers);
}
iopoll_wake_pollers(&dev->pollers);
}
-__DEFINE_LXSYSCALL3(int, ioctl, int, fd, int, req, va_list, args)
+__DEFINE_LXSYSCALL3(int, ioctl, int, fd, int, req, sc_va_list, _args)
{
int errno = -1;
struct v_fd* fd_s;
+ va_list args;
+
+ convert_valist(&args, _args);
+
if ((errno &= vfs_getfd(fd, &fd_s))) {
goto done;
}
- struct device* dev = (struct device*)fd_s->file->inode->data;
- if (valid_device_subtype_ref(dev, DEV_STRUCT)) {
- errno &= ENODEV;
+ struct device* dev = resolve_device(fd_s->file->inode->data);
+ if (!valid_device_subtype_ref(dev, DEV_STRUCT)) {
+ errno = ENODEV;
goto done;
}
}
if (!dev->ops.exec_cmd) {
- errno &= ENOTSUP;
+ errno = ENOTSUP;
goto done;
}
- errno &= dev->ops.exec_cmd(dev, req, args);
+ errno = dev->ops.exec_cmd(dev, req, args);
done:
return DO_STATUS_OR_RETURN(errno);