diff options
Diffstat (limited to 'lib/ttyutils.c')
-rw-r--r-- | lib/ttyutils.c | 78 |
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; |