| diff -ru busybox-1.17.3-orig/coreutils/echo.c busybox-1.17.3-akaros/coreutils/echo.c |
| --- busybox-1.17.3-orig/coreutils/echo.c 2015-03-06 12:06:11.732280338 -0500 |
| +++ busybox-1.17.3-akaros/coreutils/echo.c 2015-03-06 12:34:12.607118758 -0500 |
| @@ -33,6 +33,12 @@ |
| { |
| int ret; |
| const char *arg; |
| + /* In lieu of using fputs/fflush, Akaros works better with raw writes. The |
| + * main issue is that we want to have the entire echo sent as one write. |
| + * using setvbuf for line buffered mode seems to work, but fflush won't |
| + * propagate errors from the kernel. */ |
| + char write_buf[4096]; |
| + size_t buf_idx = 0; |
| #if !ENABLE_FEATURE_FANCY_ECHO |
| enum { |
| eflag = '\\', |
| @@ -100,12 +106,7 @@ |
| /* arg is already == *argv and isn't NULL */ |
| int c; |
| |
| - if (!eflag) { |
| - /* optimization for very common case */ |
| - ret = fputs(arg, stdout); |
| - if (ret == EOF) |
| - perror("echo failed"); |
| - } else while ((c = *arg++)) { |
| + while ((c = *arg++)) { |
| if (c == eflag) { /* Check for escape seq. */ |
| if (*arg == 'c') { |
| /* '\c' means cancel newline and |
| @@ -130,25 +131,27 @@ |
| c = bb_process_escape_sequence(&arg); |
| } |
| } |
| - bb_putchar(c); |
| + write_buf[buf_idx++] = c; |
| } |
| |
| arg = *++argv; |
| if (!arg) |
| break; |
| - bb_putchar(' '); |
| + write_buf[buf_idx++] = ' '; |
| } |
| |
| newline_ret: |
| if (nflag) { |
| - bb_putchar('\n'); |
| + write_buf[buf_idx++] = '\n'; |
| } |
| ret: |
| - errno = 0; |
| - ret = fflush_all(); |
| - if (errno) |
| + ret = write(1, write_buf, buf_idx); |
| + if (ret == -1) { |
| perror("echo failed"); |
| - return ret; |
| + return EOF; |
| + } else { |
| + return 0; |
| + } |
| } |
| |
| /*- |