diff --git a/src/syncterm/menu.c b/src/syncterm/menu.c
index 7f403c8331576ebd52805d812b7ac7efa80c2d96..549c413dc8f2fb756ebddd574daed9c698c42e27 100644
--- a/src/syncterm/menu.c
+++ b/src/syncterm/menu.c
@@ -221,16 +221,7 @@ syncmenu(struct bbslist *bbs, int *speed)
 				break;
 			case 2: /* Login */
 				ret = 1;
-				conn_send(bbs->user, strlen(bbs->user), 0);
-				conn_send("\r", 1, 0);
-				SLEEP(10);
-				conn_send(bbs->password, strlen(bbs->password), 0);
-				conn_send("\r", 1, 0);
-				if (bbs->syspass[0]) {
-					SLEEP(10);
-					conn_send(bbs->syspass, strlen(bbs->syspass), 0);
-					conn_send("\r", 1, 0);
-				}
+				send_login(bbs);
 				break;
 			case 5: /* Output rate */
 				if ((bbs->conn_type == CONN_TYPE_MODEM) || (bbs->conn_type == CONN_TYPE_SERIAL)
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index a725f4825f70abccd882fffb04f74ec4a77e3e90..13206d6f4bb28de4c6d19f66dcbbf1f57edf7120 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -3649,6 +3649,38 @@ do_paste(void)
 	}
 }
 
+void
+send_login(struct bbslist *bbs) {
+	if ((bbs->conn_type != CONN_TYPE_RLOGIN)
+	    && (bbs->conn_type != CONN_TYPE_RLOGIN_REVERSED)
+	    && (bbs->conn_type != CONN_TYPE_SSH)) {
+		if (bbs->conn_type != CONN_TYPE_SSHNA) {
+			if (bbs->user[0]) {
+				conn_send(bbs->user, strlen(bbs->user), 0);
+				conn_send(
+					cterm->emulation == CTERM_EMULATION_ATASCII ? "\x9b" : "\r",
+					1,
+					0);
+				SLEEP(10);
+			}
+		}
+		if (bbs->password[0]) {
+			conn_send(bbs->password, strlen(bbs->password), 0);
+			conn_send(
+				cterm->emulation == CTERM_EMULATION_ATASCII ? "\x9b" : "\r",
+				1,
+				0);
+			SLEEP(10);
+		}
+	}
+	if (bbs->syspass[0]) {
+		conn_send(bbs->syspass, strlen(bbs->syspass), 0);
+		conn_send(cterm->emulation == CTERM_EMULATION_ATASCII ? "\x9b" : "\r",
+		    1,
+		    0);
+	}
+}
+
 bool
 doterm(struct bbslist *bbs)
 {
@@ -4069,34 +4101,7 @@ doterm(struct bbslist *bbs)
 					key = 0;
 					break;
 				case 0x2600: /* ALT-L */
-					if ((bbs->conn_type != CONN_TYPE_RLOGIN)
-					    && (bbs->conn_type != CONN_TYPE_RLOGIN_REVERSED)
-					    && (bbs->conn_type != CONN_TYPE_SSH)) {
-						if (bbs->conn_type != CONN_TYPE_SSHNA) {
-							if (bbs->user[0]) {
-								conn_send(bbs->user, strlen(bbs->user), 0);
-								conn_send(
-									cterm->emulation == CTERM_EMULATION_ATASCII ? "\x9b" : "\r",
-									1,
-									0);
-								SLEEP(10);
-							}
-						}
-						if (bbs->password[0]) {
-							conn_send(bbs->password, strlen(bbs->password), 0);
-							conn_send(
-								cterm->emulation == CTERM_EMULATION_ATASCII ? "\x9b" : "\r",
-								1,
-								0);
-							SLEEP(10);
-						}
-					}
-					if (bbs->syspass[0]) {
-						conn_send(bbs->syspass, strlen(bbs->syspass), 0);
-						conn_send(cterm->emulation == CTERM_EMULATION_ATASCII ? "\x9b" : "\r",
-						    1,
-						    0);
-					}
+					send_login(bbs);
 					key = 0;
 					break;
 				case 0x3200: /* ALT-M */
diff --git a/src/syncterm/term.h b/src/syncterm/term.h
index f9728a1891c1ed75689126c862156859059c3752..3074867cc84779000eb01d203ee98711ef5cdd04 100644
--- a/src/syncterm/term.h
+++ b/src/syncterm/term.h
@@ -32,5 +32,6 @@ void mousedrag(struct vmem_cell *scrollback);
 void get_cterm_size(int *cols, int *rows, int ns);
 int get_cache_fn_base(struct bbslist *bbs, char *fn, size_t fnsz);
 int get_cache_fn_subdir(struct bbslist *bbs, char *fn, size_t fnsz, const char *subdir);
+void send_login(struct bbslist *bbs);
 
 #endif // ifndef _TERM_H_