From: Michael Tokarev Date: Tue, 17 Nov 2009 09:56:24 +0000 (+0100) Subject: batched reads for lxc_console X-Git-Tag: lxc_0_6_4~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92db2bb00ce2acebc0b9818b56238aa5afe313ff;p=thirdparty%2Flxc.git batched reads for lxc_console Instead of doing I/O one-byte-at-a-time in lxc_console, which is slow, let's do it in batches. Only for output (from container to the host system), since input is most likely one-byte-at-a-time anyway (from a keyboard). Signed-off-by: Michael Tokarev Signed-off-by: Daniel Lezcano --- diff --git a/src/lxc/lxc_console.c b/src/lxc/lxc_console.c index 8bdf6b12f..d6ba7e45c 100644 --- a/src/lxc/lxc_console.c +++ b/src/lxc/lxc_console.c @@ -141,7 +141,6 @@ int main(int argc, char *argv[]) /* let's proxy the tty */ for (;;) { - char c; struct pollfd pfd[2] = { { .fd = 0, .events = POLLIN|POLLPRI, @@ -161,6 +160,7 @@ int main(int argc, char *argv[]) /* read the "stdin" and write that to the master */ if (pfd[0].revents & POLLIN) { + char c; if (read(0, &c, 1) < 0) { SYSERROR("failed to read"); goto out_err; @@ -188,12 +188,14 @@ int main(int argc, char *argv[]) /* read the master and write to "stdout" */ if (pfd[1].revents & POLLIN) { - if (read(master, &c, 1) < 0) { + char buf[1024]; + int r; + r = read(master, buf, sizeof(buf)); + if (r < 0) { SYSERROR("failed to read"); goto out_err; } - printf("%c", c); - fflush(stdout); + write(1, buf, r); } } out: