Date: Fri, 10 Feb 2012 22:16:18 +0000 (UTC) From: Martin Cracauer <cracauer@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r231449 - head/usr.bin/tee Message-ID: <201202102216.q1AMGI0m098192@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: cracauer Date: Fri Feb 10 22:16:17 2012 New Revision: 231449 URL: http://svn.freebsd.org/changeset/base/231449 Log: Fix bin/164947: tee looses data when writing to non-blocking file descriptors tee was not handling EAGAIN patch submitted by Diomidis Spinellis <dds@aueb.gr>. Thanks so much reproduced and re-tested locally Modified: head/usr.bin/tee/tee.c Modified: head/usr.bin/tee/tee.c ============================================================================== --- head/usr.bin/tee/tee.c Fri Feb 10 22:14:34 2012 (r231448) +++ head/usr.bin/tee/tee.c Fri Feb 10 22:16:17 2012 (r231449) @@ -42,8 +42,10 @@ static const char rcsid[] = #endif /* not lint */ #include <sys/types.h> +#include <sys/select.h> #include <sys/stat.h> #include <err.h> +#include <errno.h> #include <fcntl.h> #include <signal.h> #include <stdio.h> @@ -60,6 +62,7 @@ static LIST *head; static void add(int, const char *); static void usage(void); +static void waitfor(int fd); int main(int argc, char *argv[]) @@ -106,9 +109,14 @@ main(int argc, char *argv[]) bp = buf; do { if ((wval = write(p->fd, bp, n)) == -1) { - warn("%s", p->name); - exitval = 1; - break; + if (errno == EAGAIN) { + waitfor(p->fd); + wval = 0; + } else { + warn("%s", p->name); + exitval = 1; + break; + } } bp += wval; } while (n -= wval); @@ -137,3 +145,15 @@ add(int fd, const char *name) p->next = head; head = p; } + +/* Wait for the specified fd to be ready for writing */ +static void +waitfor(int fd) +{ + fd_set writefds; + + FD_ZERO(&writefds); + FD_SET(fd, &writefds); + if (select(fd + 1, NULL, &writefds, NULL, NULL) == -1) + err(1, "select"); +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202102216.q1AMGI0m098192>