summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Simonart <xavier.simonart@intel.com>2019-08-19 06:09:39 -0400
committerPatrice Buriez <patrice.buriez@intel.com>2019-10-08 19:28:25 +0000
commitad355dcafbaa5e0aa151d4f66e7c9566d07edabc (patch)
treefa8c5afe5af30eb0c428f6ef889858adc874d8e8
parentfb0c44a8e62de7cf06a1ad0c025ac7ecb39cad27 (diff)
Fix display error with repeated characters (ncurses/xterm related issue)
On recent OSes such as RHEL 8.0, ncurses(6.1) introduced support for ECMA-48 repeat character control. Some terminal emulators use TERM=xterm but do not support this feature. In this case, printing repeated character such as "22000000 Hz" might be displayed as 220 Hz. Other emulators, such as tmux, use TERM=screen, and do not exhibit the issue. Signed-off-by: Xavier Simonart <xavier.simonart@intel.com> Change-Id: I79977c7421699b59957d6cbd8aa954f06f3e0227
-rw-r--r--VNFs/DPPD-PROX/main.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/VNFs/DPPD-PROX/main.c b/VNFs/DPPD-PROX/main.c
index 4a9ee881..e4663fee 100644
--- a/VNFs/DPPD-PROX/main.c
+++ b/VNFs/DPPD-PROX/main.c
@@ -18,6 +18,7 @@
#include <locale.h>
#include <unistd.h>
#include <signal.h>
+#include <curses.h>
#include <rte_cycles.h>
#include <rte_atomic.h>
@@ -1117,6 +1118,40 @@ static void sigterm_handler(int signum)
quit();
}
+static void set_term_env(void)
+{
+ static const char var[] = "TERM";
+ static char str[] = "TERM=putty";
+ char *old_value, *new_value;
+ int max_ver = 0, min_ver = 0, n;
+
+ old_value = getenv(var);
+
+ const char *ncurses_version = curses_version();
+ n = sscanf(ncurses_version, "ncurses %d.%d", &max_ver, &min_ver);
+ if (n != 2) {
+ plog_info("\tUnable to extract ncurses version from %s. TERM left unchanged to %s\n", ncurses_version, old_value);
+ return;
+ } else {
+ plog_info("\tncurses version = %d.%d (%s)\n", max_ver, min_ver, ncurses_version);
+ }
+
+ if (((max_ver > 6) || ((max_ver == 6) && (min_ver >= 1))) && (strcmp(old_value, "xterm") == 0)) {
+ // On recent OSes such as RHEL 8.0, ncurses(6.1) introduced support
+ // for ECMA-48 repeat character control.
+ // Some terminal emulators use TERM=xterm but do not support this feature.
+ // In this case, printing repeating character such as "22000000 Hz" might
+ // display as 220 Hz.
+ // Other emulattors, such as tmux, use TERM=screen, and do not exhibit the issue.
+ plog_info("\tChanged TERM from %s ", old_value);
+ putenv(str);
+ new_value = getenv(var);
+ plog_info("to %s\n", new_value);
+ } else {
+ plog_info("\tTERM left unchanged to %s\n", old_value);
+ }
+}
+
int main(int argc, char **argv)
{
/* set en_US locale to print big numbers with ',' */
@@ -1125,10 +1160,10 @@ int main(int argc, char **argv)
if (prox_parse_args(argc, argv) != 0){
prox_usage(argv[0]);
}
-
plog_init(prox_cfg.log_name, prox_cfg.log_name_pid);
plog_info("=== " PROGRAM_NAME " %s ===\n", VERSION_STR());
plog_info("\tUsing DPDK %s\n", rte_version() + sizeof(RTE_VER_PREFIX));
+ set_term_env();
read_rdt_info();
if (prox_cfg.flags & DSF_LIST_TASK_MODES) {