Pseudo-device driver & select ??
Aziz Kezzou
french.linuxian at gmail.com
Thu May 26 18:00:49 PDT 2005
> >
> > Aziz Kezzou wrote:
> > > Hi all,
> > > I am trying to implement a small kld pseudo-device driver on FreeBSD 5.3 that
> > > behaves just like a socket with regards to the select system call.
> > >
> > > Currently, I am using the sample echo pseudo-device driver from
> > > http://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/driverbasics-char.html
> > > as an example. However, whenever I call select on the file
> > > descriptor of "/dev/echo" it always returns even when there is no data
> > > to be read.
> > >
> > > I looked at the socket code and it looks like I need to provide my own
> > > "fo_select" function in the fileops data structure. Am i right ? How
> > > do I do that ? The sample echo pseudo-device driver above uses
> > > "struct cdevsw" instead...
> > >
> > > Thanks
> > > -aziz
> > > _______________________________________________
> > > freebsd-net at freebsd.org mailing list
> > > http://lists.freebsd.org/mailman/listinfo/freebsd-net
> > > To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
> > >
> > >
> > look at spec_poll()
> > I beleive that when your device is opened the fileops{} will
> > point to the spec ops and you're code will be entered via
> > spec_poll() - now you just need to implement the poll/select notion
> > for your device.
> >
>
> Thanks,
> Actually, il turned out to be very simple.
> I needed only to provide a "d_poll" function as part of the structure
> cdevsw, as follows :
>
> /* Character device entry points */
> static struct cdevsw echo_cdevsw = {
> .d_version = D_VERSION,
> .d_open = echo_open,
> .d_close = echo_close,
> .d_read = echo_read,
> .d_write = echo_write,
> .d_poll = echo_poll,
> .d_name = "echo",
> };
>
> with echo_poll :
> static int
> echo_poll(struct cdev *dev, int events, struct thread *td)
> {
>
> uprintf( "echo_poll called : data_available = %d!\n", data_available );
> if(data_available == 0)
> return 0;
> data_available = 0;
> return 1;
> }
>
Now the question is, if I don't have any data available when select
(i.e d_poll ) is called, how do I notify select when data arrives ?
looks like "d_poll" is called only once (the name is a bit misleading
here ;-) , isn't it ?
Any hints ?
Thanks.
-aziz
More information about the freebsd-net
mailing list