X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/7b8a1bcad75628f9add4590db2bb9b8e418ee8eb..bdc143a7aa3f51a46eceec62b0b364599533fa21:/lunaix-os/kernel/device/device.c diff --git a/lunaix-os/kernel/device/device.c b/lunaix-os/kernel/device/device.c index b88f8f6..d32ca32 100644 --- a/lunaix-os/kernel/device/device.c +++ b/lunaix-os/kernel/device/device.c @@ -77,6 +77,7 @@ device_create(struct device* dev, 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); } @@ -291,17 +292,21 @@ device_alert_poller(struct device* dev, int poll_evt) 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; } @@ -312,11 +317,11 @@ __DEFINE_LXSYSCALL3(int, ioctl, int, fd, int, req, va_list, args) } 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);