Ejemplo n.º 1
0
static ssize_t ci_ll_read(struct dvb_ringbuffer *cibuf, struct file *file,
			  char __user *buf, size_t count, loff_t *ppos)
{
	int avail;
	int non_blocking = file->f_flags & O_NONBLOCK;
	ssize_t len;

	if (!cibuf->data || !count)
		return 0;
	if (non_blocking && (dvb_ringbuffer_empty(cibuf)))
		return -EWOULDBLOCK;
	if (wait_event_interruptible(cibuf->queue,
				     !dvb_ringbuffer_empty(cibuf)))
		return -ERESTARTSYS;
	avail = dvb_ringbuffer_avail(cibuf);
	if (avail < 4)
		return 0;
	len = DVB_RINGBUFFER_PEEK(cibuf, 0) << 8;
	len |= DVB_RINGBUFFER_PEEK(cibuf, 1);
	if (avail < len + 2 || count < len)
		return -EINVAL;
	DVB_RINGBUFFER_SKIP(cibuf, 2);

	return dvb_ringbuffer_read_user(cibuf, buf, len);
}
Ejemplo n.º 2
0
Archivo: dmxdev.c Proyecto: 274914765/C
static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
                      int non_blocking, char __user *buf,
                      size_t count, loff_t *ppos)
{
    size_t todo;
    ssize_t avail;
    ssize_t ret = 0;

    if (!src->data)
        return 0;

    if (src->error) {
        ret = src->error;
        dvb_ringbuffer_flush(src);
        return ret;
    }

    for (todo = count; todo > 0; todo -= ret) {
        if (non_blocking && dvb_ringbuffer_empty(src)) {
            ret = -EWOULDBLOCK;
            break;
        }

        ret = wait_event_interruptible(src->queue,
                           !dvb_ringbuffer_empty(src) ||
                           (src->error != 0));
        if (ret < 0)
            break;

        if (src->error) {
            ret = src->error;
            dvb_ringbuffer_flush(src);
            break;
        }

        avail = dvb_ringbuffer_avail(src);
        if (avail > todo)
            avail = todo;

        ret = dvb_ringbuffer_read(src, (u8 *)buf, avail, 1);
        if (ret < 0)
            break;

        buf += ret;
    }

    return (count - todo) ? (count - todo) : ret;
}
Ejemplo n.º 3
0
/*=============================================================================
	Function	: kfront_read
	Description	:
	Input		:
	Output		:
	Return		:
=============================================================================*/
static ssize_t kfront_read(struct file *file, char __user *buf, size_t count,
			   loff_t *ppos)
{
	int avail;
	int non_blocking = file->f_flags & O_NONBLOCK;

	if (!ci_rbuffer.data || !count)
		return 0;
	if (non_blocking && (dvb_ringbuffer_empty(&ci_rbuffer)))
		return -EWOULDBLOCK;
	if (wait_event_interruptible(ci_rbuffer.queue,
				     !dvb_ringbuffer_empty(&ci_rbuffer)))
		return -ERESTARTSYS;
	avail = dvb_ringbuffer_avail(&ci_rbuffer);
	if (avail < 1)
		return 0;

	return dvb_ringbuffer_read_user(&ci_rbuffer, buf, 1);
}
Ejemplo n.º 4
0
/*=============================================================================
	Function	: kfront_poll
	Description	:
	Input		:
	Output		:
	Return		:
=============================================================================*/
static unsigned int kfront_poll(struct file *file, poll_table *wait)
{
	unsigned int mask = 0;

	dprintk("%s: \n", __func__);

	poll_wait(file, &ci_rbuffer.queue, wait);

	if (!dvb_ringbuffer_empty(&ci_rbuffer))
		mask |= (POLLIN | POLLRDNORM);

	return mask;
}
Ejemplo n.º 5
0
static unsigned int dvb_ca_poll (struct file *file, poll_table *wait)
{
	struct dvb_device *dvbdev = file->private_data;
	struct av7110 *av7110 = dvbdev->priv;
	struct dvb_ringbuffer *rbuf = &av7110->ci_rbuffer;
	struct dvb_ringbuffer *wbuf = &av7110->ci_wbuffer;
	unsigned int mask = 0;

	dprintk(8, "av7110:%p\n",av7110);

	poll_wait(file, &rbuf->queue, wait);
	poll_wait(file, &wbuf->queue, wait);

	if (!dvb_ringbuffer_empty(rbuf))
		mask |= (POLLIN | POLLRDNORM);

	if (dvb_ringbuffer_free(wbuf) > 1024)
		mask |= (POLLOUT | POLLWRNORM);

	return mask;
}
Ejemplo n.º 6
0
Archivo: dmxdev.c Proyecto: 274914765/C
static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
{
    struct dvb_device *dvbdev = file->private_data;
    struct dmxdev *dmxdev = dvbdev->priv;
    unsigned int mask = 0;

    dprintk("function : %s\n", __func__);

    poll_wait(file, &dmxdev->dvr_buffer.queue, wait);

    if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
        if (dmxdev->dvr_buffer.error)
            mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);

        if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer))
            mask |= (POLLIN | POLLRDNORM | POLLPRI);
    } else
        mask |= (POLLOUT | POLLWRNORM | POLLPRI);

    return mask;
}
Ejemplo n.º 7
0
Archivo: dmxdev.c Proyecto: 274914765/C
static unsigned int dvb_demux_poll(struct file *file, poll_table *wait)
{
    struct dmxdev_filter *dmxdevfilter = file->private_data;
    unsigned int mask = 0;

    if (!dmxdevfilter)
        return -EINVAL;

    poll_wait(file, &dmxdevfilter->buffer.queue, wait);

    if (dmxdevfilter->state != DMXDEV_STATE_GO &&
        dmxdevfilter->state != DMXDEV_STATE_DONE &&
        dmxdevfilter->state != DMXDEV_STATE_TIMEDOUT)
        return 0;

    if (dmxdevfilter->buffer.error)
        mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);

    if (!dvb_ringbuffer_empty(&dmxdevfilter->buffer))
        mask |= (POLLIN | POLLRDNORM | POLLPRI);

    return mask;
}