]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
varlinkctl: respect $COLUMNS when rebreaking lines and we are not connected to a TTY
authorLennart Poettering <lennart@poettering.net>
Mon, 21 Oct 2024 09:10:35 +0000 (11:10 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 21 Oct 2024 13:47:25 +0000 (15:47 +0200)
Let's provide a mechanism to select the number of screen columns for
rebreaking comments in Varlink IDL connected to a TTY, by honouring the
$COLUMNS env var then too. Previously we'd only honour when connected to
a TTY, but it's also useful otherwise for rebreaking ridiculously long
comments, hence honour it in this case too.

src/basic/terminal-util.c
src/basic/terminal-util.h
src/varlinkctl/varlinkctl.c

index d5593bd01d427f1323d5be5658b0ce4bda4a67dc..8ded46f493886b1fe4311c7258bd596c53258b5b 100644 (file)
@@ -944,24 +944,35 @@ int fd_columns(int fd) {
         return ws.ws_col;
 }
 
+int getenv_columns(void) {
+        int r;
+
+        const char *e = getenv("COLUMNS");
+        if (!e)
+                return -ENXIO;
+
+        unsigned c;
+        r = safe_atou_bounded(e, 1, USHRT_MAX, &c);
+        if (r < 0)
+                return r;
+
+        return (int) c;
+}
+
 unsigned columns(void) {
-        const char *e;
-        int c;
 
         if (cached_columns > 0)
                 return cached_columns;
 
-        c = 0;
-        e = getenv("COLUMNS");
-        if (e)
-                (void) safe_atoi(e, &c);
-
-        if (c <= 0 || c > USHRT_MAX) {
+        int c = getenv_columns();
+        if (c < 0) {
                 c = fd_columns(STDOUT_FILENO);
-                if (c <= 0)
+                if (c < 0)
                         c = 80;
         }
 
+        assert(c > 0);
+
         cached_columns = c;
         return cached_columns;
 }
index b5c45c464bcf49c290e04105a5ea96bf01c286dc..b446e547d6078e904e3a15efc6969c36aa909648 100644 (file)
@@ -95,6 +95,7 @@ void reset_dev_console_fd(int fd, bool switch_to_text);
 int lock_dev_console(void);
 int make_console_stdio(void);
 
+int getenv_columns(void);
 int fd_columns(int fd);
 unsigned columns(void);
 int fd_lines(int fd);
index 0474ab245e84c440a21b4b6d33296e078632eddf..f88a1050934fe585531cbd259ab4b384a7b0a037 100644 (file)
@@ -346,6 +346,21 @@ static int verb_info(int argc, char *argv[], void *userdata) {
         return 0;
 }
 
+static size_t break_columns(void) {
+        int r;
+
+        /* Rebreak the interface data to the TTY width */
+        if (on_tty())
+                return columns();
+
+        /* if not connected to a tty, still allow the caller to control the columns via the usual env var */
+        r = getenv_columns();
+        if (r < 0)
+                return SIZE_MAX;
+
+        return r;
+}
+
 typedef struct GetInterfaceDescriptionData {
         const char *description;
 } GetInterfaceDescriptionData;
@@ -448,7 +463,7 @@ static int verb_introspect(int argc, char *argv[], void *userdata) {
                                 }
                         } else {
                                 pager_open(arg_pager_flags);
-                                r = sd_varlink_idl_dump(stdout, vi, SD_VARLINK_IDL_FORMAT_COLOR_AUTO, on_tty() ? columns() : SIZE_MAX);
+                                r = sd_varlink_idl_dump(stdout, vi, SD_VARLINK_IDL_FORMAT_COLOR_AUTO, break_columns());
                                 if (r < 0)
                                         return log_error_errno(r, "Failed to format parsed interface description: %m");
                         }
@@ -705,7 +720,7 @@ static int verb_validate_idl(int argc, char *argv[], void *userdata) {
 
         pager_open(arg_pager_flags);
 
-        r = sd_varlink_idl_dump(stdout, vi, SD_VARLINK_IDL_FORMAT_COLOR_AUTO, on_tty() ? columns() : SIZE_MAX);
+        r = sd_varlink_idl_dump(stdout, vi, SD_VARLINK_IDL_FORMAT_COLOR_AUTO, break_columns());
         if (r < 0)
                 return log_error_errno(r, "Failed to format parsed interface description: %m");