summaryrefslogtreecommitdiffstats
path: root/lib/ttyutils.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 19:33:34 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 19:33:34 +0000
commit1272be04be0cb803eec87f602edb2e3e6f111aea (patch)
treebce17f6478cdd9f3c4ec3d751135dc42786d6a56 /lib/ttyutils.c
parentReleasing progress-linux version 2.39.3-11~progress7.99u1. (diff)
downloadutil-linux-1272be04be0cb803eec87f602edb2e3e6f111aea.tar.xz
util-linux-1272be04be0cb803eec87f602edb2e3e6f111aea.zip
Merging upstream version 2.40.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/ttyutils.c')
-rw-r--r--lib/ttyutils.c78
1 files changed, 73 insertions, 5 deletions
diff --git a/lib/ttyutils.c b/lib/ttyutils.c
index 7064565..bacd730 100644
--- a/lib/ttyutils.c
+++ b/lib/ttyutils.c
@@ -7,9 +7,40 @@
#include <ctype.h>
#include <unistd.h>
+#ifdef HAVE_GETTTYNAM
+# include <ttyent.h>
+#endif
+
#include "c.h"
#include "ttyutils.h"
+#ifdef __linux__
+# ifndef DEFAULT_VCTERM
+# define DEFAULT_VCTERM "linux"
+# endif
+# if defined (__s390__) || defined (__s390x__)
+# define DEFAULT_TTYS0 "dumb"
+# define DEFAULT_TTY32 "ibm327x"
+# define DEFAULT_TTYS1 "vt220"
+# endif
+# ifndef DEFAULT_STERM
+# define DEFAULT_STERM "vt102"
+# endif
+#elif defined(__GNU__)
+# ifndef DEFAULT_VCTERM
+# define DEFAULT_VCTERM "hurd"
+# endif
+# ifndef DEFAULT_STERM
+# define DEFAULT_STERM "vt102"
+# endif
+#else
+# ifndef DEFAULT_VCTERM
+# define DEFAULT_VCTERM "vt100"
+# endif
+# ifndef DEFAULT_STERM
+# define DEFAULT_STERM "vt100"
+# endif
+#endif
static int get_env_int(const char *name)
{
@@ -130,6 +161,35 @@ int get_terminal_type(const char **type)
return 0;
}
+char *get_terminal_default_type(const char *ttyname, int is_serial)
+{
+ if (ttyname) {
+#ifdef HAVE_GETTTYNAM
+ struct ttyent *ent = getttynam(ttyname);
+
+ if (ent && ent->ty_type)
+ return strdup(ent->ty_type);
+#endif
+
+#if defined (__s390__) || defined (__s390x__)
+ /*
+ * Special terminal on first serial line on a S/390(x) which
+ * is due legacy reasons a block terminal of type 3270 or
+ * higher. Whereas the second serial line on a S/390(x) is
+ * a real character terminal which is compatible with VT220.
+ */
+ if (strcmp(ttyname, "ttyS0") == 0) /* linux/drivers/s390/char/con3215.c */
+ return strdup(DEFAULT_TTYS0);
+ else if (strncmp(ttyname, "3270/tty", 8) == 0) /* linux/drivers/s390/char/con3270.c */
+ return strdup(DEFAULT_TTY32);
+ else if (strcmp(ttyname, "ttyS1") == 0) /* linux/drivers/s390/char/sclp_vt220.c */
+ return strdup(DEFAULT_TTYS1);
+#endif
+ }
+
+ return strdup(is_serial ? DEFAULT_STERM : DEFAULT_VCTERM);
+}
+
#ifdef TEST_PROGRAM_TTYUTILS
# include <stdlib.h>
int main(void)
@@ -138,13 +198,21 @@ int main(void)
int c, l;
if (get_terminal_name(&path, &name, &num) == 0) {
- fprintf(stderr, "tty path: %s\n", path);
- fprintf(stderr, "tty name: %s\n", name);
- fprintf(stderr, "tty number: %s\n", num);
+ char *term;
+
+ fprintf(stderr, "tty path: %s\n", path);
+ fprintf(stderr, "tty name: %s\n", name);
+ fprintf(stderr, "tty number: %s\n", num);
+
+ fprintf(stderr, "tty term: %s\n", getenv("TERM"));
+
+ term = get_terminal_default_type(name, 0);
+ fprintf(stderr, "tty dflt term: %s\n", term);
+ free(term);
}
get_terminal_dimension(&c, &l);
- fprintf(stderr, "tty cols: %d\n", c);
- fprintf(stderr, "tty lines: %d\n", l);
+ fprintf(stderr, "tty cols: %d\n", c);
+ fprintf(stderr, "tty lines: %d\n", l);
return EXIT_SUCCESS;