1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-25 01:02:24 +00:00

Jacob points out that I introduced a bug in PSFTP when I did the

timing shakeup: just running `psftp' caused the net/stdin select
loop (on both Unix and Windows) to get confused at the lack of any
network connection and give up immediately. Should now be fixed.

[originally from svn r4993]
This commit is contained in:
Simon Tatham 2004-12-16 19:15:38 +00:00
parent 69303f2d3e
commit f1585f8f46
4 changed files with 20 additions and 10 deletions

View File

@ -1866,7 +1866,7 @@ struct sftp_command *sftp_getcmd(FILE *fp, int mode, int modeflags)
printf("psftp> "); printf("psftp> ");
line = fgetline(fp); line = fgetline(fp);
} else { } else {
line = ssh_sftp_get_cmdline("psftp> "); line = ssh_sftp_get_cmdline("psftp> ", back == NULL);
} }
if (!line || !*line) { if (!line || !*line) {
@ -2004,6 +2004,8 @@ void do_sftp_cleanup()
sftp_recvdata(&ch, 1); sftp_recvdata(&ch, 1);
back->free(backhandle); back->free(backhandle);
sftp_cleanup_request(); sftp_cleanup_request();
back = NULL;
backhandle = NULL;
} }
if (pwd) { if (pwd) {
sfree(pwd); sfree(pwd);

View File

@ -35,8 +35,15 @@ int ssh_sftp_loop_iteration(void);
/* /*
* Read a command line for PSFTP from standard input. Caller must * Read a command line for PSFTP from standard input. Caller must
* free. * free.
*
* If `backend_required' is TRUE, should also listen for activity
* at the backend (rekeys, clientalives, unexpected closures etc)
* and respond as necessary, and if the backend closes it should
* treat this as a failure condition. If `backend_required' is
* FALSE, a back end is not (intentionally) active at all (e.g.
* psftp before an `open' command).
*/ */
char *ssh_sftp_get_cmdline(char *prompt); char *ssh_sftp_get_cmdline(char *prompt, int backend_required);
/* /*
* The main program in psftp.c. Called from main() in the platform- * The main program in psftp.c. Called from main() in the platform-

View File

@ -355,7 +355,7 @@ char *dir_file_cat(char *dir, char *file)
* Do a select() between all currently active network fds and * Do a select() between all currently active network fds and
* optionally stdin. * optionally stdin.
*/ */
static int ssh_sftp_do_select(int include_stdin) static int ssh_sftp_do_select(int include_stdin, int no_fds_ok)
{ {
fd_set rset, wset, xset; fd_set rset, wset, xset;
int i, fdcount, fdsize, *fdlist; int i, fdcount, fdsize, *fdlist;
@ -372,7 +372,7 @@ static int ssh_sftp_do_select(int include_stdin)
for (fd = first_fd(&fdstate, &rwx); fd >= 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0;
fd = next_fd(&fdstate, &rwx)) i++; fd = next_fd(&fdstate, &rwx)) i++;
if (i < 1) if (i < 1 && !no_fds_ok)
return -1; /* doom */ return -1; /* doom */
/* Expand the fdlist buffer if necessary. */ /* Expand the fdlist buffer if necessary. */
@ -457,13 +457,13 @@ static int ssh_sftp_do_select(int include_stdin)
*/ */
int ssh_sftp_loop_iteration(void) int ssh_sftp_loop_iteration(void)
{ {
return ssh_sftp_do_select(FALSE); return ssh_sftp_do_select(FALSE, FALSE);
} }
/* /*
* Read a PSFTP command line from stdin. * Read a PSFTP command line from stdin.
*/ */
char *ssh_sftp_get_cmdline(char *prompt) char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok)
{ {
char *buf; char *buf;
int buflen, bufsize, ret; int buflen, bufsize, ret;
@ -475,7 +475,7 @@ char *ssh_sftp_get_cmdline(char *prompt)
buflen = bufsize = 0; buflen = bufsize = 0;
while (1) { while (1) {
ret = ssh_sftp_do_select(TRUE); ret = ssh_sftp_do_select(TRUE, no_fds_ok);
if (ret < 0) { if (ret < 0) {
printf("connection died\n"); printf("connection died\n");
return NULL; /* woop woop */ return NULL; /* woop woop */

View File

@ -462,7 +462,7 @@ char *dir_file_cat(char *dir, char *file)
/* /*
* Be told what socket we're supposed to be using. * Be told what socket we're supposed to be using.
*/ */
static SOCKET sftp_ssh_socket; static SOCKET sftp_ssh_socket = INVALID_SOCKET;
static HANDLE netevent = NULL; static HANDLE netevent = NULL;
char *do_select(SOCKET skt, int startup) char *do_select(SOCKET skt, int startup)
{ {
@ -676,7 +676,7 @@ static DWORD WINAPI command_read_thread(void *param)
return 0; return 0;
} }
char *ssh_sftp_get_cmdline(char *prompt) char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok)
{ {
int ret; int ret;
struct command_read_ctx actx, *ctx = &actx; struct command_read_ctx actx, *ctx = &actx;
@ -685,7 +685,8 @@ char *ssh_sftp_get_cmdline(char *prompt)
fputs(prompt, stdout); fputs(prompt, stdout);
fflush(stdout); fflush(stdout);
if (sftp_ssh_socket == INVALID_SOCKET || p_WSAEventSelect == NULL) { if ((sftp_ssh_socket == INVALID_SOCKET && no_fds_ok) ||
p_WSAEventSelect == NULL) {
return fgetline(stdin); /* very simple */ return fgetline(stdin); /* very simple */
} }