Hi,
I believe I found a bug in the Xenomai Posix skin while trying to use
boost::asio: The accept() call in asychronous mode
fails with ENOPEM instead of EAGAIN. Other than that, the call 'works'
in the sense that calling it again after a connection is established
returns a new file descriptor.
I'm running xenomai rev 50ee47db78117e8711d4d2f5310dff262a425eb7 with
kernel 2.6.31 i686.
Xenomai is built with no option (other than --enable-shared
--disable-static) to configure.
I'm joining a simple C file to reproduce the problem.
Its output when built 'natively', and running nc localhost 12345 after
some time is:
-1 11
accept: Resource temporarily unavailable
-1 11
accept: Resource temporarily unavailable
...
OK 4
Its output when built using the posix skin and run as root is:
-1 1
accept: Operation not permitted
-1 1
accept: Operation not permitted
...
OK 4
The consequence of this bug is that all applications doing asynchronous
accept() calls will fail to work, as they will incorrectly believe the
operation failed.
Regards,
Matthieu
#include sys/types.h /* See NOTES */
#include sys/socket.h
#include sys/ioctl.h
#include netinet/in.h
#include netinet/tcp.h
#include string.h
#include stdio.h
#include errno.h
#include unistd.h
#include sys/mman.h
int main()
{
int s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
int t = 1;
int res;
struct sockaddr_in sa;
mlockall(MCL_PRESENT | MCL_FUTURE);
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, t, sizeof(int)))
perror(setsockopt);
memset(sa, 0, sizeof (sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(12345);
sa.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *)sa, sizeof(sa)))
perror(bind);
if (listen(s, 128))
perror(listen);
t = 1;
if (ioctl(s, FIONBIO, t))
perror(ioctl);
do {
res = accept(s, 0, 0);
printf(%d %d\n, (int)res, (int)errno);
perror(accept);
usleep(50);
} while(res==-1);
printf(OK %d\n, (int)res);
return 0;
}
config-2.6.31-xenomai.gz
Description: GNU Zip compressed data
___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core