diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index d3838ecf3..c2e09ff54 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -213,6 +213,8 @@ static void proc_main_list_stop(struct seq_file *, void *); static void *proc_main_list_next(struct seq_file *, void *, loff_t *); static int proc_main_list_show(struct seq_file *, void *); +static int proc_stream_open(struct inode *i, struct file *f); +static int proc_stream_close(struct inode *i, struct file *f); static ssize_t proc_stream_read(struct file *f, char __user *b, size_t l, loff_t *o); static unsigned int proc_stream_poll(struct file *f, struct poll_table_struct *p); @@ -497,8 +499,8 @@ static const struct file_operations proc_stream_ops = { .owner = THIS_MODULE, .read = proc_stream_read, .poll = proc_stream_poll, - .open = proc_generic_open_modref, - .release = proc_generic_close_modref, + .open = proc_stream_open, + .release = proc_stream_close, }; static const struct re_cipher re_ciphers[] = { @@ -2930,6 +2932,41 @@ static unsigned int proc_stream_poll(struct file *f, struct poll_table_struct *p return ret; } +static int proc_stream_open(struct inode *i, struct file *f) { + int err; + unsigned int stream_idx = (unsigned int) (unsigned long) PDE_DATA(f->f_path.dentry->d_inode); + struct re_stream *stream; + + DBG("entering proc_stream_open()\n"); + + if ((err = proc_generic_open_modref(i, f))) + return err; + + stream = get_stream_lock(NULL, stream_idx); + if (!stream) + return -EIO; + + return 0; +} + +static int proc_stream_close(struct inode *i, struct file *f) { + unsigned int stream_idx = (unsigned int) (unsigned long) PDE_DATA(f->f_path.dentry->d_inode); + struct re_stream *stream; + + DBG("entering proc_stream_close()\n"); + + stream = get_stream_lock(NULL, stream_idx); + if (!stream) + return -EIO; + /* release our own ref and the ref from _open */ + stream_put(stream); + stream_put(stream); + + proc_generic_close_modref(i, f); + + return 0; +} +