|
SASC
DVBSoftCAM
|
#include <linux/version.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/file.h>#include <linux/cdev.h>#include <linux/err.h>#include "dvblb_internal.h"Go to the source code of this file.
Defines | |
| #define | nums2minor(num, type, id) ((num << 6) | (id << 4) | type) |
Functions | |
| static struct file * | find_forwardmap (struct dvblb_devinfo *lbdev, struct dvb_device **f) |
| static int | set_forwardmap (struct dvblb_devinfo *lbdev, struct dvb_device **f, struct file *map) |
| static void | clear_forwardmap (struct dvblb_devinfo *lbdev, struct dvb_device **f) |
| int | dvblb_forward_open (struct dvblb_devinfo *lbdev, struct inode *inode, struct file *f) |
| int | dvblb_forward_release (struct dvblb_devinfo *lbdev, struct file *f) |
| ssize_t | dvblb_forward_write (struct dvblb_devinfo *lbdev, struct file *f, const char *buf, size_t count, loff_t *offset) |
| ssize_t | dvblb_forward_read (struct dvblb_devinfo *lbdev, struct file *f, char *buf, size_t count, loff_t *offset) |
| int | dvblb_forward_ioctl (struct dvblb_devinfo *lbdev, struct file *f, unsigned int cmd, unsigned long arg) |
| int | dvblb_forward_mmap (struct dvblb_devinfo *lbdev, struct file *f, struct vm_area_struct *vma) |
| int | dvblb_forward_poll (struct dvblb_devinfo *lbdev, struct file *f, struct poll_table_struct *wait) |
Definition at line 35 of file dvblb_forward.c.
| static void clear_forwardmap | ( | struct dvblb_devinfo * | lbdev, |
| struct dvb_device ** | f | ||
| ) | [static] |
Definition at line 60 of file dvblb_forward.c.
References DVBLB_MAXFD, dvblb_fwdmap::f, dvblb_devinfo::forwardmap, i, and NULL.
Referenced by dvblb_forward_release().
{
int i;
for(i = 0; i < DVBLB_MAXFD; i++)
if(lbdev->forwardmap[i].f == f) {
lbdev->forwardmap[i].f = NULL;
return;
}
}
| int dvblb_forward_ioctl | ( | struct dvblb_devinfo * | lbdev, |
| struct file * | f, | ||
| unsigned int | cmd, | ||
| unsigned long | arg | ||
| ) |
Definition at line 163 of file dvblb_forward.c.
References find_forwardmap(), dvb_device::fops, and dvblb_devinfo::forward_dev.
Referenced by dvblb_ioctl().
{
struct file *ftmp = find_forwardmap(lbdev, f->private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->unlocked_ioctl)
return lbdev->forward_dev->fops->unlocked_ioctl(
ftmp, cmd, arg);
#else
if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->ioctl)
return lbdev->forward_dev->fops->ioctl(
ftmp->f_dentry->d_inode, ftmp, cmd, arg);
#endif
return -EFAULT;
}
| int dvblb_forward_mmap | ( | struct dvblb_devinfo * | lbdev, |
| struct file * | f, | ||
| struct vm_area_struct * | vma | ||
| ) |
Definition at line 181 of file dvblb_forward.c.
References find_forwardmap(), dvb_device::fops, and dvblb_devinfo::forward_dev.
Referenced by dvblb_mmap().
{
struct file *ftmp = find_forwardmap(lbdev, f->private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->mmap)
return lbdev->forward_dev->fops->mmap(ftmp, vma);
return -EFAULT;
}
| int dvblb_forward_open | ( | struct dvblb_devinfo * | lbdev, |
| struct inode * | inode, | ||
| struct file * | f | ||
| ) |
Definition at line 70 of file dvblb_forward.c.
References dvb_device::adapter, dnames, fd, dvb_device::fops, dvblb_devinfo::forward_dev, dvb_device::id, NULL, dvb_adapter::num, set_forwardmap(), and dvb_device::type.
Referenced by dvblb_open().
{
// int minor;
// struct inode *tmpinode;
// struct dentry *dentry;
struct file *ftmp;
char tmpstr[35];
if (! inode->i_cdev || ! inode->i_cdev->ops ||
! inode->i_cdev->ops->open) {
printk("dvblb_forward_open: "
"device wasn't correctly initialized\n");
return -EFAULT;
}
sprintf(tmpstr, "/dev/dvb/adapter%d/%s%d", lbdev->forward_dev->adapter->num, dnames[lbdev->forward_dev->type], lbdev->forward_dev->id);
/* printk("linking to %s\n", tmpstr); */
ftmp = filp_open(tmpstr, f->f_flags, f->f_mode);
/* It would be nice to find a way to open the device without relying
on a fixed path, but the attempt below certainly isn't it */
/*
minor = nums2minor(lbdev->forward_dev->adapter->num,
lbdev->forward_dev->type, lbdev->forward_dev->id);
tmpinode = iget_locked(inode->i_sb, MKDEV(DVB_MAJOR, minor));
if (! tmpinode)
return -EFAULT;
if (is_bad_inode(tmpinode)) {
iput(tmpinode);
return -EFAULT;
}
dentry = d_alloc_anon(tmpinode);
if (!dentry) {
iput(tmpinode);
return -EFAULT;
}
ftmp = dentry_open(dentry, f->f_vfsmnt, f->f_flags);
*/
if (!ftmp || IS_ERR(ftmp)) {
int fd = PTR_ERR(ftmp);
printk("open failed: %d\n", fd);
return fd;
}
if (! ftmp->f_op || ! lbdev->forward_dev->fops ||
ftmp->f_op->open != lbdev->forward_dev->fops->open) {
printk("DVB device din't initialize correctly\n");
filp_close(ftmp, NULL);
return -EFAULT;
}
if (set_forwardmap(lbdev, f->private_data, ftmp) == -1) {
printk("Didn't find a valid forwardmap\n");
filp_close(ftmp, NULL);
return -EFAULT;
}
return 0;
}
| int dvblb_forward_poll | ( | struct dvblb_devinfo * | lbdev, |
| struct file * | f, | ||
| struct poll_table_struct * | wait | ||
| ) |
Definition at line 192 of file dvblb_forward.c.
References find_forwardmap(), dvb_device::fops, and dvblb_devinfo::forward_dev.
Referenced by dvblb_poll().
{
struct file *ftmp = find_forwardmap(lbdev, f->private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->poll)
return lbdev->forward_dev->fops->poll(ftmp, wait);
return -EFAULT;
}
| ssize_t dvblb_forward_read | ( | struct dvblb_devinfo * | lbdev, |
| struct file * | f, | ||
| char * | buf, | ||
| size_t | count, | ||
| loff_t * | offset | ||
| ) |
Definition at line 151 of file dvblb_forward.c.
References find_forwardmap(), dvb_device::fops, and dvblb_devinfo::forward_dev.
Referenced by dvblb_read().
{
struct file *ftmp = find_forwardmap(lbdev, f->private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->read)
return lbdev->forward_dev->fops->read(
ftmp, buf, count, offset);
return -EFAULT;
}
| int dvblb_forward_release | ( | struct dvblb_devinfo * | lbdev, |
| struct file * | f | ||
| ) |
Definition at line 127 of file dvblb_forward.c.
References clear_forwardmap(), find_forwardmap(), dvb_device::fops, dvblb_devinfo::forward_dev, and NULL.
Referenced by dvblb_release().
{
struct file *ftmp = find_forwardmap(lbdev, f->private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->release) {
filp_close(ftmp, NULL);
clear_forwardmap(lbdev, f->private_data);
}
return -EFAULT;
}
| ssize_t dvblb_forward_write | ( | struct dvblb_devinfo * | lbdev, |
| struct file * | f, | ||
| const char * | buf, | ||
| size_t | count, | ||
| loff_t * | offset | ||
| ) |
Definition at line 139 of file dvblb_forward.c.
References find_forwardmap(), dvb_device::fops, and dvblb_devinfo::forward_dev.
Referenced by dvblb_write().
{
struct file *ftmp = find_forwardmap(lbdev, f->private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->write)
return lbdev->forward_dev->fops->write(
ftmp, buf, count, offset);
return -EFAULT;
}
| static struct file* find_forwardmap | ( | struct dvblb_devinfo * | lbdev, |
| struct dvb_device ** | f | ||
| ) | [static, read] |
Definition at line 38 of file dvblb_forward.c.
References DVBLB_MAXFD, dvblb_fwdmap::f, dvblb_devinfo::forwardmap, i, and dvblb_fwdmap::map.
Referenced by dvblb_forward_ioctl(), dvblb_forward_mmap(), dvblb_forward_poll(), dvblb_forward_read(), dvblb_forward_release(), and dvblb_forward_write().
{
int i;
for(i = 0; i < DVBLB_MAXFD; i++)
if(lbdev->forwardmap[i].f == f)
return lbdev->forwardmap[i].map;
return ERR_PTR(-1);
}
| static int set_forwardmap | ( | struct dvblb_devinfo * | lbdev, |
| struct dvb_device ** | f, | ||
| struct file * | map | ||
| ) | [static] |
Definition at line 48 of file dvblb_forward.c.
References DVBLB_MAXFD, dvblb_fwdmap::f, dvblb_devinfo::forwardmap, i, dvblb_fwdmap::map, and NULL.
Referenced by dvblb_forward_open().
{
int i;
for(i = 0; i < DVBLB_MAXFD; i++)
if(lbdev->forwardmap[i].f == NULL) {
lbdev->forwardmap[i].f = f;
lbdev->forwardmap[i].map = map;
return i;
}
return -1;
}