This is a standard ioctl supported by file descriptors, sockets (as
SIOCINQ), and ttys (as TIOCOUTQ) to get the size of the available
read buffer. It provides userspace with a feedback mechanism to
avoid overflow of the kernel ringbuffer, and is used by e.g.
libevent.

Signed-off-by: Dominic Chen <d.c.d...@gmail.com>
---
 drivers/media/dvb-core/dmxdev.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
index a168cbe..668c8d2 100644
--- a/drivers/media/dvb-core/dmxdev.c
+++ b/drivers/media/dvb-core/dmxdev.c
@@ -28,6 +28,7 @@
 #include <linux/poll.h>
 #include <linux/ioctl.h>
 #include <linux/wait.h>
+#include <asm/ioctls.h>
 #include <asm/uaccess.h>
 #include "dmxdev.h"
 
@@ -57,6 +58,22 @@ static int dvb_dmxdev_buffer_write(struct dvb_ringbuffer 
*buf,
        return dvb_ringbuffer_write(buf, src, len);
 }
 
+static int dvb_dmxdev_get_buffer_avail(struct dvb_ringbuffer *src,
+                                      u32 *len)
+{
+       if (!src->data) {
+               *len = 0;
+               return 0;
+       }
+
+       if (src->error)
+               return src->error;
+
+       *len = dvb_ringbuffer_avail(src);
+
+       return 0;
+}
+
 static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
                                      int non_blocking, char __user *buf,
                                      size_t count, loff_t *ppos)
@@ -965,6 +982,16 @@ static int dvb_demux_do_ioctl(struct file *file,
                return -ERESTARTSYS;
 
        switch (cmd) {
+       case FIONREAD:
+               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
+                       mutex_unlock(&dmxdev->mutex);
+                       return -ERESTARTSYS;
+               }
+               ret = dvb_dmxdev_get_buffer_avail(&dmxdevfilter->buffer, parg);
+               mutex_unlock(&dmxdevfilter->mutex);
+
+               break;
+
        case DMX_START:
                if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
                        mutex_unlock(&dmxdev->mutex);
@@ -1160,6 +1187,10 @@ static int dvb_dvr_do_ioctl(struct file *file,
                return -ERESTARTSYS;
 
        switch (cmd) {
+       case FIONREAD:
+               ret = dvb_dmxdev_get_buffer_avail(&dmxdev->dvr_buffer, parg);
+               break;
+
        case DMX_SET_BUFFER_SIZE:
                ret = dvb_dvr_set_buffer_size(dmxdev, arg);
                break;
-- 
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to