--- systemd-208/src/shared/util.c +++ systemd-208/src/shared/util.c 2014-01-30 12:23:20.094236656 +0000 @@ -2967,6 +2967,7 @@ int status_vprintf(const char *status, b struct iovec iovec[6] = {}; int n = 0; static bool prev_ephemeral; + static int cached_on_tty = -1; assert(format); @@ -2980,6 +2981,47 @@ int status_vprintf(const char *status, b if (fd < 0) return fd; + if (_unlikely_(cached_on_tty < 0)) { + cached_on_tty = isatty(fd) > 0; + if (cached_on_tty) { + const char *e = getenv("TERM"); + if (e && (strcmp(e, "dumb") == 0 || strcmp(e, "ibm327x") == 0)) + cached_on_tty = 0; + } + } + + if (status && !cached_on_tty) { + const char *esc, *ptr; + esc = strchr(status, 0x1B); + if (esc && (ptr = strpbrk(esc, "SOFDTI*"))) { + switch(*ptr) { + case 'S': + status = " SKIP "; + break; + case 'O': + status = " OK "; + break; + case 'F': + status = "FAILED"; + break; + case 'D': + status = "DEPEND"; + break; + case 'T': + status = " TIME "; + break; + case 'I': + status = " INFO "; + break; + case '*': + status = " BUSY "; + break; + default: + break; + } + } + } + if (ellipse) { char *e; size_t emax, sl; @@ -3002,8 +3044,12 @@ int status_vprintf(const char *status, b } } - if (prev_ephemeral) - IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE); + if (prev_ephemeral) { + if (cached_on_tty) + IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE); + else + IOVEC_SET_STRING(iovec[n++], "\r"); + } prev_ephemeral = ephemeral; if (status) { @@ -3267,8 +3313,14 @@ void columns_lines_cache_reset(int signu bool on_tty(void) { static int cached_on_tty = -1; - if (_unlikely_(cached_on_tty < 0)) + if (_unlikely_(cached_on_tty < 0)) { cached_on_tty = isatty(STDOUT_FILENO) > 0; + if (cached_on_tty) { + const char *e = getenv("TERM"); + if (e && (strcmp(e, "dumb") == 0 || strcmp(e, "ibm327x") == 0)) + cached_on_tty = 0; + } + } return cached_on_tty; }