blob: 9212a2d698d1f3da72aa4e25645973bfe39c7c74 [file] [log] [blame]
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;
+ }
}
/*-