diff --git a/CHANGES b/CHANGES index 2950b31..aeeb398 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,10 @@ Corrections: input lines. Changed Socat to explicitly print the newline in this case. +Features: + POSIXMQ-RECV now takes option o-nonblock; this, in combination with -T, + makes it possible to terminate Socat in case the queue is empty. + Building: Disabling certain features during configure could break build process. diff --git a/doc/socat.yo b/doc/socat.yo index 747f915..30c2bb0 100644 --- a/doc/socat.yo +++ b/doc/socat.yo @@ -332,7 +332,7 @@ label(ADDRESS_DCCP_CONNECT)dit(bf(tt(DCCP-CONNECT:<host>:<port>)) (bf(tt(DCCP:<h link(connect-timeout)(OPTION_CONNECT_TIMEOUT), link(tos)(OPTION_TOS), link(dccp-set-ccid)(OPTION_DCCP_SET_CCID), - link(nonblock)(OPTION_NONBLOCK), + link(nonblock)(OPTION_O_NONBLOCK), link(sourceport)(OPTION_SOURCEPORT), link(retry)(OPTION_RETRY), link(readbytes)(OPTION_READBYTES)nl() @@ -747,7 +747,7 @@ label(ADDRESS_NAMED_PIPE)dit(bf(tt(PIPE:<filename>))) Option groups: link(FD)(GROUP_FD),link(NAMED)(GROUP_NAMED),link(OPEN)(GROUP_OPEN) nl() Useful options: link(rdonly)(OPTION_RDONLY), - link(nonblock)(OPTION_NONBLOCK), + link(nonblock)(OPTION_O_NONBLOCK), link(group)(OPTION_GROUP), link(user)(OPTION_USER), link(mode)(OPTION_MODE), @@ -784,7 +784,8 @@ label(ADDRESS_POSIXMQ_READ)dit(bf(tt(POSIXMQ-READ:/<mqueue>))) Useful options: link(posixmq-priority)(OPTION_POSIXMQ_PRIORITY), link(unlink-early)(OPTION_UNLINK_EARLY), - link(unlink-close)(OPTION_UNLINK_CLOSE) + link(unlink-close)(OPTION_UNLINK_CLOSE), + link(o-nonblock)(OPTION_O_NONBLOCK) label(ADDRESS_POSIXMQ_RECEIVE)dit(bf(tt(POSIXMQ-RECEIVE:/<mqueue>))) dit(bf(tt(POSIXMQ-RECV:/<mqueue>))) @@ -882,7 +883,7 @@ label(ADDRESS_SCTP_CONNECT)dit(bf(tt(SCTP-CONNECT:<host>:<port>))) link(mtudiscover)(OPTION_MTUDISCOVER), link(sctp-maxseg)(OPTION_SCTP_MAXSEG), link(sctp-nodelay)(OPTION_SCTP_NODELAY), - link(nonblock)(OPTION_NONBLOCK), + link(nonblock)(OPTION_O_NONBLOCK), link(sourceport)(OPTION_SOURCEPORT), link(retry)(OPTION_RETRY), link(readbytes)(OPTION_READBYTES)nl() @@ -1234,7 +1235,7 @@ label(ADDRESS_TCP_CONNECT)dit(bf(tt(TCP:<host>:<port>))) link(mtudiscover)(OPTION_MTUDISCOVER), link(mss)(OPTION_MSS), link(nodelay)(OPTION_TCP_NODELAY), - link(nonblock)(OPTION_NONBLOCK), + link(nonblock)(OPTION_O_NONBLOCK), link(readbytes)(OPTION_READBYTES)nl() See also: link(TCP4)(ADDRESS_TCP4_CONNECT), @@ -1853,7 +1854,7 @@ label(OPTION_APPEND)dit(bf(tt(append[=<bool>]))) socat() uses the code(O_APPEND) flag with the code(open()) system call (link(example)(EXAMPLE_OPTION_APPEND)). Otherwise, socat() applies the code(fcntl(fd, F_SETFL, O_APPEND)) call. -label(OPTION_NONBLOCK)dit(bf(tt(nonblock[=<bool>]))) +label(OPTION_O_NONBLOCK)dit(bf(tt(nonblock[=<bool>]))) Tries to open or use file in nonblocking mode. Its only effects are that the code(connect()) call of TCP addresses does not block, and that opening a named pipe for reading does not block. @@ -1988,7 +1989,7 @@ E.g., option `creat' sets the code(O_CREAT) flag. When the used address does not use code(open()) (e.g.STDIO), the code(fcntl(..., F_SETFL, ...)) call is used instead.nl() See also options link(append)(OPTION_APPEND) and -link(nonblock)(OPTION_NONBLOCK). +link(nonblock)(OPTION_O_NONBLOCK). startdit() label(OPTION_O_CREAT)dit(bf(tt(creat[=<bool>]))) Creates the file if it does not exist (link(example)(EXAMPLE_OPTION_CREAT)). @@ -3973,7 +3974,7 @@ prompts. label(EXAMPLE_ADDRESS_PTY) label(EXAMPLE_OPTION_SYMBOLIC_LINK) label(EXAMPLE_OPTION_WAIT_SLAVE) -label(EXAMPLE_OPTION_NONBLOCK) +label(EXAMPLE_OPTION_O_NONBLOCK) mancommand(\.LP) mancommand(\.nf) mancommand(\fBsocat \\) diff --git a/xio-posixmq.c b/xio-posixmq.c index 186e932..f80b303 100644 --- a/xio-posixmq.c +++ b/xio-posixmq.c @@ -45,6 +45,7 @@ static int xioopen_posixmq( int dirs = addrdesc->arg1; int oneshot = addrdesc->arg2; bool opt_unlink_early = false; + bool nonblock; int oflag; bool opt_o_excl = false; mode_t opt_mode = 0666; @@ -113,6 +114,8 @@ static int xioopen_posixmq( case XIO_RDONLY: oflag |= O_RDONLY; break; case XIO_WRONLY: oflag |= O_WRONLY; break; } + if (retropt_bool(opts, OPT_O_NONBLOCK, &nonblock) >= 0 && nonblock) + oflag |= O_NONBLOCK; /* Now open the message queue */ Debug3("mq_open(\"%s\", %d, "F_mode", NULL)", name, oflag, opt_mode); @@ -155,6 +158,8 @@ static int xioopen_posixmq( do { struct pollfd pollfd; + if (oflag & O_NONBLOCK) + break; pollfd.fd = sfd->fd; pollfd.events = (dirs==XIO_RDONLY?POLLIN:POLLOUT); if (xiopoll(&pollfd, 1, NULL) > 0) {