diff --git a/io.h b/io.h index 505e2d8..0f3c370 100644 --- a/io.h +++ b/io.h @@ -77,6 +77,8 @@ void* io_getcookie(int64 d); /* put descriptor in non-blocking mode */ void io_nonblock(int64 d); +/* put descriptor in blocking mode */ +void io_block(int64 d); /* put descriptor in close-on-exec mode */ void io_closeonexec(int64 d); diff --git a/io/io_block.3 b/io/io_block.3 new file mode 100644 index 0000000..b5fd11e --- /dev/null +++ b/io/io_block.3 @@ -0,0 +1,15 @@ +.TH io_block 3 +.SH NAME +io_block \- switch to blocking I/O +.SH SYNTAX +.B #include + +void \fBio_block\fP(int64 fd); +.SH DESCRIPTION +io_block puts UNIX descriptor fd into ``blocking mode.'' + +File descriptors are normally in blocking mode, except if they come from +accept() or io_accept() and the listening socket was in non-blocking +mode. +.SH "SEE ALSO" +io_nonblock(3) diff --git a/io/io_block.c b/io/io_block.c new file mode 100644 index 0000000..1deb265 --- /dev/null +++ b/io/io_block.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include "io_internal.h" + +#ifdef __MINGW32__ +#include +#include "windoze.h" +#endif + +#ifndef O_NDELAY +#define O_NDELAY O_NONBLOCK +#endif + +void io_block(int64 d) { + io_entry* e=array_get(&io_fds,sizeof(io_entry),d); +#ifdef __MINGW32__ + unsigned long i=0; + if (ioctlsocket( d, FIONBIO, &i)==0) + if (e) e->nonblock=0; +#else + if (fcntl(d,F_SETFL,fcntl(d,F_GETFL,0) & ~O_NDELAY)==0) + if (e) e->nonblock=0; +#endif +}