776
return NULL;
777
}
778
779
-static int override_ssh_variant(int *port_option, int *needs_batch)
779
+enum ssh_variant {
780
+ VARIANT_SIMPLE,
781
+ VARIANT_SSH,
782
+ VARIANT_PLINK,
783
+ VARIANT_PUTTY,
784
+ VARIANT_TORTOISEPLINK,
785
+};
786
+
787
+static int override_ssh_variant(enum ssh_variant *ssh_variant)
788
{
781
- char *variant;
789
+ const char *variant = getenv("GIT_SSH_VARIANT");
790
783
- variant = xstrdup_or_null(getenv("GIT_SSH_VARIANT"));
784
- if (!variant &&
785
- git_config_get_string("ssh.variant", &variant))
791
+ if (!variant && git_config_get_string_const("ssh.variant", &variant))
792
return 0;
793
788
- if (!strcmp(variant, "plink") || !strcmp(variant, "putty")) {
789
- *port_option = 'P';
790
- *needs_batch = 0;
791
- } else if (!strcmp(variant, "tortoiseplink")) {
792
- *port_option = 'P';
793
- *needs_batch = 1;
794
- } else {
795
- *port_option = 'p';
796
- *needs_batch = 0;
797
- }
798
- free(variant);
794
+ if (!strcmp(variant, "plink"))
795
+ *ssh_variant = VARIANT_PLINK;
796
+ else if (!strcmp(variant, "putty"))
797
+ *ssh_variant = VARIANT_PUTTY;
798
+ else if (!strcmp(variant, "tortoiseplink"))
799
+ *ssh_variant = VARIANT_TORTOISEPLINK;
800
+ else if (!strcmp(variant, "simple"))
801
+ *ssh_variant = VARIANT_SIMPLE;
802
+ else
803
+ *ssh_variant = VARIANT_SSH;
804
+
805
return 1;
806
}
807
802
-static void handle_ssh_variant(const char *ssh_command, int is_cmdline,
803
- int *port_option, int *needs_batch)
808
+static enum ssh_variant determine_ssh_variant(const char *ssh_command,
809
+ int is_cmdline)
810
{
811
+ enum ssh_variant ssh_variant = VARIANT_SIMPLE;
812
const char *variant;
813
char *p = NULL;
814
808
- if (override_ssh_variant(port_option, needs_batch))
809
- return;
815
+ if (override_ssh_variant(&ssh_variant))
816
+ return ssh_variant;
817
818
if (!is_cmdline) {
819
p = xstrdup(ssh_command);
832
free(ssh_argv);
833
} else {
834
free(p);
828
- return;
835
+ return ssh_variant;
836
}
837
}
838
832
- if (!strcasecmp(variant, "plink") ||
833
- !strcasecmp(variant, "plink.exe"))
834
- *port_option = 'P';
839
+ if (!strcasecmp(variant, "ssh") ||
840
+ !strcasecmp(variant, "ssh.exe"))
841
+ ssh_variant = VARIANT_SSH;
842
+ else if (!strcasecmp(variant, "plink") ||
843
+ !strcasecmp(variant, "plink.exe"))
844
+ ssh_variant = VARIANT_PLINK;
845
else if (!strcasecmp(variant, "tortoiseplink") ||
836
- !strcasecmp(variant, "tortoiseplink.exe")) {
837
- *port_option = 'P';
838
- *needs_batch = 1;
839
- }
846
+ !strcasecmp(variant, "tortoiseplink.exe"))
847
+ ssh_variant = VARIANT_TORTOISEPLINK;
848
+
849
free(p);
850
+ return ssh_variant;
851
}
852
853
/*
947
conn->in = conn->out = -1;
948
if (protocol == PROTO_SSH) {
949
const char *ssh;
940
- int needs_batch = 0;
941
- int port_option = 'p';
950
+ enum ssh_variant variant;
951
char *ssh_host = hostandport;
952
const char *port = NULL;
953
transport_check_allowed("ssh");
974
die("strange hostname '%s' blocked", ssh_host);
975
976
ssh = get_ssh_command();
968
- if (ssh)
969
- handle_ssh_variant(ssh, 1, &port_option,
970
- &needs_batch);
971
- else {
977
+ if (ssh) {
978
+ variant = determine_ssh_variant(ssh, 1);
979
+ } else {
980
/*
981
* GIT_SSH is the no-shell version of
982
* GIT_SSH_COMMAND (and must remain so for
987
ssh = getenv("GIT_SSH");
988
if (!ssh)
989
ssh = "ssh";
982
- else
983
- handle_ssh_variant(ssh, 0,
984
- &port_option,
985
- &needs_batch);
990
+ variant = determine_ssh_variant(ssh, 0);
991
}
992
993
argv_array_push(&conn->args, ssh);
994
990
- if (get_protocol_version_config() > 0) {
995
+ if (variant == VARIANT_SSH &&
996
+ get_protocol_version_config() > 0) {
997
argv_array_push(&conn->args, "-o");
998
argv_array_push(&conn->args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
999
argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
1000
get_protocol_version_config());
1001
}
1002
997
- if (flags & CONNECT_IPV4)
998
- argv_array_push(&conn->args, "-4");
999
- else if (flags & CONNECT_IPV6)
1000
- argv_array_push(&conn->args, "-6");
1001
- if (needs_batch)
1003
+ if (variant != VARIANT_SIMPLE) {
1004
+ if (flags & CONNECT_IPV4)
1005
+ argv_array_push(&conn->args, "-4");
1006
+ else if (flags & CONNECT_IPV6)
1007
+ argv_array_push(&conn->args, "-6");
1008
+ }
1009
+
1010
+ if (variant == VARIANT_TORTOISEPLINK)
1011
argv_array_push(&conn->args, "-batch");
1003
- if (port) {
1004
- argv_array_pushf(&conn->args,
1005
- "-%c", port_option);
1012
+
1013
+ if (port && variant != VARIANT_SIMPLE) {
1014
+ if (variant == VARIANT_SSH)
1015
+ argv_array_push(&conn->args, "-p");
1016
+ else
1017
+ argv_array_push(&conn->args, "-P");
1018
+
1019
argv_array_push(&conn->args, port);
1020
}
1021
+
1022
argv_array_push(&conn->args, ssh_host);
1023
} else {
1024
transport_check_allowed("file");