View | Details | Raw Unified | Return to bug 920 | Differences between
and this patch

Collapse All | Expand All

(-)clientloop.c (-2 / +4 lines)
Lines 616-628 client_process_control(fd_set * readset) Link Here
616
616
617
	switch (command) {
617
	switch (command) {
618
	case SSHMUX_COMMAND_OPEN:
618
	case SSHMUX_COMMAND_OPEN:
619
		if (options.control_master == 2)
619
		if (options.control_master == SSHCTL_MASTER_ASK ||
620
		    options.control_master == SSHCTL_MASTER_AUTO_ASK)
620
			allowed = ask_permission("Allow shared connection "
621
			allowed = ask_permission("Allow shared connection "
621
			    "to %s? ", host);
622
			    "to %s? ", host);
622
		/* continue below */
623
		/* continue below */
623
		break;
624
		break;
624
	case SSHMUX_COMMAND_TERMINATE:
625
	case SSHMUX_COMMAND_TERMINATE:
625
		if (options.control_master == 2)
626
		if (options.control_master == SSHCTL_MASTER_ASK ||
627
		    options.control_master == SSHCTL_MASTER_AUTO_ASK)
626
			allowed = ask_permission("Terminate shared connection "
628
			allowed = ask_permission("Terminate shared connection "
627
			    "to %s? ", host);
629
			    "to %s? ", host);
628
		if (allowed)
630
		if (allowed)
(-)readconf.c (-1 / +21 lines)
Lines 794-800 parse_int: Link Here
794
794
795
	case oControlMaster:
795
	case oControlMaster:
796
		intptr = &options->control_master;
796
		intptr = &options->control_master;
797
		goto parse_yesnoask;
797
		arg = strdelim(&s);
798
		if (!arg || *arg == '\0')
799
			fatal("%.200s line %d: Missing ControlMaster argument.",
800
			    filename, linenum);
801
		value = 0;	/* To avoid compiler warning... */
802
		if (strcmp(arg, "yes") == 0 || strcmp(arg, "true") == 0)
803
			value = SSHCTL_MASTER_YES;
804
		else if (strcmp(arg, "no") == 0 || strcmp(arg, "false") == 0)
805
			value = SSHCTL_MASTER_NO;
806
		else if (strcmp(arg, "auto") == 0)
807
			value = SSHCTL_MASTER_AUTO;
808
		else if (strcmp(arg, "ask") == 0)
809
			value = SSHCTL_MASTER_ASK;
810
		else if (strcmp(arg, "autoask") == 0)
811
			value = SSHCTL_MASTER_AUTO_ASK;
812
		else
813
			fatal("%.200s line %d: Bad ControlMaster argument.",
814
			    filename, linenum);
815
		if (*activep && *intptr == -1)
816
			*intptr = value;
817
		break;
798
818
799
	case oHashKnownHosts:
819
	case oHashKnownHosts:
800
		intptr = &options->hash_known_hosts;
820
		intptr = &options->hash_known_hosts;
(-)readconf.h (+5 lines)
Lines 116-121 typedef struct { Link Here
116
	int	hash_known_hosts;
116
	int	hash_known_hosts;
117
}       Options;
117
}       Options;
118
118
119
#define SSHCTL_MASTER_NO	0
120
#define SSHCTL_MASTER_YES	1
121
#define SSHCTL_MASTER_AUTO	2
122
#define SSHCTL_MASTER_ASK	3
123
#define SSHCTL_MASTER_AUTO_ASK	4
119
124
120
void     initialize_options(Options *);
125
void     initialize_options(Options *);
121
void     fill_default_options(Options *);
126
void     fill_default_options(Options *);
(-)ssh.c (-7 / +23 lines)
Lines 381-388 again: Link Here
381
			}
381
			}
382
			break;
382
			break;
383
		case 'M':
383
		case 'M':
384
			options.control_master =
384
			if (options.control_master == SSHCTL_MASTER_YES)
385
			    (options.control_master >= 1) ? 2 : 1;
385
				options.control_master = SSHCTL_MASTER_ASK;
386
			else
387
				options.control_master = SSHCTL_MASTER_YES;
386
			break;
388
			break;
387
		case 'p':
389
		case 'p':
388
			options.port = a2port(optarg);
390
			options.port = a2port(optarg);
Lines 607-617 again: Link Here
607
	}
609
	}
608
	if (mux_command != 0 && options.control_path == NULL)
610
	if (mux_command != 0 && options.control_path == NULL)
609
		fatal("No ControlPath specified for \"-O\" command");
611
		fatal("No ControlPath specified for \"-O\" command");
610
	if (options.control_path != NULL && options.control_master == 0) {
612
	if (options.control_path != NULL)
611
		if (mux_command == 0)
612
			mux_command = SSHMUX_COMMAND_OPEN;
613
		control_client(options.control_path);
613
		control_client(options.control_path);
614
	}
615
614
616
	/* Open a connection to the remote host. */
615
	/* Open a connection to the remote host. */
617
	if (ssh_connect(host, &hostaddr, options.port,
616
	if (ssh_connect(host, &hostaddr, options.port,
Lines 1070-1078 ssh_control_listener(void) Link Here
1070
	struct sockaddr_un addr;
1069
	struct sockaddr_un addr;
1071
	mode_t old_umask;
1070
	mode_t old_umask;
1072
1071
1073
	if (options.control_path == NULL || options.control_master <= 0)
1072
	if (options.control_path == NULL ||
1073
	    options.control_master == SSHCTL_MASTER_NO)
1074
		return;
1074
		return;
1075
1075
1076
	debug("setting up multiplex master socket");
1077
1076
	memset(&addr, '\0', sizeof(addr));
1078
	memset(&addr, '\0', sizeof(addr));
1077
	addr.sun_family = AF_UNIX;
1079
	addr.sun_family = AF_UNIX;
1078
	addr.sun_len = offsetof(struct sockaddr_un, sun_path) +
1080
	addr.sun_len = offsetof(struct sockaddr_un, sun_path) +
Lines 1282-1287 control_client(const char *path) Link Here
1282
	char *term;
1284
	char *term;
1283
	extern char **environ;
1285
	extern char **environ;
1284
	u_int  flags;
1286
	u_int  flags;
1287
1288
	if (mux_command == 0)
1289
		mux_command = SSHMUX_COMMAND_OPEN;
1290
1291
	switch (options.control_master) {
1292
	case SSHCTL_MASTER_AUTO:
1293
	case SSHCTL_MASTER_AUTO_ASK:
1294
		debug("auto-mux: Trying existing master");
1295
		/* FALLTHROUGH */
1296
	case SSHCTL_MASTER_NO:
1297
		break;
1298
	default:
1299
		return;
1300
	}
1285
1301
1286
	memset(&addr, '\0', sizeof(addr));
1302
	memset(&addr, '\0', sizeof(addr));
1287
	addr.sun_family = AF_UNIX;
1303
	addr.sun_family = AF_UNIX;
(-)ssh_config.5 (+10 lines)
Lines 278-283 If the Link Here
278
can not be opened,
278
can not be opened,
279
.Nm ssh
279
.Nm ssh
280
will continue without connecting to a master instance.
280
will continue without connecting to a master instance.
281
.Pp
282
Two additional options allow for "opportunistic" multiplexing: try to use a
283
master connection but fall back to creating a new one if one does not already
284
exist. These options are:
285
.Dq auto
286
and
287
.Dq autoask .
288
The latter requires confirmation like the
289
.Dq ask
290
option.
281
.It Cm ControlPath
291
.It Cm ControlPath
282
Specify the path to the control socket used for connection sharing.
292
Specify the path to the control socket used for connection sharing.
283
See
293
See

Return to bug 920