diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2006-03-03 14:08:43 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-03-22 10:34:24 +0100 |
commit | b3b0abe11d606fa2344793edd3d69b98b430b0d4 (patch) | |
tree | d2be6f908ad42ce511b61beb5e5afa356ca1dcd2 /sound | |
parent | 0b7bed4ec2a16434336e018505b66bd51bb35560 (diff) | |
download | op-kernel-dev-b3b0abe11d606fa2344793edd3d69b98b430b0d4.zip op-kernel-dev-b3b0abe11d606fa2344793edd3d69b98b430b0d4.tar.gz |
[ALSA] return ENODEV for disconnected devices
Modules: ALSA Core
Add dummy functions that return -ENODEV for the struct file_operations
of a disconnected device. Without such functions, userspace would get
ENOTTY.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/init.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/sound/core/init.c b/sound/core/init.c index 17fbd6c..ad68761 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -169,11 +169,44 @@ struct snd_card *snd_card_new(int idx, const char *xid, return NULL; } +static loff_t snd_disconnect_llseek(struct file *file, loff_t offset, int orig) +{ + return -ENODEV; +} + +static ssize_t snd_disconnect_read(struct file *file, char __user *buf, + size_t count, loff_t *offset) +{ + return -ENODEV; +} + +static ssize_t snd_disconnect_write(struct file *file, const char __user *buf, + size_t count, loff_t *offset) +{ + return -ENODEV; +} + static unsigned int snd_disconnect_poll(struct file * file, poll_table * wait) { return POLLERR | POLLNVAL; } +static long snd_disconnect_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + return -ENODEV; +} + +static int snd_disconnect_mmap(struct file *file, struct vm_area_struct *vma) +{ + return -ENODEV; +} + +static int snd_disconnect_fasync(int fd, struct file *file, int on) +{ + return -ENODEV; +} + /** * snd_card_disconnect - disconnect all APIs from the file-operations (user space) * @card: soundcard structure @@ -224,7 +257,16 @@ int snd_card_disconnect(struct snd_card *card) memset(f_ops, 0, sizeof(*f_ops)); f_ops->owner = file->f_op->owner; f_ops->release = file->f_op->release; + f_ops->llseek = snd_disconnect_llseek; + f_ops->read = snd_disconnect_read; + f_ops->write = snd_disconnect_write; f_ops->poll = snd_disconnect_poll; + f_ops->unlocked_ioctl = snd_disconnect_ioctl; +#ifdef CONFIG_COMPAT + f_ops->compat_ioctl = snd_disconnect_ioctl; +#endif + f_ops->mmap = snd_disconnect_mmap; + f_ops->fasync = snd_disconnect_fasync; s_f_ops->next = card->s_f_ops; card->s_f_ops = s_f_ops; |