The WinSock library is now loaded at run-time, which means we can
[u/mdw/putty] / winsftp.c
index a4dafd4..a399f45 100644 (file)
--- a/winsftp.c
+++ b/winsftp.c
@@ -2,15 +2,6 @@
  * winsftp.c: the Windows-specific parts of PSFTP and PSCP.
  */
 
-#include <windows.h>
-#ifndef AUTO_WINSOCK
-#ifdef WINSOCK_TWO
-#include <winsock2.h>
-#else
-#include <winsock.h>
-#endif
-#endif
-
 #include "putty.h"
 #include "psftp.h"
 
@@ -303,6 +294,7 @@ DirHandle *open_directory(char *name)
     h = FindFirstFile(findfile, &fdat);
     if (h == INVALID_HANDLE_VALUE)
        return NULL;
+    sfree(findfile);
 
     ret = snew(DirHandle);
     ret->h = h;
@@ -312,11 +304,18 @@ DirHandle *open_directory(char *name)
 
 char *read_filename(DirHandle *dir)
 {
-    if (!dir->name) {
+    while (!dir->name) {
        WIN32_FIND_DATA fdat;
        int ok = FindNextFile(dir->h, &fdat);
 
-       if (ok)
+       if (!ok)
+           return NULL;
+
+       if (fdat.cFileName[0] == '.' &&
+           (fdat.cFileName[1] == '\0' ||
+            (fdat.cFileName[1] == '.' && fdat.cFileName[2] == '\0')))
+           dir->name = NULL;
+       else
            dir->name = dupstr(fdat.cFileName);
     }
 
@@ -449,6 +448,11 @@ int create_directory(char *name)
     return CreateDirectory(name, NULL) != 0;
 }
 
+char *dir_file_cat(char *dir, char *file)
+{
+    return dupcat(dir, "\\", file, NULL);
+}
+
 /* ----------------------------------------------------------------------
  * Platform-specific network handling.
  */
@@ -468,25 +472,6 @@ char *do_select(SOCKET skt, int startup)
 extern int select_result(WPARAM, LPARAM);
 
 /*
- * Initialize the WinSock driver.
- */
-static void init_winsock(void)
-{
-    WORD winsock_ver;
-    WSADATA wsadata;
-
-    winsock_ver = MAKEWORD(1, 1);
-    if (WSAStartup(winsock_ver, &wsadata)) {
-       fprintf(stderr, "Unable to initialise WinSock");
-       cleanup_exit(1);
-    }
-    if (LOBYTE(wsadata.wVersion) != 1 || HIBYTE(wsadata.wVersion) != 1) {
-       fprintf(stderr, "WinSock version is incompatible with 1.1");
-       cleanup_exit(1);
-    }
-}
-
-/*
  * Wait for some network data and process it.
  */
 int ssh_sftp_loop_iteration(void)
@@ -498,7 +483,7 @@ int ssh_sftp_loop_iteration(void)
 
     FD_ZERO(&readfds);
     FD_SET(sftp_ssh_socket, &readfds);
-    if (select(1, &readfds, NULL, NULL, NULL) < 0)
+    if (p_select(1, &readfds, NULL, NULL, NULL) < 0)
        return -1;                     /* doom */
 
     select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_READ);
@@ -512,9 +497,7 @@ int main(int argc, char *argv[])
 {
     int ret;
 
-    init_winsock();
     ret = psftp_main(argc, argv);
-    WSACleanup();
 
     return ret;
 }