X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinsftp.c;h=0776cba94bdc19f544814d26dd7e985611fcae42;hb=9f9d72ec58642e91b4f93ee4405a8086ee2fb2f0;hp=25ac6c9482079b14e0b1218614f02aa77db2430b;hpb=5c4ce2fadf23bff6f38155df44b5d6040cf80d26;p=PuTTY.git diff --git a/windows/winsftp.c b/windows/winsftp.c index 25ac6c94..0776cba9 100644 --- a/windows/winsftp.c +++ b/windows/winsftp.c @@ -11,7 +11,7 @@ char *get_ttymode(void *frontend, const char *mode) { return NULL; } -int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) +int get_userpass_input(prompts_t *p, const unsigned char *in, int inlen) { int ret; ret = cmdline_get_passwd_input(p, in, inlen); @@ -87,7 +87,7 @@ struct RFile { HANDLE h; }; -RFile *open_existing_file(char *name, uint64 *size, +RFile *open_existing_file(const char *name, uint64 *size, unsigned long *mtime, unsigned long *atime, long *perms) { @@ -141,7 +141,7 @@ struct WFile { HANDLE h; }; -WFile *open_new_file(char *name, long perms) +WFile *open_new_file(const char *name, long perms) { HANDLE h; WFile *ret; @@ -157,7 +157,7 @@ WFile *open_new_file(char *name, long perms) return ret; } -WFile *open_existing_wfile(char *name, uint64 *size) +WFile *open_existing_wfile(const char *name, uint64 *size) { HANDLE h; WFile *ret; @@ -239,7 +239,7 @@ uint64 get_file_posn(WFile *f) return ret; } -int file_type(char *name) +int file_type(const char *name) { DWORD attr; attr = GetFileAttributes(name); @@ -257,7 +257,7 @@ struct DirHandle { char *name; }; -DirHandle *open_directory(char *name) +DirHandle *open_directory(const char *name) { HANDLE h; WIN32_FIND_DATA fdat; @@ -316,7 +316,7 @@ void close_directory(DirHandle *dir) sfree(dir); } -int test_wildcard(char *name, int cmdline) +int test_wildcard(const char *name, int cmdline) { HANDLE fh; WIN32_FIND_DATA fdat; @@ -340,14 +340,14 @@ struct WildcardMatcher { char *srcpath; }; -/* - * Return a pointer to the portion of str that comes after the last - * slash (or backslash or colon, if `local' is TRUE). - */ -static char *stripslashes(char *str, int local) +char *stripslashes(const char *str, int local) { char *p; + /* + * On Windows, \ / : are all path component separators. + */ + if (local) { p = strchr(str, ':'); if (p) str = p+1; @@ -361,10 +361,10 @@ static char *stripslashes(char *str, int local) if (p) str = p+1; } - return str; + return (char *)str; } -WildcardMatcher *begin_wildcard_matching(char *name) +WildcardMatcher *begin_wildcard_matching(const char *name) { HANDLE h; WIN32_FIND_DATA fdat; @@ -424,7 +424,7 @@ void finish_wildcard_matching(WildcardMatcher *dir) sfree(dir); } -int vet_filename(char *name) +int vet_filename(const char *name) { if (strchr(name, '/') || strchr(name, '\\') || strchr(name, ':')) return FALSE; @@ -435,12 +435,12 @@ int vet_filename(char *name) return TRUE; } -int create_directory(char *name) +int create_directory(const char *name) { return CreateDirectory(name, NULL) != 0; } -char *dir_file_cat(char *dir, char *file) +char *dir_file_cat(const char *dir, const char *file) { return dupcat(dir, "\\", file, NULL); } @@ -495,6 +495,7 @@ int do_eventsel_loop(HANDLE other_event) if (toplevel_callback_pending()) { ticks = 0; + next = now; } else if (run_timers(now, &next)) { then = now; now = GETTICKCOUNT(); @@ -504,6 +505,8 @@ int do_eventsel_loop(HANDLE other_event) ticks = next - now; } else { ticks = INFINITE; + /* no need to initialise next here because we can never get + * WAIT_TIMEOUT */ } handles = handle_get_events(&nhandles); @@ -688,11 +691,12 @@ static DWORD WINAPI command_read_thread(void *param) return 0; } -char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok) +char *ssh_sftp_get_cmdline(const char *prompt, int no_fds_ok) { int ret; struct command_read_ctx actx, *ctx = &actx; DWORD threadid; + HANDLE hThread; fputs(prompt, stdout); fflush(stdout); @@ -709,8 +713,9 @@ char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok) ctx->event = CreateEvent(NULL, FALSE, FALSE, NULL); ctx->line = NULL; - if (!CreateThread(NULL, 0, command_read_thread, - ctx, 0, &threadid)) { + hThread = CreateThread(NULL, 0, command_read_thread, ctx, 0, &threadid); + if (!hThread) { + CloseHandle(ctx->event); fprintf(stderr, "Unable to create command input thread\n"); cleanup_exit(1); } @@ -722,6 +727,9 @@ char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok) assert(ret >= 0); } while (ret == 0); + CloseHandle(hThread); + CloseHandle(ctx->event); + return ctx->line; }