Hello Xenomai group,
We're in the process of moving from Xenomai 3.0.7/4.1.18 to
3.1/4.14.85. Testing one of our apps we found that select() was
returning -1 with errno == EADV. This app was written before we knew
about the recommendation from Philippe contained in this message:
https://xenomai.org/pipermail/xenomai/2019-August/041435.html
We're not mixing Linux/Xenomai descriptors in the select set, the fd's
(4 of them in this case) are all pointing to Linux FIFOs
(/dev/somename{1..4}), and we'll ultimately start using __STD(select)
like the above msg says we should (until this was found we were unaware
of the importance of using __STD(select)).
But my reason for posting is my confusion about the EADV return. The
message says:
>>> Switch from -EBADF to -EADV to notify userland that RTDM does not
>>> manage a file descriptor, which cannot conflict with any sensible
>>> error code the Cobalt core or any RTDM driver may return.
But also says:
> We still want to receive -EBADF on wrong fildes appearing in select()
> descriptors.
Taking both of those into account, I looked at the code in
lib/cobalt/select.c which implements the glibc fallback:
if (err == -EBADF || err == -EPERM || err == -ENOSYS)
return __STD(select(__nfds, __readfds,
__writefds, __exceptfds, __timeout));
In the specific case of our app, had the above code included a check for
-EADV, things would operate as they did under 3.0.7. However, the
statement "still want to receive -EBADF on wrong fildes appearing in
select" suggests that the check for -EADV shouldn't be necessary. There
must be something at a lower level that is returning -EADV instead of
-EBADF when faced with a Linux FIFO fd, or, if -EADV is appropriate then
it seems adding a check for -EADV along with -EBADF, -EPERM, and -ENOSYS
is also appropriate if backwards compatibility is desired for select().
Thank you,
Best regards,
Steve