Example #1
0
static int dev_ioctl(file_t * file, unsigned request, void * arg, size_t arg_len)
{
    struct dev_info * devnfo = (struct dev_info *)file->vnode->vn_specinfo;

    if (!devnfo)
        return -ENOTTY;

    switch (request) {
    case IOCTL_GETBLKSIZE:
        if (!arg)
            return -EINVAL;

        sizetto(devnfo->block_size, arg, arg_len);

        return 0;
    case IOCTL_GETBLKCNT:
        if (!arg)
            return -EINVAL;

        sizetto(devnfo->num_blocks, arg, arg_len);

        return 0;
    }

    if (!devnfo->ioctl)
        return -EINVAL;

    return devnfo->ioctl(devnfo, request, arg, arg_len);
}
Example #2
0
File: devfs.c Project: Zeke-OS/zeke
static int dev_ioctl(file_t * file, unsigned request, void * arg, size_t arg_len)
{
    struct dev_info * devnfo = (struct dev_info *)file->vnode->vn_specinfo;

    if (!devnfo)
        return -ENOTTY;

    if (devnfo->ioctl) {
        int err;

        err = devnfo->ioctl(devnfo, request, arg, arg_len);
        if (err == 0 || err != -EINVAL)
            return err;
    }

    /*
     * Default handlers.
     */
    switch (request) {
    case IOCTL_GETBLKSIZE:
        if (!arg)
            return -EINVAL;

        sizetto(devnfo->block_size, arg, arg_len);

        return 0;
    case IOCTL_GETBLKCNT:
        if (!arg)
            return -EINVAL;

        sizetto(devnfo->num_blocks, arg, arg_len);

        return 0;
    case IOCTL_FLSBLKBUF: /* Don't care if the dev doesn't support sync. */
        return 0;
    default:
        return -EINVAL;
    }
}