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

Collapse All | Expand All

(-)openssh-4.7p1/ssh.c.masterrace (-10 / +22 lines)
Lines 1065-1071 client_global_request_reply_fwd(int type Link Here
1065
	}
1065
	}
1066
}
1066
}
1067
1067
1068
static void
1068
static int
1069
ssh_control_listener(void)
1069
ssh_control_listener(void)
1070
{
1070
{
1071
	struct sockaddr_un addr;
1071
	struct sockaddr_un addr;
Lines 1073-1082 ssh_control_listener(void) Link Here
1073
	int addr_len;
1073
	int addr_len;
1074
1074
1075
	if (options.control_path == NULL ||
1075
	if (options.control_path == NULL ||
1076
	    options.control_master == SSHCTL_MASTER_NO)
1076
	    options.control_master == SSHCTL_MASTER_NO ||
1077
		return;
1077
	    control_fd != -1)
1078
		return 1;
1078
1079
1079
	debug("setting up multiplex master socket");
1080
	debug("trying to set up multiplex master socket");
1080
1081
1081
	memset(&addr, '\0', sizeof(addr));
1082
	memset(&addr, '\0', sizeof(addr));
1082
	addr.sun_family = AF_UNIX;
1083
	addr.sun_family = AF_UNIX;
Lines 1093-1103 ssh_control_listener(void) Link Here
1093
	old_umask = umask(0177);
1094
	old_umask = umask(0177);
1094
	if (bind(control_fd, (struct sockaddr *)&addr, addr_len) == -1) {
1095
	if (bind(control_fd, (struct sockaddr *)&addr, addr_len) == -1) {
1095
		control_fd = -1;
1096
		control_fd = -1;
1096
		if (errno == EINVAL || errno == EADDRINUSE)
1097
		if (errno != EINVAL && errno != EADDRINUSE)
1097
			fatal("ControlSocket %s already exists",
1098
			    options.control_path);
1099
		else
1100
			fatal("%s bind(): %s", __func__, strerror(errno));
1098
			fatal("%s bind(): %s", __func__, strerror(errno));
1099
		return 0;
1101
	}
1100
	}
1102
	umask(old_umask);
1101
	umask(old_umask);
1103
1102
Lines 1105-1110 ssh_control_listener(void) Link Here
1105
		fatal("%s listen(): %s", __func__, strerror(errno));
1104
		fatal("%s listen(): %s", __func__, strerror(errno));
1106
1105
1107
	set_nonblock(control_fd);
1106
	set_nonblock(control_fd);
1107
1108
	debug("control master listening on %s", options.control_path);
1109
	return 1;
1108
}
1110
}
1109
1111
1110
/* request pty/x11/agent/tcpfwd/shell for channel */
1112
/* request pty/x11/agent/tcpfwd/shell for channel */
Lines 1196-1202 ssh_session2(void) Link Here
1196
	ssh_init_forwarding();
1198
	ssh_init_forwarding();
1197
1199
1198
	/* Start listening for multiplex clients */
1200
	/* Start listening for multiplex clients */
1199
	ssh_control_listener();
1201
	if (!ssh_control_listener())
1202
		fatal("control master socket %s already exists",
1203
		      options.control_path);
1200
1204
1201
 	/*
1205
 	/*
1202
 	 * If we are the control master, and if control_persist is set,
1206
 	 * If we are the control master, and if control_persist is set,
Lines 1375-1381 control_client(const char *path) Link Here
1375
	switch (options.control_master) {
1379
	switch (options.control_master) {
1376
	case SSHCTL_MASTER_AUTO:
1380
	case SSHCTL_MASTER_AUTO:
1377
	case SSHCTL_MASTER_AUTO_ASK:
1381
	case SSHCTL_MASTER_AUTO_ASK:
1378
		debug("auto-mux: Trying existing master");
1382
		/* see if we can create a control master socket
1383
		   to avoid a race between two auto clients */
1384
		if (mux_command == SSHMUX_COMMAND_OPEN &&
1385
		    ssh_control_listener())
1386
			return;
1387
		debug("trying to connect to control master socket %s",
1388
		    options.control_path);
1379
		/* FALLTHROUGH */
1389
		/* FALLTHROUGH */
1380
	case SSHCTL_MASTER_NO:
1390
	case SSHCTL_MASTER_NO:
1381
		break;
1391
		break;
Lines 1522-1527 control_client(const char *path) Link Here
1522
	signal(SIGTERM, control_client_sighandler);
1532
	signal(SIGTERM, control_client_sighandler);
1523
	signal(SIGWINCH, control_client_sigrelay);
1533
	signal(SIGWINCH, control_client_sigrelay);
1524
1534
1535
	debug("connected to control master; waiting for exit");
1536
1525
	if (tty_flag)
1537
	if (tty_flag)
1526
		enter_raw_mode();
1538
		enter_raw_mode();
1527
1539

Return to bug 1349