@@ -919,6 +919,65 @@ static struct child_process *git_connect_git(int fd[2], char *hostandport,
919919 return conn ;
920920}
921921
922+ /* Prepare a child_process for use by Git's SSH-tunneled transport. */
923+ static void fill_ssh_args (struct child_process * conn , const char * ssh_host ,
924+ const char * port , int flags )
925+ {
926+ const char * ssh ;
927+ enum ssh_variant variant ;
928+
929+ if (looks_like_command_line_option (ssh_host ))
930+ die ("strange hostname '%s' blocked" , ssh_host );
931+
932+ ssh = get_ssh_command ();
933+ if (ssh ) {
934+ variant = determine_ssh_variant (ssh , 1 );
935+ } else {
936+ /*
937+ * GIT_SSH is the no-shell version of
938+ * GIT_SSH_COMMAND (and must remain so for
939+ * historical compatibility).
940+ */
941+ conn -> use_shell = 0 ;
942+
943+ ssh = getenv ("GIT_SSH" );
944+ if (!ssh )
945+ ssh = "ssh" ;
946+ variant = determine_ssh_variant (ssh , 0 );
947+ }
948+
949+ argv_array_push (& conn -> args , ssh );
950+
951+ if (variant == VARIANT_SSH &&
952+ get_protocol_version_config () > 0 ) {
953+ argv_array_push (& conn -> args , "-o" );
954+ argv_array_push (& conn -> args , "SendEnv=" GIT_PROTOCOL_ENVIRONMENT );
955+ argv_array_pushf (& conn -> env_array , GIT_PROTOCOL_ENVIRONMENT "=version=%d" ,
956+ get_protocol_version_config ());
957+ }
958+
959+ if (variant != VARIANT_SIMPLE ) {
960+ if (flags & CONNECT_IPV4 )
961+ argv_array_push (& conn -> args , "-4" );
962+ else if (flags & CONNECT_IPV6 )
963+ argv_array_push (& conn -> args , "-6" );
964+ }
965+
966+ if (variant == VARIANT_TORTOISEPLINK )
967+ argv_array_push (& conn -> args , "-batch" );
968+
969+ if (port && variant != VARIANT_SIMPLE ) {
970+ if (variant == VARIANT_SSH )
971+ argv_array_push (& conn -> args , "-p" );
972+ else
973+ argv_array_push (& conn -> args , "-P" );
974+
975+ argv_array_push (& conn -> args , port );
976+ }
977+
978+ argv_array_push (& conn -> args , ssh_host );
979+ }
980+
922981/*
923982 * This returns the dummy child_process `no_fork` if the transport protocol
924983 * does not need fork(2), or a struct child_process object if it does. Once
@@ -972,8 +1031,6 @@ struct child_process *git_connect(int fd[2], const char *url,
9721031 conn -> use_shell = 1 ;
9731032 conn -> in = conn -> out = -1 ;
9741033 if (protocol == PROTO_SSH ) {
975- const char * ssh ;
976- enum ssh_variant variant ;
9771034 char * ssh_host = hostandport ;
9781035 const char * port = NULL ;
9791036 transport_check_allowed ("ssh" );
@@ -995,57 +1052,7 @@ struct child_process *git_connect(int fd[2], const char *url,
9951052 strbuf_release (& cmd );
9961053 return NULL ;
9971054 }
998-
999- if (looks_like_command_line_option (ssh_host ))
1000- die ("strange hostname '%s' blocked" , ssh_host );
1001-
1002- ssh = get_ssh_command ();
1003- if (ssh ) {
1004- variant = determine_ssh_variant (ssh , 1 );
1005- } else {
1006- /*
1007- * GIT_SSH is the no-shell version of
1008- * GIT_SSH_COMMAND (and must remain so for
1009- * historical compatibility).
1010- */
1011- conn -> use_shell = 0 ;
1012-
1013- ssh = getenv ("GIT_SSH" );
1014- if (!ssh )
1015- ssh = "ssh" ;
1016- variant = determine_ssh_variant (ssh , 0 );
1017- }
1018-
1019- argv_array_push (& conn -> args , ssh );
1020-
1021- if (variant == VARIANT_SSH &&
1022- get_protocol_version_config () > 0 ) {
1023- argv_array_push (& conn -> args , "-o" );
1024- argv_array_push (& conn -> args , "SendEnv=" GIT_PROTOCOL_ENVIRONMENT );
1025- argv_array_pushf (& conn -> env_array , GIT_PROTOCOL_ENVIRONMENT "=version=%d" ,
1026- get_protocol_version_config ());
1027- }
1028-
1029- if (variant != VARIANT_SIMPLE ) {
1030- if (flags & CONNECT_IPV4 )
1031- argv_array_push (& conn -> args , "-4" );
1032- else if (flags & CONNECT_IPV6 )
1033- argv_array_push (& conn -> args , "-6" );
1034- }
1035-
1036- if (variant == VARIANT_TORTOISEPLINK )
1037- argv_array_push (& conn -> args , "-batch" );
1038-
1039- if (port && variant != VARIANT_SIMPLE ) {
1040- if (variant == VARIANT_SSH )
1041- argv_array_push (& conn -> args , "-p" );
1042- else
1043- argv_array_push (& conn -> args , "-P" );
1044-
1045- argv_array_push (& conn -> args , port );
1046- }
1047-
1048- argv_array_push (& conn -> args , ssh_host );
1055+ fill_ssh_args (conn , ssh_host , port , flags );
10491056 } else {
10501057 transport_check_allowed ("file" );
10511058 if (get_protocol_version_config () > 0 ) {
0 commit comments