This makes it possible to poll a local device. Getting the fd is preferrable to adding a dvb_dev_poll() function, because we can poll several fds together in an event-based program. This is not implemented for remote devices, as polling a remote fd does not make sense. We could instead return the socket to know when to expect messages from the remote device, but the current implementation in dvb-dev-remote.c already runs a thread to receive remote messages as soon as possible. --- Note, after reading README, I did not bump the library version. Comments welcome lib/include/libdvbv5/dvb-dev.h | 12 ++++++++++++ lib/libdvbv5/dvb-dev-local.c | 6 ++++++ lib/libdvbv5/dvb-dev-priv.h | 1 + lib/libdvbv5/dvb-dev.c | 11 +++++++++++ 4 files changed, 30 insertions(+) diff --git a/lib/include/libdvbv5/dvb-dev.h b/lib/include/libdvbv5/dvb-dev.h index 98bee5e7..55e0f065 100644 --- a/lib/include/libdvbv5/dvb-dev.h +++ b/lib/include/libdvbv5/dvb-dev.h @@ -289,6 +289,18 @@ struct dvb_open_descriptor *dvb_dev_open(struct dvb_device *dvb, */ void dvb_dev_close(struct dvb_open_descriptor *open_dev); +/** + * @brief returns fd from a local device + * This will not work for remote devices. + * @ingroup dvb_device + * + * @param open_dev Points to the struct dvb_open_descriptor + * + * @return On success, returns the fd. + * Returns -1 on error. + */ +int dvb_dev_get_fd(struct dvb_open_descriptor *open_dev); + /** * @brief read from a dvb demux or dvr file * @ingroup dvb_device diff --git a/lib/libdvbv5/dvb-dev-local.c b/lib/libdvbv5/dvb-dev-local.c index b50b61b4..eb2f0775 100644 --- a/lib/libdvbv5/dvb-dev-local.c +++ b/lib/libdvbv5/dvb-dev-local.c @@ -775,6 +775,11 @@ static void dvb_dev_local_free(struct dvb_device_priv *dvb) free(priv); } +static int dvb_local_get_fd(struct dvb_open_descriptor *open_dev) +{ + return open_dev->fd; +} + /* Initialize for local usage */ void dvb_dev_local_init(struct dvb_device_priv *dvb) { @@ -788,6 +793,7 @@ void dvb_dev_local_init(struct dvb_device_priv *dvb) ops->stop_monitor = dvb_local_stop_monitor; ops->open = dvb_local_open; ops->close = dvb_local_close; + ops->get_fd = dvb_local_get_fd; ops->dmx_stop = dvb_local_dmx_stop; ops->set_bufsize = dvb_local_set_bufsize; diff --git a/lib/libdvbv5/dvb-dev-priv.h b/lib/libdvbv5/dvb-dev-priv.h index e05fcad2..2e69f766 100644 --- a/lib/libdvbv5/dvb-dev-priv.h +++ b/lib/libdvbv5/dvb-dev-priv.h @@ -72,6 +72,7 @@ struct dvb_dev_ops { int (*fe_get_stats)(struct dvb_v5_fe_parms *p); void (*free)(struct dvb_device_priv *dvb); + int (*get_fd)(struct dvb_open_descriptor *dvb); }; struct dvb_device_priv { diff --git a/lib/libdvbv5/dvb-dev.c b/lib/libdvbv5/dvb-dev.c index 7e2da1fb..447c9fd5 100644 --- a/lib/libdvbv5/dvb-dev.c +++ b/lib/libdvbv5/dvb-dev.c @@ -218,6 +218,17 @@ struct dvb_open_descriptor *dvb_dev_open(struct dvb_device *d, return ops->open(dvb, sysname, flags); } +int dvb_dev_get_fd(struct dvb_open_descriptor *open_dev) +{ + struct dvb_device_priv *dvb = (void *)open_dev; + struct dvb_dev_ops *ops = &dvb->ops; + + if (!ops->get_fd) + return -1; + + return ops->get_fd(open_dev); +} + void dvb_dev_close(struct dvb_open_descriptor *open_dev) { struct dvb_device_priv *dvb = open_dev->dvb; -- 2.14.1