SASC-NG
DVBSoftCAM

dvblb_forward.c File Reference

#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)

Define Documentation

#define nums2minor (   num,
  type,
  id 
)    ((num << 6) | (id << 4) | type)

Definition at line 35 of file dvblb_forward.c.


Function Documentation

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;
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines