Allow fcntl() to handle O_NONBLOCK (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 21 Jul 2015 20:23:09 +0000 (16:23 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 24 Jul 2015 07:39:22 +0000 (03:39 -0400)
commitfbd3df7adf1737a5fe30d04988a3d443fe338b0b
tree6709b2b847dd8030602530852c59e3563978c432
parentd2d005125153f909016c27a5648094ff10fcfb89
Allow fcntl() to handle O_NONBLOCK (XCC)

Unfortunately, the only way to change the non-blocking nature of a BSD
socket is with fcntl.  You can't use setsockopt() for some reason.

This commit allows fcntl() to intercept O_NONBLOCK in setfl and getfl,
handling it in userspace for socket FDs.

This will have no effect on regular files, so if you try to do a
O_NONBLOCK on, say, a regular #I FD that wasn't created with the socket
shims, the kernel will give you an error: use a ctl message.  The
purpose of this change is to provide BSD sockets compatibility, not to
provide an alternative interface to #I.

Note that the initial ctl from a cloned conversation (i.e. freshly
created) may have O_NONBLOCK set on it's chan flags, and you can read
this via getfl().  If you do a read-modify-write on the flags, the
kernel will not complain.  It only complains when you try to *change*
O_NONBLOCK on a file/chan.

Rebuild glibc.
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/fcntl-ext.c