From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Daley Subject: [PATCH v3] libvchan: tidy up usages of fcntl in select-type sample application Date: Fri, 1 Nov 2013 13:33:23 +1300 Message-ID: <1383266003-10908-1-git-send-email-mattjd@gmail.com> References: <1383256047.5436.150.camel@dagon.hellion.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1383256047.5436.150.camel@dagon.hellion.org.uk> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Ian Campbell , Stefano Stabellini , Andrew Cooper , Matthew Daley , Ian Jackson , Daniel De Graaf List-Id: xen-devel@lists.xenproject.org Namely, don't overwrite all the other flags when twiddling O_NONBLOCK, and add basic error handling. Coverity-ID: 1055041 Signed-off-by: Matthew Daley --- v2: Adjust other fcntl usage further down as well. Use F_GETFL to modify only the O_NONBLOCK flag. Both suggested by Daniel De Graaf. Improve commit message. v3: Make a new function, set_nonblocking, to do the twiddling tools/libvchan/node-select.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tools/libvchan/node-select.c b/tools/libvchan/node-select.c index 6c6c19e..13c5822 100644 --- a/tools/libvchan/node-select.c +++ b/tools/libvchan/node-select.c @@ -80,6 +80,22 @@ void stdout_wr() { } } +static int set_nonblocking(int fd, int nonblocking) { + int flags = fcntl(fd, F_GETFL); + if (flags == -1) + return -1; + + if (nonblocking) + flags |= O_NONBLOCK; + else + flags &= ~O_NONBLOCK; + + if (fcntl(fd, F_SETFL, flags) == -1) + return -1; + + return 0; +} + /** Simple libxenvchan application, both client and server. Both sides may write and read, both from the libxenvchan and from @@ -105,8 +121,10 @@ int main(int argc, char **argv) exit(1); } - fcntl(0, F_SETFL, O_NONBLOCK); - fcntl(1, F_SETFL, O_NONBLOCK); + if (set_nonblocking(0, 1) || set_nonblocking(1, 1)) { + perror("set_nonblocking"); + exit(1); + } libxenvchan_fd = libxenvchan_fd_for_select(ctrl); for (;;) { @@ -153,7 +171,10 @@ int main(int argc, char **argv) stdout_wr(); } if (!libxenvchan_is_open(ctrl)) { - fcntl(1, F_SETFL, 0); + if (set_nonblocking(1, 0)) { + perror("set_nonblocking"); + exit(1); + } while (outsiz) stdout_wr(); return 0; -- 1.7.10.4