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.
git-svn-id: svn://svn.tartarus.org/sgt/putty@4993
cda61777-01e9-0310-a592-
d414129be87e
printf("psftp> ");
line = fgetline(fp);
} else {
- line = ssh_sftp_get_cmdline("psftp> ");
+ line = ssh_sftp_get_cmdline("psftp> ", back == NULL);
}
if (!line || !*line) {
sftp_recvdata(&ch, 1);
back->free(backhandle);
sftp_cleanup_request();
+ back = NULL;
+ backhandle = NULL;
}
if (pwd) {
sfree(pwd);
/*
* Read a command line for PSFTP from standard input. Caller must
* 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-
* Do a select() between all currently active network fds and
* 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;
int i, fdcount, fdsize, *fdlist;
for (fd = first_fd(&fdstate, &rwx); fd >= 0;
fd = next_fd(&fdstate, &rwx)) i++;
- if (i < 1)
+ if (i < 1 && !no_fds_ok)
return -1; /* doom */
/* Expand the fdlist buffer if necessary. */
*/
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.
*/
-char *ssh_sftp_get_cmdline(char *prompt)
+char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok)
{
char *buf;
int buflen, bufsize, ret;
buflen = bufsize = 0;
while (1) {
- ret = ssh_sftp_do_select(TRUE);
+ ret = ssh_sftp_do_select(TRUE, no_fds_ok);
if (ret < 0) {
printf("connection died\n");
return NULL; /* woop woop */
/*
* 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;
char *do_select(SOCKET skt, int startup)
{
return 0;
}
-char *ssh_sftp_get_cmdline(char *prompt)
+char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok)
{
int ret;
struct command_read_ctx actx, *ctx = &actx;
fputs(prompt, 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 */
}