[Ttssh2-commit] [6798] 条件分岐が多すぎて見通しが悪いので、共通部分を関数に括りだして分岐を一箇所にまとめた。

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2017年 6月 12日 (月) 19:43:25 JST


Revision: 6798
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6798
Author:   doda
Date:     2017-06-12 19:43:25 +0900 (Mon, 12 Jun 2017)
Log Message:
-----------
条件分岐が多すぎて見通しが悪いので、共通部分を関数に括りだして分岐を一箇所にまとめた。

コネクションタイプ独自の処理が増えるようならば、関数に括りだすようにする。

Modified Paths:
--------------
    trunk/ttssh2/ttxssh/ssh.c

-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c	2017-06-12 01:47:12 UTC (rev 6797)
+++ trunk/ttssh2/ttxssh/ssh.c	2017-06-12 10:43:25 UTC (rev 6798)
@@ -7372,6 +7372,47 @@
 	return TRUE;
 }
 
+/*
+ * SSH_MSG_CHANNEL_REQUEST \x91\x97\x90M\x8A֐\x94
+ * type-specific data \x82\xAA string \x82\xC5 0 \x81` 2 \x82̕\xA8\x82ɑΉ\x9E\x81B
+ * \x8Eg\x97p\x82\xB5\x82Ȃ\xA2\x83\x81\x83b\x83Z\x81[\x83W\x82\xCD NULL \x82ɂ\xB7\x82\xE9\x81B
+ * type-specific data \x82\xAA\x91\xBC\x82̌`\x8E\xAE\x82ɂ͑Ή\x9E\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x82̂ŁA\x8E\xA9\x91O\x82ő\x97\x82鎖\x81B
+ */
+static BOOL send_channel_request_gen(PTInstVar pvar, Channel_t *c, unsigned char *req, int want_reply, unsigned char *msg1, unsigned char *msg2)
+{
+	buffer_t *msg;
+	unsigned char *outmsg;
+	int len;
+
+	msg = buffer_init();
+	if (msg == NULL) {
+		return FALSE;
+	}
+
+	buffer_put_int(msg, c->remote_id);
+	buffer_put_string(msg, req, strlen(req));
+
+	buffer_put_char(msg, want_reply);
+
+	if (msg1) {
+		buffer_put_string(msg, msg1, strlen(msg1));
+	}
+	if (msg2) {
+		buffer_put_string(msg, msg1, strlen(msg1));
+	}
+
+	len = buffer_len(msg);
+	outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len);
+	memcpy(outmsg, buffer_ptr(msg), len);
+	finish_send_packet(pvar);
+	buffer_free(msg);
+
+	logprintf(pvar, LOG_LEVEL_VERBOSE, __FUNCTION__ ": sending SSH2_MSG_CHANNEL_REQUEST. "
+	          "local: %d, remote: %d, request-type: %s, msg1=%s, msg2=%s",
+	          c->self_id, c->remote_id, req, msg1 ? msg1 : "none", msg2 ? msg2 : "none");
+	return TRUE;
+}
+
 BOOL send_pty_request(PTInstVar pvar, Channel_t *c)
 {
 	buffer_t *msg, *ttymsg;
@@ -7459,18 +7500,17 @@
 }
 
 static BOOL handle_SSH2_open_confirm(PTInstVar pvar)
-{	
-	buffer_t *msg;
-	char *s;
-	unsigned char *outmsg;
+{
 	int len;
 	char *data;
 	int id, remote_id;
 	Channel_t *c;
+	char buff[MAX_PATH + 30];
+
 #ifdef DONT_WANTCONFIRM
-	int wantconfirm = 0; // false
+	int want_reply = 0; // false
 #else
-	int wantconfirm = 1; // true
+	int want_reply = 1; // true
 #endif
 
 	notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_OPEN_CONFIRMATION was received.", LOG_LEVEL_VERBOSE);
@@ -7505,97 +7545,42 @@
 	c->remote_maxpacket = get_uint32_MSBfirst(data);
 	data += 4;
 
-	if (c->type == TYPE_PORTFWD) {
+	switch (c->type) {
+	case TYPE_PORTFWD:
 		// port-forwading\x82\xCC"direct-tcpip"\x82\xAA\x90\xAC\x8C\xF7\x81B
 		FWD_confirmed_open(pvar, c->local_num, -1);
-		return TRUE;
-	}
+		break;
 
-	if (c->type == TYPE_SHELL) {
+	case TYPE_SHELL:
 		// \x83|\x81[\x83g\x83t\x83H\x83\x8F\x81[\x83f\x83B\x83\x93\x83O\x82̏\x80\x94\xF5 (2005.2.26, 2005.6.21 yutaka)
 		// \x83V\x83F\x83\x8B\x83I\x81[\x83v\x83\x93\x82\xB5\x82\xBD\x82\xA0\x82Ƃ\xC9 X11 \x82̗v\x8B\x81\x82\xF0\x8Fo\x82\xB3\x82Ȃ\xAD\x82Ă͂Ȃ\xE7\x82Ȃ\xA2\x81B(2005.7.3 yutaka)
 		FWD_prep_forwarding(pvar);
 		FWD_enter_interactive_mode(pvar);
-	}
 
-	//debug_print(100, data, len);
-
-	if (c->type == TYPE_SHELL) {
 		// \x83G\x81[\x83W\x83F\x83\x93\x83g\x93]\x91\x97 (2008.11.25 maya)
 		if (pvar->session_settings.ForwardAgent) {
 			// pty-req \x82\xE6\x82\xE8\x91O\x82Ƀ\x8A\x83N\x83G\x83X\x83g\x82\xB5\x82Ȃ\xA2\x82ƃG\x83\x89\x81[\x82ɂȂ\xE9\x96͗l
-
-			msg = buffer_init();
-			if (msg == NULL) {
-				// TODO: error check
-				return FALSE;
-			}
-			buffer_put_int(msg, c->remote_id);
-			s = "auth-****@opens*****";
-			buffer_put_string(msg, s, strlen(s));
-			buffer_put_char(msg, 1); // want reply
-			len = buffer_len(msg);
-			outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len);
-			memcpy(outmsg, buffer_ptr(msg), len);
-			finish_send_packet(pvar);
-			buffer_free(msg);
-
-			notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at handle_SSH2_channel_success().", LOG_LEVEL_VERBOSE);
-			return TRUE;
+			return send_channel_request_gen(pvar, c, "auth-****@opens*****", 1, NULL, NULL);
 		}
 		else {
 			return send_pty_request(pvar, c);
 		}
-	}
+		break;
 
-	msg = buffer_init();
-	if (msg == NULL) {
-		// TODO: error check
-		return FALSE;
-	}
-
-	buffer_put_int(msg, remote_id);
-	if (c->type == TYPE_SCP) {
-		s = "exec";
-	} else if (c->type == TYPE_SFTP || c->type == TYPE_SUBSYSTEM_GEN) {
-		s = "subsystem";
-	} else {
-		s = "";  // NOT REACHED
-	}
-	buffer_put_string(msg, s, strlen(s));
-	buffer_put_char(msg, wantconfirm);  // wantconfirm (disable\x82ɕύX 2005/3/28 yutaka)
-
-	if (c->type == TYPE_SCP) {
-		char sbuf[MAX_PATH + 30];
+	case TYPE_SCP:
 		if (c->scp.dir == TOREMOTE) {
-			_snprintf_s(sbuf, sizeof(sbuf), _TRUNCATE, "scp -t %s", c->scp.remotefile);
+			_snprintf_s(buff, sizeof(buff), _TRUNCATE, "scp -t %s", c->scp.remotefile);
 
 		} else {
 			// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82ɋ󔒂\xF0\x8A܂܂\xEA\x82Ă\xA2\x82Ă\xE0\x82悢\x82悤\x82ɁA\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x93\xF1\x8Fd\x88\xF8\x97p\x95\x84\x82ň͂ށB
 			// (2014.7.13 yutaka)
-			_snprintf_s(sbuf, sizeof(sbuf), _TRUNCATE, "scp -p -f \"%s\"", c->scp.remotefile);
+			_snprintf_s(buff, sizeof(buff), _TRUNCATE, "scp -p -f \"%s\"", c->scp.remotefile);
+		}
 
+		if (!send_channel_request_gen(pvar, c, "exec", want_reply, buff, NULL)) {
+			return FALSE;;
 		}
-		buffer_put_string(msg, sbuf, strlen(sbuf));
-	}
-	else if (c->type == TYPE_SFTP) {
-		char *sbuf = "sftp";
-		buffer_put_string(msg, sbuf, strlen(sbuf));
-	}
-	else if (c->type == TYPE_SUBSYSTEM_GEN) {
-		buffer_put_string(msg, pvar->subsystem_name, strlen(pvar->subsystem_name));
-		pvar->session_nego_status = 0;
-	}
 
-	len = buffer_len(msg);
-	outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len);
-	memcpy(outmsg, buffer_ptr(msg), len);
-	finish_send_packet(pvar);
-	buffer_free(msg);
-
-	notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at handle_SSH2_open_confirm().", LOG_LEVEL_VERBOSE);
-
-	if (c->type == TYPE_SCP) {
 		// SCP\x82\xC5 remote-to-local \x82̏ꍇ\x82́A\x83T\x81[\x83o\x82\xA9\x82\xE7\x82̃t\x83@\x83C\x83\x8B\x91\x97\x90M\x97v\x8B\x81\x82\xF0\x8Fo\x82\xB7\x81B
 		// \x82\xB1\x82̎\x9E\x93_\x82ł\xCD remote window size \x82\xAA"0"\x82Ȃ̂ŁA\x82\xB7\x82\xAE\x82ɂ͑\x97\x82\xE7\x82\xEA\x82Ȃ\xA2\x82\xAA\x81A\x92x\x89\x84\x91\x97\x90M\x8F\x88\x97\x9D\x82ő\x97\x82\xE7\x82\xEA\x82\xE9\x81B
 		// (2007.12.27 yutaka)
@@ -7603,18 +7588,32 @@
 			char ch = '\0';
 			SSH2_send_channel_data(pvar, c, &ch, 1, 0);
 		}
+		break;
 
-	} else if (c->type == TYPE_SFTP) {
+	case TYPE_SFTP:
+		if (!send_channel_request_gen(pvar, c, "subsystem", want_reply, "sftp", NULL)) {
+			return FALSE;;
+		}
+
 		// SFTP\x83Z\x83b\x83V\x83\x87\x83\x93\x82\xF0\x8AJ\x8En\x82\xB7\x82邽\x82߂̃l\x83S\x83V\x83G\x81[\x83V\x83\x87\x83\x93\x82\xF0\x8Ds\x82\xA4\x81B
 		// (2012.5.3 yutaka)
 		sftp_do_init(pvar, c);
+		break;
 
+	case TYPE_SUBSYSTEM_GEN:
+		if (!send_channel_request_gen(pvar, c, "subsystem", want_reply, pvar->subsystem_name, NULL)) {
+			return FALSE;;
+		}
+		pvar->session_nego_status = 0;
+		break;
+
+	default: // NOT REACHED
+		logprintf(pvar, LOG_LEVEL_ERROR, __FUNCTION__ ": Invalid channel-type. (%d)", c->type);
+		return FALSE;
 	}
-
 	return TRUE;
 }
 
-
 // SSH2 port-forwarding \x82ɂ\xA8\x82\xA2\x82ăZ\x83b\x83V\x83\x87\x83\x93\x82\xAA\x83I\x81[\x83v\x83\x93\x82ł\xAB\x82Ȃ\xA2\x8Fꍇ\x82̃T\x81[\x83o\x82\xA9\x82\xE7\x82̃\x8A\x83v\x83\x89\x83C\x81i\x8E\xB8\x94s\x81j
 static BOOL handle_SSH2_open_failure(PTInstVar pvar)
 {	
@@ -7679,7 +7678,6 @@
 	return TRUE;
 }
 
-
 // SSH2_MSG_GLOBAL_REQUEST for OpenSSH 6.8
 static BOOL handle_SSH2_client_global_request(PTInstVar pvar)
 {
@@ -7764,15 +7762,11 @@
 
 static BOOL handle_SSH2_channel_success(PTInstVar pvar)
 {	
-	buffer_t *msg;
-	char *s;
-	unsigned char *outmsg;
-	int len;
 	Channel_t *c;
 #ifdef DONT_WANTCONFIRM
-	int wantconfirm = 0; // false
+	int want_reply = 0; // false
 #else
-	int wantconfirm = 1; // true
+	int want_reply = 1; // true
 #endif
 	char buf[128];
 
@@ -7793,11 +7787,7 @@
 
 	} else if (pvar->session_nego_status == 2) {
 		pvar->session_nego_status = 3;
-		msg = buffer_init();
-		if (msg == NULL) {
-			// TODO: error check
-			return FALSE;
-		}
+
 		// find channel by shell id(2005.2.27 yutaka)
 		c = ssh2_channel_lookup(pvar->shell_id);
 		if (c == NULL) {
@@ -7804,22 +7794,12 @@
 			// TODO: error check
 			return FALSE;
 		}
-		buffer_put_int(msg, c->remote_id);
-//		buffer_put_int(msg, pvar->remote_id);
 
-		s = "shell";
-		buffer_put_string(msg, s, strlen(s));  // ctype
-		buffer_put_char(msg, wantconfirm);   // wantconfirm (disable\x82ɕύX 2005/3/28 yutaka)
+		if (!send_channel_request_gen(pvar, c, "shell", want_reply, NULL, NULL)) {
+			return FALSE;;
+		}
 
-		len = buffer_len(msg);
-		outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len);
-		memcpy(outmsg, buffer_ptr(msg), len);
-		finish_send_packet(pvar);
-		buffer_free(msg);
-
-		notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at handle_SSH2_channel_success().", LOG_LEVEL_VERBOSE);
-
-		if (wantconfirm == 0) {
+		if (want_reply == 0) {
 			handle_SSH2_channel_success(pvar);
 		}
 
@@ -7838,7 +7818,6 @@
 	Channel_t *c;
 	char *data;
 	int channel_id;
-	char buf[128];
 
 	data = pvar->ssh_state.payload;
 	channel_id = get_uint32_MSBfirst(data);
@@ -7864,12 +7843,10 @@
 			if (pvar->session_nego_status == 1) {
 				// \x83\x8A\x83\x82\x81[\x83g\x82\xC5 auth-****@opens***** \x82\xAA\x83T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82ĂȂ\xA2\x82̂\xC5
 				// \x83G\x83\x89\x81[\x82͋C\x82ɂ\xB9\x82\xB8\x8E\x9F\x82֐i\x82\xDE
+				notify_verbose_message(pvar,
+					"auth-****@opens***** is not supported by remote host.",
+					LOG_LEVEL_VERBOSE);
 
-				strncpy_s(buf, sizeof(buf),
-					  "auth-****@opens***** is not supported by remote host.",
-					  _TRUNCATE);
-				notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
-
 				return send_pty_request(pvar, c);
 			}
 		}



Ttssh2-commit メーリングリストの案内
Back to archive index