From: Michal Schmidt Date: Wed, 27 Feb 2013 21:52:43 +0000 (+0100) Subject: util, core: add support for ephemeral status lines X-Git-Tag: v198~156 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=984a2be450abac81474889b8bea4b3fbeddb26c5;ds=sidebyside util, core: add support for ephemeral status lines Ephemeral status lines do not end with a newline and they expect to be overwritten by the next printed status line. --- diff --git a/src/core/job.c b/src/core/job.c index 9f792b84f..90de55001 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -649,7 +649,7 @@ static void job_print_status_message(Unit *u, JobType t, JobResult result) { case JOB_FAILED: unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON "FAILED" ANSI_HIGHLIGHT_OFF, format); - manager_status_printf(u->manager, NULL, "See 'systemctl status %s' for details.", u->id); + manager_status_printf(u->manager, false, NULL, "See 'systemctl status %s' for details.", u->id); break; case JOB_DEPENDENCY: diff --git a/src/core/manager.c b/src/core/manager.c index 1dac69b79..c6f13f7d5 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2494,7 +2494,7 @@ static bool manager_get_show_status(Manager *m) { return plymouth_running(); } -void manager_status_printf(Manager *m, const char *status, const char *format, ...) { +void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) { va_list ap; if (!manager_get_show_status(m)) @@ -2504,7 +2504,7 @@ void manager_status_printf(Manager *m, const char *status, const char *format, . return; va_start(ap, format); - status_vprintf(status, true, format, ap); + status_vprintf(status, true, ephemeral, format, ap); va_end(ap); } diff --git a/src/core/manager.h b/src/core/manager.h index d21f27dfd..0d0255289 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -293,6 +293,6 @@ void manager_undo_generators(Manager *m); void manager_recheck_journal(Manager *m); void manager_set_show_status(Manager *m, bool b); -void manager_status_printf(Manager *m, const char *status, const char *format, ...); +void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...); void watch_init(Watch *w); diff --git a/src/shared/util.c b/src/shared/util.c index f5adedc53..cc415894a 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -2859,12 +2859,13 @@ cpu_set_t* cpu_set_malloc(unsigned *ncpus) { } } -int status_vprintf(const char *status, bool ellipse, const char *format, va_list ap) { +int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) { static const char status_indent[] = " "; /* "[" STATUS "] " */ _cleanup_free_ char *s = NULL; _cleanup_close_ int fd = -1; - struct iovec iovec[5]; + struct iovec iovec[6]; int n = 0; + static bool prev_ephemeral; assert(format); @@ -2902,6 +2903,10 @@ int status_vprintf(const char *status, bool ellipse, const char *format, va_list zero(iovec); + if (prev_ephemeral) + IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE); + prev_ephemeral = ephemeral; + if (status) { if (!isempty(status)) { IOVEC_SET_STRING(iovec[n++], "["); @@ -2912,7 +2917,8 @@ int status_vprintf(const char *status, bool ellipse, const char *format, va_list } IOVEC_SET_STRING(iovec[n++], s); - IOVEC_SET_STRING(iovec[n++], "\n"); + if (!ephemeral) + IOVEC_SET_STRING(iovec[n++], "\n"); if (writev(fd, iovec, n) < 0) return -errno; @@ -2920,14 +2926,14 @@ int status_vprintf(const char *status, bool ellipse, const char *format, va_list return 0; } -int status_printf(const char *status, bool ellipse, const char *format, ...) { +int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) { va_list ap; int r; assert(format); va_start(ap, format); - r = status_vprintf(status, ellipse, format, ap); + r = status_vprintf(status, ellipse, ephemeral, format, ap); va_end(ap); return r; diff --git a/src/shared/util.h b/src/shared/util.h index 19cc36af8..f8957bca4 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -59,6 +59,7 @@ union dirent_storage { #define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m" #define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m" #define ANSI_HIGHLIGHT_OFF "\x1B[0m" +#define ANSI_ERASE_TO_END_OF_LINE "\x1B[K" size_t page_size(void); #define PAGE_ALIGN(l) ALIGN_TO((l), page_size()) @@ -354,8 +355,8 @@ int pipe_eof(int fd); cpu_set_t* cpu_set_malloc(unsigned *ncpus); -int status_vprintf(const char *status, bool ellipse, const char *format, va_list ap); -int status_printf(const char *status, bool ellipse, const char *format, ...); +int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap); +int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...); int status_welcome(void); int fd_columns(int fd);