SASC
DVBSoftCAM

dvblb_proc.c File Reference

#include <linux/version.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include "dvblb_internal.h"

Go to the source code of this file.

Functions

static int dvblb_procfs_read (char *page, char **start, off_t off, int count, int *eof, void *data)
static int dvblb_procfs_write (struct file *file, const char *buffer, unsigned long count, void *data)
static int dvblb_procfs_adapter_read (char *page, char **start, off_t off, int count, int *eof, void *data)
static int dvblb_procfs_adapter_write (struct file *file, const char *buffer, unsigned long count, void *data)
int dvblb_remove_procfs (struct proc_dir_entry *pdir, struct proc_dir_entry *parent)
 EXPORT_SYMBOL (dvblb_remove_procfs)
int dvblb_init_procfs_device (struct dvblb *dvblb, struct dvblb_devinfo *lbdev)
 EXPORT_SYMBOL (dvblb_init_procfs_device)
int dvblb_init_procfs_adapter (struct dvblb *dvblb)
 EXPORT_SYMBOL (dvblb_init_procfs_adapter)
int dvblb_remove_procfs_adapter (struct dvblb *dvblb)
 EXPORT_SYMBOL (dvblb_remove_procfs_adapter)
int dvblb_init_procfs (void)
 EXPORT_SYMBOL (dvblb_init_procfs)
int dvblb_uninit_procfs (void)
 EXPORT_SYMBOL (dvblb_uninit_procfs)

Variables

static struct proc_dir_entry * procdir

Function Documentation

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;
}
static int dvblb_procfs_adapter_read ( char *  page,
char **  start,
off_t  off,
int  count,
int *  eof,
void *  data 
) [static]

Definition at line 99 of file dvblb_proc.c.

References dvblb::link, and NULL.

Referenced by dvblb_init_procfs_adapter().

{
        struct dvblb *dvblb = (struct dvblb *)data;
        if (dvblb == NULL)
                return 0;
        return sprintf(page, "%d", dvblb->link);
}
static int dvblb_procfs_adapter_write ( struct file *  file,
const char *  buffer,
unsigned long  count,
void *  data 
) [static]

Definition at line 108 of file dvblb_proc.c.

References dvblb::adapter, count, dvblb_devinfo::dbgfilemap, dvblb::devinfo, dnames, DVBLB_NUM_DEVS, dvblb_devinfo::filemap, dvblb_devinfo::forward_dev, i, inuse_filemap(), dvblb_devinfo::lb_dev, dvblb::link, NULL, dvb_adapter::num, and dvb_device::type.

Referenced by dvblb_init_procfs_adapter().

{
        char str[10];
        int val, i, fm;
        struct dvblb *dvbdev = (struct dvblb *)data;
        if (dvbdev == NULL)
                return count;
        if (count > 10)
                count = 10;
        if (copy_from_user(str, buffer, count)) {
                return -EFAULT;
        }
        val = simple_strtol(str, NULL, 0);

        if(val == -999) {
                /*This is a debug case.  Try to force close all open fds
                  This is known not to be very reliable, but better than
                  nothing
                */
                for(i = 0; i < DVBLB_NUM_DEVS; i++) {
                        while((fm = inuse_filemap(&dvbdev->devinfo[i]))) {
                                filp_close(dvbdev->devinfo[i].dbgfilemap[fm],
                                           NULL);
                                dvbdev->devinfo[i].filemap[fm] = NULL;
                        }
                }
                return count;
        }
        for(i = 0; i < DVBLB_NUM_DEVS; i++) {
                if(dvbdev->devinfo[i].forward_dev == NULL)
                        continue;
                if((fm = inuse_filemap(&dvbdev->devinfo[i]))) {
                        int type = dvbdev->devinfo[i].lb_dev->type;
                        printk("dvbloopback: Can't change forward on adapter%d."
                               " Device %s still has %d users!\n",
                               dvbdev->adapter.num, dnames[type], fm);
                        return count;
                }
        }
        for(i = 0; i < DVBLB_NUM_DEVS; i++)
                dvbdev->devinfo[i].forward_dev = NULL;
        dvbdev->link = val;
        return count;
}
static int dvblb_procfs_read ( char *  page,
char **  start,
off_t  off,
int  count,
int *  eof,
void *  data 
) [static]

Definition at line 34 of file dvblb_proc.c.

References dvblb_devinfo::forward_dev, and NULL.

Referenced by dvblb_init_procfs_device().

{
        struct dvblb_devinfo *lbdev = (struct dvblb_devinfo *)data;
        int val;
        if (lbdev == NULL)
                return 0;
        val = (lbdev->forward_dev) ? 1 : 0;
        return sprintf(page, "%03d", val);
}
static int dvblb_procfs_write ( struct file *  file,
const char *  buffer,
unsigned long  count,
void *  data 
) [static]

Definition at line 45 of file dvblb_proc.c.

References dvblb::adapter, dvblb::adapter_ll, count, dvb_adapter::device_list, dnames, dvblb_devinfo::forward_dev, inuse_filemap(), dvblb_devinfo::lb_dev, dvblb::link, list_entry, list_for_each, NULL, dvb_adapter::num, dvblb_devinfo::parent, and dvb_device::type.

Referenced by dvblb_init_procfs_device().

{
        char str[10];
        int val, v1, v2, v3, fm;
        struct dvblb_devinfo *lbdev = (struct dvblb_devinfo *)data;
        if (lbdev == NULL)
                return count;
        if (lbdev->parent->link == -1)
                return count;
        if (count > 10)
                count = 10;
        if (copy_from_user(str, buffer, count)) {
                return -EFAULT;
        }
        val = simple_strtoul(str, NULL, 0);
        v1 = val /100;
        v2 = (val - v1*100) / 10;
        v3 = val - v1*100 - v2*10;
        if (v1 < 0 || v1 > 2) 
                return -EFAULT;
        if((fm = inuse_filemap(lbdev))) {
                int type = lbdev->lb_dev->type;
                printk("dvbloopback: Can't change forward on adapter%d."
                       " Device %s still has %d users!\n",
                       lbdev->parent->adapter.num, dnames[type], fm);
                return count;
        }
        if (v3 == 1) {
                struct list_head *entry;
                list_for_each (entry, lbdev->parent->adapter_ll) {
                        struct dvb_adapter *adap;
                        adap = list_entry (entry, struct dvb_adapter,
                                           list_head);
                        if (adap->num == lbdev->parent->link) {
                                struct list_head *entry0;
                                list_for_each (entry0,
                                               &adap->device_list) {
                                        struct dvb_device *dev;
                                        dev = list_entry (entry0,
                                               struct dvb_device, list_head);
                                        if (dev->type == lbdev->lb_dev->type) {
                                                lbdev->forward_dev = dev;
                                                return count;
                                        }
                                }
                        }
                }
        } else if (v3 == 0) {
                lbdev->forward_dev = NULL;
        }
        return count;
}
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;
}
EXPORT_SYMBOL ( dvblb_init_procfs  )
EXPORT_SYMBOL ( dvblb_uninit_procfs  )
EXPORT_SYMBOL ( dvblb_init_procfs_adapter  )
EXPORT_SYMBOL ( dvblb_remove_procfs  )
EXPORT_SYMBOL ( dvblb_remove_procfs_adapter  )
EXPORT_SYMBOL ( dvblb_init_procfs_device  )

Variable Documentation

struct proc_dir_entry* procdir [static]
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines