--- getty-generator/getty-generator.c | 31 ++++++++++++++++++- shared/util.c | 62 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 4 deletions(-) --- systemd-208/src/shared/util.c +++ systemd-208/src/shared/util.c 2014-01-31 11:54:07.222235280 +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,51 @@ 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)) { + char *mode = NULL; + int r = parse_env_file("/proc/cmdline", WHITESPACE, "conmode", &mode, NULL); + if (r < 0 || !mode || !streq(mode, "3270")) + 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 +3048,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 +3317,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)) + cached_on_tty = 0; + } + } return cached_on_tty; } --- systemd-208/src/getty-generator/getty-generator.c +++ systemd-208/src/getty-generator/getty-generator.c 2014-01-31 13:28:44.802235532 +0000 @@ -144,14 +144,43 @@ int main(int argc, char *argv[]) { continue; } + if (strncmp(tty, "3270/tty", 8) == 0) { + int index; + + k = safe_atoi(tty+8, &index); + free(tty); + + if (k < 0) + continue; + + index++; + if (asprintf(&tty, "3270/tty%d", index) < 0) { + log_oom(); + free(active); + r = EXIT_FAILURE; + goto finish; + } + + k = add_serial_getty(tty); + free(tty); + + if (k < 0) { + free(active); + r = EXIT_FAILURE; + goto finish; + } + + continue; + } + /* We assume that gettys on virtual terminals are * started via manual configuration and do this magic * only for non-VC terminals. */ k = add_serial_getty(tty); + free(tty); if (k < 0) { - free(tty); free(active); r = EXIT_FAILURE; goto finish;