|
Michal Schmidt |
e43452 |
From 36318b0838442ef35fff111910d5657c20f1a71c Mon Sep 17 00:00:00 2001
|
|
Michal Schmidt |
e43452 |
From: Lennart Poettering <lennart@poettering.net>
|
|
Michal Schmidt |
e43452 |
Date: Thu, 5 Jan 2012 03:24:39 +0100
|
|
Michal Schmidt |
e43452 |
Subject: [PATCH 112/126] util: when printing status updates during boot, take
|
|
Michal Schmidt |
e43452 |
terminal width into account (cherry picked from
|
|
Michal Schmidt |
e43452 |
commit 81beb7508e72b29ae7cec60b50231cbe0c1d582e)
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
Conflicts:
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
src/util.c
|
|
Michal Schmidt |
e43452 |
src/util.h
|
|
Michal Schmidt |
e43452 |
---
|
|
Michal Schmidt |
e43452 |
src/unit.c | 18 +-----------
|
|
Michal Schmidt |
e43452 |
src/util.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
|
|
Michal Schmidt |
e43452 |
src/util.h | 7 +++--
|
|
Michal Schmidt |
e43452 |
3 files changed, 75 insertions(+), 37 deletions(-)
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
diff --git a/src/unit.c b/src/unit.c
|
|
Michal Schmidt |
e43452 |
index 03c90f5..dea8f4a 100644
|
|
Michal Schmidt |
e43452 |
--- a/src/unit.c
|
|
Michal Schmidt |
e43452 |
+++ b/src/unit.c
|
|
Michal Schmidt |
e43452 |
@@ -2441,9 +2441,6 @@ int unit_coldplug(Unit *u) {
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
void unit_status_printf(Unit *u, const char *status, const char *format, ...) {
|
|
Michal Schmidt |
e43452 |
va_list ap;
|
|
Michal Schmidt |
e43452 |
- char *s, *e;
|
|
Michal Schmidt |
e43452 |
- int err;
|
|
Michal Schmidt |
e43452 |
- const unsigned emax = status ? 80 - (sizeof("[ OK ]")-1) : 80;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
assert(u);
|
|
Michal Schmidt |
e43452 |
assert(format);
|
|
Michal Schmidt |
e43452 |
@@ -2458,21 +2455,8 @@ void unit_status_printf(Unit *u, const char *status, const char *format, ...) {
|
|
Michal Schmidt |
e43452 |
return;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
va_start(ap, format);
|
|
Michal Schmidt |
e43452 |
- err = vasprintf(&s, format, ap);
|
|
Michal Schmidt |
e43452 |
+ status_vprintf(status, format, ap);
|
|
Michal Schmidt |
e43452 |
va_end(ap);
|
|
Michal Schmidt |
e43452 |
- if (err < 0)
|
|
Michal Schmidt |
e43452 |
- return;
|
|
Michal Schmidt |
e43452 |
-
|
|
Michal Schmidt |
e43452 |
- e = ellipsize(s, emax, 100);
|
|
Michal Schmidt |
e43452 |
- free(s);
|
|
Michal Schmidt |
e43452 |
- if (!e)
|
|
Michal Schmidt |
e43452 |
- return;
|
|
Michal Schmidt |
e43452 |
-
|
|
Michal Schmidt |
e43452 |
- if (status)
|
|
Michal Schmidt |
e43452 |
- status_printf("%s%*s[%s]\n", e, emax - strlen(e), "", status);
|
|
Michal Schmidt |
e43452 |
- else
|
|
Michal Schmidt |
e43452 |
- status_printf("%s\n", e);
|
|
Michal Schmidt |
e43452 |
- free(e);
|
|
Michal Schmidt |
e43452 |
}
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
bool unit_need_daemon_reload(Unit *u) {
|
|
Michal Schmidt |
e43452 |
diff --git a/src/util.c b/src/util.c
|
|
Michal Schmidt |
e43452 |
index da71e4d..9ed7d13 100644
|
|
Michal Schmidt |
e43452 |
--- a/src/util.c
|
|
Michal Schmidt |
e43452 |
+++ b/src/util.c
|
|
Michal Schmidt |
e43452 |
@@ -3531,9 +3531,12 @@ cpu_set_t* cpu_set_malloc(unsigned *ncpus) {
|
|
Michal Schmidt |
e43452 |
}
|
|
Michal Schmidt |
e43452 |
}
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
-void status_vprintf(const char *format, va_list ap) {
|
|
Michal Schmidt |
e43452 |
- char *s = NULL;
|
|
Michal Schmidt |
e43452 |
- int fd = -1;
|
|
Michal Schmidt |
e43452 |
+void status_vprintf(const char *status, const char *format, va_list ap) {
|
|
Michal Schmidt |
e43452 |
+ char *s = NULL, *spaces = NULL, *e;
|
|
Michal Schmidt |
e43452 |
+ int fd = -1, c;
|
|
Michal Schmidt |
e43452 |
+ size_t emax, sl, left;
|
|
Michal Schmidt |
e43452 |
+ struct iovec iovec[5];
|
|
Michal Schmidt |
e43452 |
+ int n = 0;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
assert(format);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
@@ -3543,25 +3546,65 @@ void status_vprintf(const char *format, va_list ap) {
|
|
Michal Schmidt |
e43452 |
if (vasprintf(&s, format, ap) < 0)
|
|
Michal Schmidt |
e43452 |
goto finish;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
- if ((fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0)
|
|
Michal Schmidt |
e43452 |
+ fd = open_terminal("/dev/tty", O_WRONLY|O_NOCTTY|O_CLOEXEC);
|
|
Michal Schmidt |
e43452 |
+ if (fd < 0)
|
|
Michal Schmidt |
e43452 |
goto finish;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
- write(fd, s, strlen(s));
|
|
Michal Schmidt |
e43452 |
+ c = fd_columns(fd);
|
|
Michal Schmidt |
e43452 |
+ if (c <= 0)
|
|
Michal Schmidt |
e43452 |
+ c = 80;
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ if (status) {
|
|
Michal Schmidt |
e43452 |
+ sl = 2 + 6 + 1; /* " [" status "]" */
|
|
Michal Schmidt |
e43452 |
+ emax = (size_t) c > sl ? c - sl - 1 : 0;
|
|
Michal Schmidt |
e43452 |
+ } else
|
|
Michal Schmidt |
e43452 |
+ emax = c - 1;
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ e = ellipsize(s, emax, 75);
|
|
Michal Schmidt |
e43452 |
+ if (e) {
|
|
Michal Schmidt |
e43452 |
+ free(s);
|
|
Michal Schmidt |
e43452 |
+ s = e;
|
|
Michal Schmidt |
e43452 |
+ }
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ zero(iovec);
|
|
Michal Schmidt |
e43452 |
+ IOVEC_SET_STRING(iovec[n++], s);
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ sl = strlen(s);
|
|
Michal Schmidt |
e43452 |
+ left = emax > sl ? emax - sl : 0;
|
|
Michal Schmidt |
e43452 |
+ if (left > 0) {
|
|
Michal Schmidt |
e43452 |
+ spaces = malloc(left);
|
|
Michal Schmidt |
e43452 |
+ if (spaces) {
|
|
Michal Schmidt |
e43452 |
+ memset(spaces, ' ', left);
|
|
Michal Schmidt |
e43452 |
+ iovec[n].iov_base = spaces;
|
|
Michal Schmidt |
e43452 |
+ iovec[n].iov_len = left;
|
|
Michal Schmidt |
e43452 |
+ n++;
|
|
Michal Schmidt |
e43452 |
+ }
|
|
Michal Schmidt |
e43452 |
+ }
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ if (status) {
|
|
Michal Schmidt |
e43452 |
+ IOVEC_SET_STRING(iovec[n++], " [");
|
|
Michal Schmidt |
e43452 |
+ IOVEC_SET_STRING(iovec[n++], status);
|
|
Michal Schmidt |
e43452 |
+ IOVEC_SET_STRING(iovec[n++], "]\n");
|
|
Michal Schmidt |
e43452 |
+ } else
|
|
Michal Schmidt |
e43452 |
+ IOVEC_SET_STRING(iovec[n++], "\n");
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ writev(fd, iovec, n);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
finish:
|
|
Michal Schmidt |
e43452 |
free(s);
|
|
Michal Schmidt |
e43452 |
+ free(spaces);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
if (fd >= 0)
|
|
Michal Schmidt |
e43452 |
close_nointr_nofail(fd);
|
|
Michal Schmidt |
e43452 |
}
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
-void status_printf(const char *format, ...) {
|
|
Michal Schmidt |
e43452 |
+void status_printf(const char *status, const char *format, ...) {
|
|
Michal Schmidt |
e43452 |
va_list ap;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
assert(format);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
va_start(ap, format);
|
|
Michal Schmidt |
e43452 |
- status_vprintf(format, ap);
|
|
Michal Schmidt |
e43452 |
+ status_vprintf(status, format, ap);
|
|
Michal Schmidt |
e43452 |
va_end(ap);
|
|
Michal Schmidt |
e43452 |
}
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
@@ -3718,7 +3761,8 @@ void status_welcome(void) {
|
|
Michal Schmidt |
e43452 |
if (!ansi_color && !const_color)
|
|
Michal Schmidt |
e43452 |
const_color = "1";
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
- status_printf("\nWelcome to \x1B[%sm%s\x1B[0m!\n\n",
|
|
Michal Schmidt |
e43452 |
+ status_printf(NULL,
|
|
Michal Schmidt |
e43452 |
+ "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
|
|
Michal Schmidt |
e43452 |
const_color ? const_color : ansi_color,
|
|
Michal Schmidt |
e43452 |
const_pretty ? const_pretty : pretty_name);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
@@ -3860,23 +3904,32 @@ char **replace_env_argv(char **argv, char **env) {
|
|
Michal Schmidt |
e43452 |
return r;
|
|
Michal Schmidt |
e43452 |
}
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
-int columns(void) {
|
|
Michal Schmidt |
e43452 |
+int fd_columns(int fd) {
|
|
Michal Schmidt |
e43452 |
+ struct winsize ws;
|
|
Michal Schmidt |
e43452 |
+ zero(ws);
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
|
|
Michal Schmidt |
e43452 |
+ return -errno;
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ if (ws.ws_col <= 0)
|
|
Michal Schmidt |
e43452 |
+ return -EIO;
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+ return ws.ws_col;
|
|
Michal Schmidt |
e43452 |
+}
|
|
Michal Schmidt |
e43452 |
+
|
|
Michal Schmidt |
e43452 |
+unsigned columns(void) {
|
|
Michal Schmidt |
e43452 |
static __thread int parsed_columns = 0;
|
|
Michal Schmidt |
e43452 |
const char *e;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
if (_likely_(parsed_columns > 0))
|
|
Michal Schmidt |
e43452 |
return parsed_columns;
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
- if ((e = getenv("COLUMNS")))
|
|
Michal Schmidt |
e43452 |
+ e = getenv("COLUMNS");
|
|
Michal Schmidt |
e43452 |
+ if (e)
|
|
Michal Schmidt |
e43452 |
parsed_columns = atoi(e);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
- if (parsed_columns <= 0) {
|
|
Michal Schmidt |
e43452 |
- struct winsize ws;
|
|
Michal Schmidt |
e43452 |
- zero(ws);
|
|
Michal Schmidt |
e43452 |
-
|
|
Michal Schmidt |
e43452 |
- if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) >= 0)
|
|
Michal Schmidt |
e43452 |
- parsed_columns = ws.ws_col;
|
|
Michal Schmidt |
e43452 |
- }
|
|
Michal Schmidt |
e43452 |
+ if (parsed_columns <= 0)
|
|
Michal Schmidt |
e43452 |
+ parsed_columns = fd_columns(STDOUT_FILENO);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
if (parsed_columns <= 0)
|
|
Michal Schmidt |
e43452 |
parsed_columns = 80;
|
|
Michal Schmidt |
e43452 |
diff --git a/src/util.h b/src/util.h
|
|
Michal Schmidt |
e43452 |
index a71a297..e4a554a 100644
|
|
Michal Schmidt |
e43452 |
--- a/src/util.h
|
|
Michal Schmidt |
e43452 |
+++ b/src/util.h
|
|
Michal Schmidt |
e43452 |
@@ -370,11 +370,12 @@ int pipe_eof(int fd);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
cpu_set_t* cpu_set_malloc(unsigned *ncpus);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
-void status_vprintf(const char *format, va_list ap);
|
|
Michal Schmidt |
e43452 |
-void status_printf(const char *format, ...);
|
|
Michal Schmidt |
e43452 |
+void status_vprintf(const char *status, const char *format, va_list ap);
|
|
Michal Schmidt |
e43452 |
+void status_printf(const char *status, const char *format, ...);
|
|
Michal Schmidt |
e43452 |
void status_welcome(void);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
-int columns(void);
|
|
Michal Schmidt |
e43452 |
+int fd_columns(int fd);
|
|
Michal Schmidt |
e43452 |
+unsigned columns(void);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
int running_in_chroot(void);
|
|
Michal Schmidt |
e43452 |
|
|
Michal Schmidt |
e43452 |
--
|
|
Michal Schmidt |
e43452 |
1.7.7.5
|
|
Michal Schmidt |
e43452 |
|