From 553451348096e80bf11470cd882b31bea3178c80 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Wed, 10 Jul 2019 22:48:08 +0000
Subject: [PATCH] Normalize terminal types across protocols.

Note that conn_pty does not support PETSCII or ATASCII as the terminal
type since it sets TERMCAP, and I don't have a termcap entry for either of
those.
---
 src/syncterm/CHANGES     |  1 +
 src/syncterm/bbslist.c   | 14 ++++++++++++++
 src/syncterm/bbslist.h   |  1 +
 src/syncterm/rlogin.c    | 10 +++++++---
 src/syncterm/ssh.c       |  4 +++-
 src/syncterm/telnet_io.c | 16 ++--------------
 6 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/src/syncterm/CHANGES b/src/syncterm/CHANGES
index 6eeeeae5de..b3794256b1 100644
--- a/src/syncterm/CHANGES
+++ b/src/syncterm/CHANGES
@@ -22,6 +22,7 @@ Added support for cached font assets
 Support for XTerm and TundraDraw/PabloDraw 24-bit color modes
 Some PETSCII keyboard changes
 Add support for DECRQSS
+Terminal type is now sent as "syncterm", "PETSCII", or "ATASCII"
 
 Version 1.0
 -----------
diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index 9635e40ef9..d37bac5137 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -1982,3 +1982,17 @@ get_emulation(struct bbslist *bbs)
 			return CTERM_EMULATION_ANSI_BBS;
 	}
 }
+
+const char *
+get_emulation_str(cterm_emulation_t emu)
+{
+	switch (emu) {
+		case CTERM_EMULATION_ANSI_BBS:
+			return "syncterm";
+		case CTERM_EMULATION_PETASCII:
+			return "PETSCII";
+		case CTERM_EMULATION_ATASCII:
+			return "ATASCII";
+	}
+}
+
diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h
index 88b975b86d..fe8f2d82bc 100644
--- a/src/syncterm/bbslist.h
+++ b/src/syncterm/bbslist.h
@@ -106,5 +106,6 @@ void add_bbs(char *listpath, struct bbslist *bbs);
 int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isdefault);
 int  get_rate_num(int rate);
 cterm_emulation_t get_emulation(struct bbslist *bbs);
+const char *get_emulation_str(cterm_emulation_t emu);
 
 #endif
diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index e1cb2cc14f..f48d749a17 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -156,12 +156,16 @@ int rlogin_connect(struct bbslist *bbs)
 		conn_send(ruser,strlen(ruser)+1,1000);
 		if(bbs->bpsrate) {
 			char	sbuf[30];
-			sprintf(sbuf, "ansi-bbs/%d", bbs->bpsrate);
+			sprintf(sbuf, "%s/%d", get_emulation_str(get_emulation(bbs)), bbs->bpsrate);
+
+			conn_send(sbuf, strlen(sbuf)+1,1000);
+		}
+		else {
+			char	sbuf[30];
+			sprintf(sbuf, "%s/115200", get_emulation_str(get_emulation(bbs)));
 
 			conn_send(sbuf, strlen(sbuf)+1,1000);
 		}
-		else
-			conn_send("ansi-bbs/115200",16,1000);
 	}
 
 	_beginthread(rlogin_output_thread, 0, NULL);
diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c
index cfb63009ba..808ac22839 100644
--- a/src/syncterm/ssh.c
+++ b/src/syncterm/ssh.c
@@ -147,6 +147,7 @@ int ssh_connect(struct bbslist *bbs)
 	char username[MAX_USER_LEN+1];
 	int	rows,cols;
 	struct text_info ti;
+	const char *term;
 
 	init_uifc(TRUE, TRUE);
 	pthread_mutex_init(&ssh_mutex, NULL);
@@ -236,7 +237,8 @@ int ssh_connect(struct bbslist *bbs)
 
 	uifc.pop(NULL);
 	uifc.pop("Setting Terminal Type");
-	status=cl.SetAttributeString(ssh_session, CRYPT_SESSINFO_SSH_TERMINAL, "syncterm", 8);
+	term = get_emulation_str(get_emulation(bbs));
+	status=cl.SetAttributeString(ssh_session, CRYPT_SESSINFO_SSH_TERMINAL, term, strlen(term));
 
 	/* Horrible way to determine the screen size */
 	textmode(screen_to_ciolib(bbs->screen_mode));
diff --git a/src/syncterm/telnet_io.c b/src/syncterm/telnet_io.c
index 0a080ec4b0..09dd20a3e1 100644
--- a/src/syncterm/telnet_io.c
+++ b/src/syncterm/telnet_io.c
@@ -158,24 +158,12 @@ BYTE* telnet_interpret(BYTE* inbuf, int inlen, BYTE* outbuf, int *outlen, cterm_
 					/* sub-option terminated */
 					if(option==TELNET_TERM_TYPE && telnet_cmd[3]==TELNET_TERM_SEND) {
 						char buf[32];
-						const char *termtype;
-						switch(emu) {
-							case CTERM_EMULATION_PETASCII:
-								termtype = "PETSCII";
-								break;
-							case CTERM_EMULATION_ATASCII:
-								termtype = "ATASCII";
-								break;
-							default:
-								termtype = "ANSI";
-								break;
-						}
 						int len=sprintf(buf,"%c%c%c%c%s%c%c"
 							,TELNET_IAC,TELNET_SB
 							,TELNET_TERM_TYPE,TELNET_TERM_IS
-							,termtype
+							,get_emulation_str(emu)
 							,TELNET_IAC,TELNET_SE);
-						lprintf(LOG_INFO,"TX: Terminal Type is %s", termtype);
+						lprintf(LOG_INFO,"TX: Terminal Type is %s", get_emulation_str(emu));
 						putcom(buf,len);
 						request_telnet_opt(TELNET_WILL, TELNET_NEGOTIATE_WINDOW_SIZE);
 					}
-- 
GitLab