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;
}
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;
}
} 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");
}
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");