X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinsftp.c;h=6eecb313ca856ac5ce1c84a2ddf96a43c1f96a2a;hb=49d2cf19accb059b3b68d1fc2b78e606a578c3e8;hp=d9ea3cac42e0bab9530f8f428c7315c669c31c7c;hpb=7ecf13564a8d716000ce78146d1aaf4422432a4f;p=PuTTY.git diff --git a/windows/winsftp.c b/windows/winsftp.c index d9ea3cac..6eecb313 100644 --- a/windows/winsftp.c +++ b/windows/winsftp.c @@ -125,6 +125,8 @@ void gui_enable(char *arg) gui_hwnd = (HWND) atoi(arg); } +char *get_ttymode(void *frontend, const char *mode) { return NULL; } + /* ---------------------------------------------------------------------- * File access abstraction. */ @@ -306,20 +308,26 @@ DirHandle *open_directory(char *name) char *read_filename(DirHandle *dir) { - while (!dir->name) { - WIN32_FIND_DATA fdat; - int ok = FindNextFile(dir->h, &fdat); + do { - if (!ok) - return NULL; + if (!dir->name) { + WIN32_FIND_DATA fdat; + int ok = FindNextFile(dir->h, &fdat); + if (!ok) + return NULL; + else + dir->name = dupstr(fdat.cFileName); + } - if (fdat.cFileName[0] == '.' && - (fdat.cFileName[1] == '\0' || - (fdat.cFileName[1] == '.' && fdat.cFileName[2] == '\0'))) + assert(dir->name); + if (dir->name[0] == '.' && + (dir->name[1] == '\0' || + (dir->name[1] == '.' && dir->name[2] == '\0'))) { + sfree(dir->name); dir->name = NULL; - else - dir->name = dupstr(fdat.cFileName); - } + } + + } while (!dir->name); if (dir->name) { char *ret = dir->name; @@ -445,6 +453,17 @@ void finish_wildcard_matching(WildcardMatcher *dir) sfree(dir); } +int vet_filename(char *name) +{ + if (strchr(name, '/') || strchr(name, '\\') || strchr(name, ':')) + return FALSE; + + if (!name[strspn(name, ".")]) /* entirely composed of dots */ + return FALSE; + + return TRUE; +} + int create_directory(char *name) { return CreateDirectory(name, NULL) != 0; @@ -462,7 +481,7 @@ char *dir_file_cat(char *dir, char *file) /* * 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) { @@ -676,7 +695,7 @@ static DWORD WINAPI command_read_thread(void *param) 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; @@ -685,7 +704,8 @@ char *ssh_sftp_get_cmdline(char *prompt) 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 */ }