#include <errno.h>
#include <assert.h>
#include <glob.h>
+#ifndef HAVE_NO_SYS_SELECT_H
+#include <sys/select.h>
+#endif
#include "putty.h"
#include "psftp.h"
return ret;
}
+char *get_ttymode(void *frontend, const char *mode) { return NULL; }
+
/*
* Stubs for the GUI feedback mechanism in Windows PSCP.
*/
sfree(dir);
}
+int vet_filename(char *name)
+{
+ if (strchr(name, '/'))
+ return FALSE;
+
+ if (name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])))
+ return FALSE;
+
+ return TRUE;
+}
+
int create_directory(char *name)
{
return mkdir(name, 0777) == 0;
* 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. */
ret = select(maxfd, &rset, &wset, &xset, ptv);
if (ret == 0)
now = next;
- else
- now = GETTICKCOUNT();
+ else {
+ long newnow = GETTICKCOUNT();
+ /*
+ * Check to see whether the system clock has
+ * changed massively during the select.
+ */
+ if (newnow - now < 0 || newnow - now > next - now) {
+ /*
+ * If so, look at the elapsed time in the
+ * select and use it to compute a new
+ * tickcount_offset.
+ */
+ long othernow = now + tv.tv_sec * 1000 + tv.tv_usec / 1000;
+ /* So we'd like GETTICKCOUNT to have returned othernow,
+ * but instead it return newnow. Hence ... */
+ tickcount_offset += othernow - newnow;
+ now = othernow;
+ } else {
+ now = newnow;
+ }
+ }
} while (ret < 0 && errno != EINTR);
} while (ret == 0);
*/
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 */