@@ -919,6 +919,65 @@ static struct child_process *git_connect_git(int fd[2], char *hostandport,
919
919
return conn ;
920
920
}
921
921
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
+
922
981
/*
923
982
* This returns the dummy child_process `no_fork` if the transport protocol
924
983
* 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,
972
1031
conn -> use_shell = 1 ;
973
1032
conn -> in = conn -> out = -1 ;
974
1033
if (protocol == PROTO_SSH ) {
975
- const char * ssh ;
976
- enum ssh_variant variant ;
977
1034
char * ssh_host = hostandport ;
978
1035
const char * port = NULL ;
979
1036
transport_check_allowed ("ssh" );
@@ -995,57 +1052,7 @@ struct child_process *git_connect(int fd[2], const char *url,
995
1052
strbuf_release (& cmd );
996
1053
return NULL ;
997
1054
}
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 );
1049
1056
} else {
1050
1057
transport_check_allowed ("file" );
1051
1058
if (get_protocol_version_config () > 0 ) {
0 commit comments