|
SASC-NG
DVBSoftCAM
|
#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 |
| int dvblb_init_procfs | ( | void | ) |
Definition at line 222 of file dvblb_proc.c.
Referenced by dvblb_init().
| 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().
| 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 | ) |
struct proc_dir_entry* procdir [static] |
Definition at line 32 of file dvblb_proc.c.
Referenced by dvblb_init_procfs(), dvblb_init_procfs_adapter(), dvblb_remove_procfs_adapter(), and dvblb_uninit_procfs().