X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/34292b1daab0fcd6ce02627497117d01aaa39a19..1172a92b4a579b7d637550b68082b8245dec26c4:/windows/winsftp.c diff --git a/windows/winsftp.c b/windows/winsftp.c index 21188978..33acaf62 100644 --- a/windows/winsftp.c +++ b/windows/winsftp.c @@ -6,6 +6,7 @@ #include "putty.h" #include "psftp.h" +#include "ssh.h" #include "int64.h" char *get_ttymode(void *frontend, const char *mode) { return NULL; } @@ -19,6 +20,12 @@ int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) return ret; } +void platform_get_x11_auth(struct X11Display *display, Conf *conf) +{ + /* Do nothing, therefore no auth. */ +} +const int platform_uses_x11_unix_by_default = TRUE; + /* ---------------------------------------------------------------------- * File access abstraction. */ @@ -62,17 +69,27 @@ char *psftp_getcwd(void) return ret; } -#define TIME_POSIX_TO_WIN(t, ft) (*(LONGLONG*)&(ft) = \ - ((LONGLONG) (t) + (LONGLONG) 11644473600) * (LONGLONG) 10000000) -#define TIME_WIN_TO_POSIX(ft, t) ((t) = (unsigned long) \ - ((*(LONGLONG*)&(ft)) / (LONGLONG) 10000000 - (LONGLONG) 11644473600)) +#define TIME_POSIX_TO_WIN(t, ft) do { \ + ULARGE_INTEGER uli; \ + uli.QuadPart = ((ULONGLONG)(t) + 11644473600ull) * 10000000ull; \ + (ft).dwLowDateTime = uli.LowPart; \ + (ft).dwHighDateTime = uli.HighPart; \ +} while(0) +#define TIME_WIN_TO_POSIX(ft, t) do { \ + ULARGE_INTEGER uli; \ + uli.LowPart = (ft).dwLowDateTime; \ + uli.HighPart = (ft).dwHighDateTime; \ + uli.QuadPart = uli.QuadPart / 10000000ull - 11644473600ull; \ + (t) = (unsigned long) uli.QuadPart; \ +} while(0) struct RFile { HANDLE h; }; RFile *open_existing_file(char *name, uint64 *size, - unsigned long *mtime, unsigned long *atime) + unsigned long *mtime, unsigned long *atime, + long *perms) { HANDLE h; RFile *ret; @@ -97,12 +114,16 @@ RFile *open_existing_file(char *name, uint64 *size, TIME_WIN_TO_POSIX(wrtime, *mtime); } + if (perms) + *perms = -1; + return ret; } int read_from_file(RFile *f, void *buffer, int length) { - int ret, read; + int ret; + DWORD read; ret = ReadFile(f->h, buffer, length, &read, NULL); if (!ret) return -1; /* error */ @@ -120,7 +141,7 @@ struct WFile { HANDLE h; }; -WFile *open_new_file(char *name) +WFile *open_new_file(char *name, long perms) { HANDLE h; WFile *ret; @@ -157,7 +178,8 @@ WFile *open_existing_wfile(char *name, uint64 *size) int write_to_file(WFile *f, void *buffer, int length) { - int ret, written; + int ret; + DWORD written; ret = WriteFile(f->h, buffer, length, &written, NULL); if (!ret) return -1; /* error */ @@ -431,7 +453,7 @@ char *dir_file_cat(char *dir, char *file) * Be told what socket we're supposed to be using. */ static SOCKET sftp_ssh_socket = INVALID_SOCKET; -static HANDLE netevent = NULL; +static HANDLE netevent = INVALID_HANDLE_VALUE; char *do_select(SOCKET skt, int startup) { int events; @@ -463,38 +485,43 @@ extern int select_result(WPARAM, LPARAM); int do_eventsel_loop(HANDLE other_event) { - int n, nhandles, nallhandles; - long next, ticks; + int n, nhandles, nallhandles, netindex, otherindex; + unsigned long next, then; + long ticks; HANDLE *handles; SOCKET *sklist; int skcount; - long now = GETTICKCOUNT(); + unsigned long now = GETTICKCOUNT(); - if (!netevent) { - return -1; /* doom */ + if (run_timers(now, &next)) { + then = now; + now = GETTICKCOUNT(); + if (now - then > next - then) + ticks = 0; + else + ticks = next - now; + } else { + ticks = INFINITE; } handles = handle_get_events(&nhandles); handles = sresize(handles, nhandles+2, HANDLE); nallhandles = nhandles; - handles[nallhandles++] = netevent; - if (other_event) - handles[nallhandles++] = other_event; - - if (run_timers(now, &next)) { - ticks = next - GETTICKCOUNT(); - if (ticks < 0) ticks = 0; /* just in case */ - } else { - ticks = INFINITE; - } + if (netevent != INVALID_HANDLE_VALUE) + handles[netindex = nallhandles++] = netevent; + else + netindex = -1; + if (other_event != INVALID_HANDLE_VALUE) + handles[otherindex = nallhandles++] = other_event; + else + otherindex = -1; - n = MsgWaitForMultipleObjects(nallhandles, handles, FALSE, ticks, - QS_POSTMESSAGE); + n = WaitForMultipleObjects(nallhandles, handles, FALSE, ticks); if ((unsigned)(n - WAIT_OBJECT_0) < (unsigned)nhandles) { handle_got_event(handles[n - WAIT_OBJECT_0]); - } else if (n == WAIT_OBJECT_0 + nhandles) { + } else if (netindex >= 0 && n == WAIT_OBJECT_0 + netindex) { WSANETWORKEVENTS things; SOCKET socket; extern SOCKET first_socket(int *), next_socket(int *); @@ -564,7 +591,7 @@ int do_eventsel_loop(HANDLE other_event) now = GETTICKCOUNT(); } - if (other_event && n == WAIT_OBJECT_0 + nhandles + 1) + if (otherindex >= 0 && n == WAIT_OBJECT_0 + otherindex) return 1; return 0; @@ -581,25 +608,29 @@ int do_eventsel_loop(HANDLE other_event) */ int ssh_sftp_loop_iteration(void) { - if (sftp_ssh_socket == INVALID_SOCKET) - return -1; /* doom */ - if (p_WSAEventSelect == NULL) { fd_set readfds; int ret; - long now = GETTICKCOUNT(); + unsigned long now = GETTICKCOUNT(), then; + + if (sftp_ssh_socket == INVALID_SOCKET) + return -1; /* doom */ if (socket_writable(sftp_ssh_socket)) select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_WRITE); do { - long next, ticks; + unsigned long next; + long ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { - ticks = next - GETTICKCOUNT(); - if (ticks <= 0) - ticks = 1; /* just in case */ + then = now; + now = GETTICKCOUNT(); + if (now - then > next - then) + ticks = 0; + else + ticks = next - now; tv.tv_sec = ticks / 1000; tv.tv_usec = ticks % 1000 * 1000; ptv = &tv; @@ -624,7 +655,7 @@ int ssh_sftp_loop_iteration(void) return 0; } else { - return do_eventsel_loop(NULL); + return do_eventsel_loop(INVALID_HANDLE_VALUE); } }