SASC-NG
DVBSoftCAM

dvblb_internal.h File Reference

#include <linux/wait.h>
#include <linux/proc_fs.h>
#include "dvbdev.h"
#include "dvbloopback.h"

Go to the source code of this file.

Classes

struct  dvblb_fwdmap
struct  dvblb_devinfo
struct  dvblb

Defines

#define DVBLB_MAX_ADAPTERS   8
#define DVBLB_STATUS_FRONTEND   (1 << DVBLB_FRONTEND)
#define DVBLB_STATUS_DEMUX   (1 << DVBLB_DEMUX)
#define DVBLB_STATUS_DVR   (1 << DVBLB_DVR)
#define DVBLB_STATUS_ADAPTER   0x0100U
#define DVBLB_STATUS_PROC   0x0200U

Enumerations

enum  {
  DVBLB_FRONTEND = 0, DVBLB_DEMUX = 1, DVBLB_DVR = 2, DVBLB_VIDEO = 3,
  DVBLB_AUDIO = 4, DVBLB_OSD = 5, DVBLB_NUM_DEVS = 6
}

Functions

int inuse_filemap (struct dvblb_devinfo *lbdev)
int dvblb_remove_procfs (struct proc_dir_entry *pdir, struct proc_dir_entry *parent)
int dvblb_init_procfs_device (struct dvblb *dvblb, struct dvblb_devinfo *lbdev)
int dvblb_init_procfs_adapter (struct dvblb *dvblb)
int dvblb_remove_procfs_adapter (struct dvblb *dvblb)
int dvblb_init_procfs (void)
int dvblb_uninit_procfs (void)
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 DVBLB_MAX_ADAPTERS   8

Definition at line 6 of file dvblb_internal.h.

Referenced by dvblb_init().

#define DVBLB_STATUS_ADAPTER   0x0100U

Definition at line 59 of file dvblb_internal.h.

Referenced by destroy_lb_adapter(), and dvblb_init().

#define DVBLB_STATUS_DEMUX   (1 << DVBLB_DEMUX)

Definition at line 57 of file dvblb_internal.h.

#define DVBLB_STATUS_DVR   (1 << DVBLB_DVR)

Definition at line 58 of file dvblb_internal.h.

#define DVBLB_STATUS_FRONTEND   (1 << DVBLB_FRONTEND)

Definition at line 56 of file dvblb_internal.h.

#define DVBLB_STATUS_PROC   0x0200U

Definition at line 60 of file dvblb_internal.h.

Referenced by dvblb_init_procfs_adapter(), and dvblb_remove_procfs_adapter().


Enumeration Type Documentation

anonymous enum
Enumerator:
DVBLB_FRONTEND 
DVBLB_DEMUX 
DVBLB_DVR 
DVBLB_VIDEO 
DVBLB_AUDIO 
DVBLB_OSD 
DVBLB_NUM_DEVS 

Definition at line 46 of file dvblb_internal.h.


Function Documentation

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;
}
int dvblb_init_procfs ( void  )

Definition at line 222 of file dvblb_proc.c.

References NULL, and procdir.

Referenced by dvblb_init().

{
        procdir = proc_mkdir("dvbloopback", NULL);
        if (procdir == NULL)
                return -ENOMEM;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
        procdir->owner = THIS_MODULE;
#endif
        return 0;
}
int dvblb_init_procfs_adapter ( struct dvblb *  dvblb)

Definition at line 182 of file dvblb_proc.c.

References dvblb::adapter, dvblb_procfs_adapter_read(), dvblb_procfs_adapter_write(), dvblb_remove_procfs(), DVBLB_STATUS_PROC, dvblb::init, NULL, dvb_adapter::num, procdir, dvblb::procdir, and dvblb::procfile.

Referenced by dvblb_init().

{
        char name[10];
        sprintf(name, "adapter%d", dvblb->adapter.num);
        dvblb->procdir = proc_mkdir(name, procdir);
        if (dvblb->procdir == NULL)
                return -ENOMEM;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
        dvblb->procdir->owner = THIS_MODULE;
#endif
        dvblb->procfile = create_proc_entry("adapter", 0644, dvblb->procdir);
        if (dvblb->procfile == NULL) {
                dvblb_remove_procfs(dvblb->procdir, procdir);
                return -ENOMEM;
        }
        dvblb->procfile->data = dvblb;
        dvblb->procfile->read_proc = dvblb_procfs_adapter_read;
        dvblb->procfile->write_proc = dvblb_procfs_adapter_write;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
        dvblb->procfile->owner = THIS_MODULE;
#endif
        dvblb->init |= DVBLB_STATUS_PROC;

        return 0;
}
int dvblb_init_procfs_device ( struct dvblb *  dvblb,
struct dvblb_devinfo *  lbdev 
)

Definition at line 166 of file dvblb_proc.c.

References dnames, dvblb_procfs_read(), dvblb_procfs_write(), dvblb_devinfo::lb_dev, NULL, dvblb::procdir, dvblb_devinfo::procfile, and dvb_device::type.

Referenced by create_lb_dev().

{
        int type = lbdev->lb_dev->type;
        lbdev->procfile = create_proc_entry(dnames[type], 0644, dvblb->procdir);
        if (lbdev->procfile == NULL)
                return -ENOMEM;
        lbdev->procfile->data = lbdev;
        lbdev->procfile->read_proc = dvblb_procfs_read;
        lbdev->procfile->write_proc = dvblb_procfs_write;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
        lbdev->procfile->owner = THIS_MODULE;
#endif
        return 0;
}
int dvblb_remove_procfs ( struct proc_dir_entry *  pdir,
struct proc_dir_entry *  parent 
)

Definition at line 154 of file dvblb_proc.c.

Referenced by destroy_lb_dev(), dvblb_init_procfs_adapter(), dvblb_remove_procfs_adapter(), and dvblb_uninit_procfs().

{
        char name[20];
        memcpy(name, pdir->name, pdir->namelen);
        name[pdir->namelen] = '\0';
        // printk("Removing proc: %s\n", name);
        remove_proc_entry(name, parent);
        return 0;
}
int dvblb_remove_procfs_adapter ( struct dvblb *  dvblb)

Definition at line 209 of file dvblb_proc.c.

References dvblb_remove_procfs(), DVBLB_STATUS_PROC, dvblb::init, procdir, dvblb::procdir, and dvblb::procfile.

Referenced by destroy_lb_adapter().

{
        if(dvblb->init & DVBLB_STATUS_PROC) {
                dvblb_remove_procfs(dvblb->procfile, dvblb->procdir);
                dvblb_remove_procfs(dvblb->procdir, procdir);
                printk("removing dvblb proc adapter\n");
        }
        dvblb->init &= ~DVBLB_STATUS_PROC;
        printk("dvblb init = %x\n", dvblb->init);
        return 0;
}
int dvblb_uninit_procfs ( void  )

Definition at line 234 of file dvblb_proc.c.

References dvblb_remove_procfs(), NULL, and procdir.

Referenced by cleanup_dvblb_module().

{
        dvblb_remove_procfs(procdir, NULL);
        return 0;
}
int inuse_filemap ( struct dvblb_devinfo *  lbdev)

Definition at line 252 of file dvb_loopback.c.

References count, DVBLB_MAXFD, dvblb_devinfo::filemap, i, and NULL.

Referenced by dvblb_procfs_adapter_write(), and dvblb_procfs_write().

                                               {
        int i, count = 0;
        for(i = 0; i < DVBLB_MAXFD; i++)
                if(lbdev->filemap[i] != NULL)
                        count++;
        return count;
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines