Skip to content

Commit 27f6cfa

Browse files
authored
Add an environement variable to control stdio mode (#759)
* Add an environement variable to control stdio mode stdio descriptors (stdin, stdout and stderr) can be operated in various modes by win32compat code. The behavior is set very early in fd_table_initialize() by setting pio->type. In PowerShell/Win32-OpenSSH#1427 it was chosen to set pio->type to NONSOCK_SYNC_FD to resolve an I/O hang problem. Unfortunately this introduce problems for other ssh usage. sshfs-wiun uses ssh and has at leas 6 open issues for the same problem introduced by this NONSOCK_SYNC_FD change: https://github.com/winfsp/sshfs-win/issues?q=is%3Aissue+cb+%3A87 The sshfs-win workaround it to use an older ssh.exe from cygwin, which is bundled with sshfs-win. This program is unable to use ssh-agent, which is quite frustrating. And if PATH is not set to use it, sshfs-win cannot work. This change introduce an OPENSSH_STDIO_MODE environment variable that can be set to the following values: unknown, sock, nonsock, nonsock_sync. It cause pio->type to be set to UNKNOWN_FD, SOCK_FD, NONSOCK_FD, and NONSOCK_SYNC_FD respecitively. The default behavior when the variable is not set is unchanged (which means NONSOCK_SYNC_FD). Setting OPENSSH_STDIO_MODE="nonsock" lets sshfs-win work again with openssh-portable ssh.exe. ssh-agent can be used, and this is good. * Leave out UNKNOWN_FD as the possible rtpes for stdio descriptors An assert(pio->type != UNKNOWN_FD) in fd_table_set() causes that case to fail early anyway.
1 parent 796d297 commit 27f6cfa

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

contrib/win32/win32compat/w32fd.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,19 @@ fd_table_initialize()
8888
{
8989
struct w32_io *pio;
9090
HANDLE wh;
91+
char *stdio_mode_env;
92+
int stdio_mode = NONSOCK_SYNC_FD;
93+
94+
stdio_mode_env = getenv("OPENSSH_STDIO_MODE");
95+
if (stdio_mode_env != NULL) {
96+
if (strcmp(stdio_mode_env, "sock") == 0)
97+
stdio_mode = SOCK_FD;
98+
else if (strcmp(stdio_mode_env, "nonsock") == 0)
99+
stdio_mode = NONSOCK_FD;
100+
else if (strcmp(stdio_mode_env, "nonsock_sync") == 0)
101+
stdio_mode = NONSOCK_SYNC_FD;
102+
}
103+
91104
/* table entries representing std in, out and error*/
92105
DWORD wh_index[] = { STD_INPUT_HANDLE , STD_OUTPUT_HANDLE , STD_ERROR_HANDLE };
93106
int fd_num = 0;
@@ -104,7 +117,7 @@ fd_table_initialize()
104117
return -1;
105118
}
106119
memset(pio, 0, sizeof(struct w32_io));
107-
pio->type = NONSOCK_SYNC_FD;
120+
pio->type = stdio_mode;
108121
pio->handle = wh;
109122
fd_table_set(pio, fd_num);
110123
}

0 commit comments

Comments
 (0)