1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
31 #include <windows.h>
\r
36 #include <windowsx.h>
\r
37 #include <commctrl.h>
\r
40 #include "resource.h"
\r
48 #define FD_CONNECT_BIT 0x0001
\r
49 #define FD_CLOSE_BIT 0x0002
\r
50 #define FD_ACCEPT_BIT 0x0004
\r
51 #define FD_READ_BIT 0x0008
\r
52 #define FD_WRITE_BIT 0x0010
\r
73 } ASYNCSIGNALDATABASE;
\r
76 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
77 //#define MAX_SIGNAL_ENTRY 10
\r
78 //#define MAX_SIGNAL_ENTRY_DBASE 5
\r
79 #define MAX_SIGNAL_ENTRY 100
\r
80 #define MAX_SIGNAL_ENTRY_DBASE 50
\r
85 /*=====
\83v
\83\8d\83g
\83^
\83C
\83v =====*/
\r
87 static LRESULT CALLBACK SocketWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
88 static int AskAsyncDone(SOCKET s, int *Error, int Mask);
\r
89 static int AskAsyncDoneDbase(HANDLE Async, int *Error);
\r
90 static int RegistAsyncTable(SOCKET s);
\r
91 static int RegistAsyncTableDbase(HANDLE Async);
\r
92 static int UnRegistAsyncTable(SOCKET s);
\r
93 static int UnRegistAsyncTableDbase(HANDLE Async);
\r
96 /*=====
\8aO
\95\94\8eQ
\8fÆ =====*/
\r
101 /*=====
\83\8d\81[
\83J
\83\8b\82È
\83\8f\81[
\83N =====*/
\r
103 static const char SocketWndClass[] = "FFFTPSocketWnd";
\r
104 static HWND hWndSocket;
\r
106 static ASYNCSIGNAL Signal[MAX_SIGNAL_ENTRY];
\r
107 static ASYNCSIGNALDATABASE SignalDbase[MAX_SIGNAL_ENTRY_DBASE];
\r
109 //static HANDLE hAsyncTblAccMutex;
\r
110 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
111 static HANDLE hAsyncTblAccMutex;
\r
122 * int
\83X
\83e
\81[
\83^
\83X
\r
124 *----------------------------------------------------------------------------*/
\r
126 int MakeSocketWin(HWND hWnd, HINSTANCE hInst)
\r
132 wClass.cbSize = sizeof(WNDCLASSEX);
\r
134 wClass.lpfnWndProc = SocketWndProc;
\r
135 wClass.cbClsExtra = 0;
\r
136 wClass.cbWndExtra = 0;
\r
137 wClass.hInstance = hInst;
\r
138 wClass.hIcon = NULL;
\r
139 wClass.hCursor = NULL;
\r
140 wClass.hbrBackground = (HBRUSH)CreateSolidBrush(GetSysColor(COLOR_INFOBK));
\r
141 wClass.lpszMenuName = NULL;
\r
142 wClass.lpszClassName = SocketWndClass;
\r
143 wClass.hIconSm = NULL;
\r
144 RegisterClassEx(&wClass);
\r
147 hWndSocket = CreateWindowEx(0, SocketWndClass, NULL,
\r
148 WS_BORDER | WS_POPUP,
\r
150 hWnd, NULL, hInst, NULL);
\r
152 if(hWndSocket != NULL)
\r
154 // hAsyncTblAccMutex = CreateMutex(NULL, FALSE, NULL);
\r
156 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
157 // for(i = 0; i < MAX_SIGNAL_ENTRY; i++)
\r
158 // Signal[i].Socket = INVALID_SOCKET;
\r
159 // for(i = 0; i < MAX_SIGNAL_ENTRY_DBASE; i++)
\r
160 // SignalDbase[i].Async = 0;
\r
161 if(hAsyncTblAccMutex = CreateMutex(NULL, FALSE, NULL))
\r
163 for(i = 0; i < MAX_SIGNAL_ENTRY; i++)
\r
164 Signal[i].Socket = INVALID_SOCKET;
\r
165 for(i = 0; i < MAX_SIGNAL_ENTRY_DBASE; i++)
\r
166 SignalDbase[i].Async = 0;
\r
181 *----------------------------------------------------------------------------*/
\r
183 void DeleteSocketWin(void)
\r
185 // CloseHandle(hAsyncTblAccMutex);
\r
186 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
187 CloseHandle(hAsyncTblAccMutex);
\r
188 hAsyncTblAccMutex = NULL;
\r
190 if(hWndSocket != NULL)
\r
191 DestroyWindow(hWndSocket);
\r
199 * HWND hWnd :
\83E
\83C
\83\93\83h
\83E
\83n
\83\93\83h
\83\8b\r
200 * UINT message :
\83\81\83b
\83Z
\81[
\83W
\94Ô
\8d\86\r
201 * WPARAM wParam :
\83\81\83b
\83Z
\81[
\83W
\82Ì WPARAM
\88ø
\90\94\r
202 * LPARAM lParam :
\83\81\83b
\83Z
\81[
\83W
\82Ì LPARAM
\88ø
\90\94\r
206 *----------------------------------------------------------------------------*/
\r
208 static LRESULT CALLBACK SocketWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
214 case WM_ASYNC_SOCKET :
\r
215 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
216 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
217 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
\r
219 if(Signal[Pos].Socket == (SOCKET)wParam)
\r
221 Signal[Pos].Error = WSAGETSELECTERROR(lParam);
\r
223 if(WSAGETSELECTERROR(lParam) != 0)
\r
224 DoPrintf("####### Signal: error (%d)", WSAGETSELECTERROR(lParam));
\r
227 switch(WSAGETSELECTEVENT(lParam))
\r
230 Signal[Pos].FdConnect = 1;
\r
232 DoPrintf("####### Signal: connect (S=%x)", Signal[Pos].Socket);
\r
237 Signal[Pos].FdClose = 1;
\r
239 DoPrintf("####### Signal: close (S=%x)", Signal[Pos].Socket);
\r
241 //SetTaskMsg("####### Signal: close (%d) (S=%x)", Pos, Signal[Pos].Socket);
\r
245 Signal[Pos].FdAccept = 1;
\r
247 DoPrintf("####### Signal: accept (S=%x)", Signal[Pos].Socket);
\r
252 Signal[Pos].FdRead = 1;
\r
254 DoPrintf("####### Signal: read (S=%x)", Signal[Pos].Socket);
\r
259 Signal[Pos].FdWrite = 1;
\r
261 DoPrintf("####### Signal: write (S=%x)", Signal[Pos].Socket);
\r
268 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
269 ReleaseMutex(hAsyncTblAccMutex);
\r
272 case WM_ASYNC_DBASE :
\r
273 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
274 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
275 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)
\r
277 if(SignalDbase[Pos].Async == (HANDLE)wParam)
\r
279 if(HIWORD(lParam) != 0)
\r
281 SignalDbase[Pos].ErrorDb = 1;
\r
283 DoPrintf("##### SignalDatabase: error");
\r
286 SignalDbase[Pos].Done = 1;
\r
288 DoPrintf("##### SignalDatabase: Done");
\r
293 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
294 ReleaseMutex(hAsyncTblAccMutex);
\r
298 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
313 *----------------------------------------------------------------------------*/
\r
315 static int AskAsyncDone(SOCKET s, int *Error, int Mask)
\r
320 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
321 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
324 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
\r
326 if(Signal[Pos].Socket == s)
\r
328 *Error = Signal[Pos].Error;
\r
329 if(Signal[Pos].Error != 0)
\r
331 if((Mask & FD_CONNECT_BIT) && (Signal[Pos].FdConnect != 0))
\r
335 DoPrintf("### Ask: connect (Sts=%d, Error=%d)", Sts, *Error);
\r
338 if((Mask & FD_CLOSE_BIT) && (Signal[Pos].FdClose != 0))
\r
339 // if(Mask & FD_CLOSE_BIT)
\r
343 DoPrintf("### Ask: close (Sts=%d, Error=%d)", Sts, *Error);
\r
346 if((Mask & FD_ACCEPT_BIT) && (Signal[Pos].FdAccept != 0))
\r
348 Signal[Pos].FdAccept = 0;
\r
351 DoPrintf("### Ask: accept (Sts=%d, Error=%d)", Sts, *Error);
\r
354 if((Mask & FD_READ_BIT) && (Signal[Pos].FdRead != 0))
\r
356 Signal[Pos].FdRead = 0;
\r
359 DoPrintf("### Ask: read (Sts=%d, Error=%d)", Sts, *Error);
\r
362 if((Mask & FD_WRITE_BIT) && (Signal[Pos].FdWrite != 0))
\r
364 Signal[Pos].FdWrite = 0;
\r
367 DoPrintf("### Ask: write (Sts=%d, Error=%d)", Sts, *Error);
\r
373 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
374 ReleaseMutex(hAsyncTblAccMutex);
\r
376 if(Pos == MAX_SIGNAL_ENTRY)
\r
378 if(Mask & FD_CLOSE_BIT)
\r
384 MessageBox(GetMainHwnd(), "AskAsyncDone called with unregisterd socket.", "FFFTP inner error", MB_OK);
\r
399 *----------------------------------------------------------------------------*/
\r
401 static int AskAsyncDoneDbase(HANDLE Async, int *Error)
\r
406 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
407 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
410 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)
\r
412 if(SignalDbase[Pos].Async == Async)
\r
414 if(SignalDbase[Pos].Done != 0)
\r
416 *Error = SignalDbase[Pos].ErrorDb;
\r
419 DoPrintf("### Ask: Dbase (Sts=%d, Error=%d)", Sts, *Error);
\r
425 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
426 ReleaseMutex(hAsyncTblAccMutex);
\r
428 if(Pos == MAX_SIGNAL_ENTRY_DBASE)
\r
430 MessageBox(GetMainHwnd(), "AskAsyncDoneDbase called with unregisterd handle.", "FFFTP inner error", MB_OK);
\r
445 *----------------------------------------------------------------------------*/
\r
447 static int RegistAsyncTable(SOCKET s)
\r
452 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
453 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
455 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
\r
457 if(Signal[Pos].Socket == s)
\r
459 MessageBox(GetMainHwnd(), "Async socket already registerd.", "FFFTP inner error", MB_OK);
\r
463 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
464 ReleaseMutex(hAsyncTblAccMutex);
\r
466 if(Pos == MAX_SIGNAL_ENTRY)
\r
468 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
469 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
470 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
\r
472 if(Signal[Pos].Socket == INVALID_SOCKET)
\r
475 //SetTaskMsg("############### Regist socket (%d)", Pos);
\r
477 Signal[Pos].Socket = s;
\r
478 Signal[Pos].Error = 0;
\r
479 Signal[Pos].FdConnect = 0;
\r
480 Signal[Pos].FdClose = 0;
\r
481 Signal[Pos].FdAccept = 0;
\r
482 Signal[Pos].FdRead = 0;
\r
483 Signal[Pos].FdWrite = 0;
\r
488 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
489 ReleaseMutex(hAsyncTblAccMutex);
\r
491 if(Pos == MAX_SIGNAL_ENTRY)
\r
493 MessageBox(GetMainHwnd(), "No more async regist space.", "FFFTP inner error", MB_OK);
\r
509 *----------------------------------------------------------------------------*/
\r
511 static int RegistAsyncTableDbase(HANDLE Async)
\r
516 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
517 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
519 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)
\r
521 if(SignalDbase[Pos].Async == Async)
\r
523 MessageBox(GetMainHwnd(), "Async handle already registerd.", "FFFTP inner error", MB_OK);
\r
527 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
528 ReleaseMutex(hAsyncTblAccMutex);
\r
530 if(Pos == MAX_SIGNAL_ENTRY_DBASE)
\r
532 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
533 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
534 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
\r
536 if(SignalDbase[Pos].Async == 0)
\r
539 //SetTaskMsg("############### Regist dbase (%d)", Pos);
\r
541 SignalDbase[Pos].Async = Async;
\r
542 SignalDbase[Pos].Done = 0;
\r
543 SignalDbase[Pos].ErrorDb = 0;
\r
548 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
549 ReleaseMutex(hAsyncTblAccMutex);
\r
551 if(Pos == MAX_SIGNAL_ENTRY_DBASE)
\r
553 MessageBox(GetMainHwnd(), "No more async dbase regist space.", "FFFTP inner error", MB_OK);
\r
569 *----------------------------------------------------------------------------*/
\r
571 static int UnRegistAsyncTable(SOCKET s)
\r
576 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
577 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
579 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
\r
581 if(Signal[Pos].Socket == s)
\r
584 //SetTaskMsg("############### UnRegist socket (%d)", Pos);
\r
586 Signal[Pos].Socket = INVALID_SOCKET;
\r
591 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
592 ReleaseMutex(hAsyncTblAccMutex);
\r
604 *----------------------------------------------------------------------------*/
\r
606 static int UnRegistAsyncTableDbase(HANDLE Async)
\r
611 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
612 WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
\r
614 for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)
\r
616 if(SignalDbase[Pos].Async == Async)
\r
619 //SetTaskMsg("############### UnRegist dbase (%d)", Pos);
\r
621 SignalDbase[Pos].Async = 0;
\r
626 //
\83X
\83\8c\83b
\83h
\8fÕ
\93Ë
\82Ì
\83o
\83O
\8fC
\90³
\r
627 ReleaseMutex(hAsyncTblAccMutex);
\r
638 struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork)
\r
641 struct hostent *Ret;
\r
646 DoPrintf("# Start gethostbyname");
\r
649 *CancelCheckWork = NO;
\r
651 hAsync = WSAAsyncGetHostByName(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len);
\r
654 RegistAsyncTableDbase(hAsync);
\r
655 while((*CancelCheckWork == NO) && (AskAsyncDoneDbase(hAsync, &Error) != YES))
\r
658 if(BackgrndMessageProc() == YES)
\r
659 *CancelCheckWork = YES;
\r
662 if(*CancelCheckWork == YES)
\r
664 WSACancelAsyncRequest(hAsync);
\r
666 else if(Error == 0)
\r
668 Ret = (struct hostent *)Buf;
\r
670 UnRegistAsyncTableDbase(hAsync);
\r
674 return(gethostbyname(Name));
\r
682 SOCKET do_socket(int af, int type, int protocol)
\r
686 Ret = socket(af, type, protocol);
\r
687 if(Ret != INVALID_SOCKET)
\r
689 RegistAsyncTable(Ret);
\r
692 DoPrintf("# do_socket (S=%x)", Ret);
\r
699 int do_closesocket(SOCKET s)
\r
704 int CancelCheckWork;
\r
707 DoPrintf("# Start close (S=%x)", s);
\r
709 CancelCheckWork = NO;
\r
712 // Ret = closesocket(s);
\r
713 if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)
\r
714 Ret = closesocketS(s);
\r
716 Ret = closesocket(s);
\r
717 if(Ret == SOCKET_ERROR)
\r
720 while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CLOSE_BIT) != YES))
\r
723 if(BackgrndMessageProc() == YES)
\r
724 CancelCheckWork = YES;
\r
727 if((CancelCheckWork == NO) && (Error == 0))
\r
731 WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, 0);
\r
732 if(BackgrndMessageProc() == YES)
\r
733 CancelCheckWork = YES;
\r
734 UnRegistAsyncTable(s);
\r
737 DoPrintf("# Exit close");
\r
741 return(closesocket(s));
\r
750 int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCheckWork)
\r
757 DoPrintf("# Start connect (S=%x)", s);
\r
759 *CancelCheckWork = NO;
\r
762 DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE");
\r
764 Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE);
\r
765 if(Ret != SOCKET_ERROR)
\r
768 // Ret = connect(s, name, namelen);
\r
769 if(AskCryptMode() == CRYPT_FTPIS)
\r
770 Ret = connectS(s, name, namelen);
\r
772 Ret = connect(s, name, namelen);
\r
773 if(Ret == SOCKET_ERROR)
\r
778 while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CONNECT_BIT) != YES))
\r
781 if(BackgrndMessageProc() == YES)
\r
782 *CancelCheckWork = YES;
\r
785 if(*CancelCheckWork == YES)
\r
791 // Error = WSAGetLastError();
\r
792 DoPrintf("#### Connect: Error=%d", Error);
\r
795 while((Ret != 0) && (Error == WSAEWOULDBLOCK));
\r
799 DoPrintf("#### Connect: AsyncSelect error (%d)", WSAGetLastError());
\r
802 DoPrintf("# Exit connect (%d)", Ret);
\r
806 return(connect(s, name, namelen));
\r
814 int do_listen(SOCKET s, int backlog)
\r
820 DoPrintf("# Start listen (S=%x)", s);
\r
821 DoPrintf("## Async set: FD_CLOSE|FD_ACCEPT");
\r
824 Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CLOSE | FD_ACCEPT);
\r
825 if(Ret != SOCKET_ERROR)
\r
826 Ret = listen(s, backlog);
\r
829 DoPrintf("# Exit listen (%d)", Ret);
\r
836 SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen)
\r
840 int CancelCheckWork;
\r
844 DoPrintf("# Start accept (S=%x)", s);
\r
846 CancelCheckWork = NO;
\r
847 Ret2 = INVALID_SOCKET;
\r
850 while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_ACCEPT_BIT) != YES))
\r
852 if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)
\r
858 if(BackgrndMessageProc() == YES)
\r
859 CancelCheckWork = YES;
\r
862 if((CancelCheckWork == NO) && (Error == 0))
\r
867 // Ret2 = accept(s, addr, addrlen);
\r
868 if(AskCryptMode() == CRYPT_FTPIS)
\r
869 Ret2 = acceptS(s, addr, addrlen);
\r
871 Ret2 = accept(s, addr, addrlen);
\r
872 if(Ret2 != INVALID_SOCKET)
\r
875 DoPrintf("## do_sccept (S=%x)", Ret2);
\r
876 DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE");
\r
878 RegistAsyncTable(Ret2);
\r
879 if(WSAAsyncSelect(Ret2, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE) == SOCKET_ERROR)
\r
881 do_closesocket(Ret2);
\r
882 Ret2 = INVALID_SOCKET;
\r
886 Error = WSAGetLastError();
\r
888 if(BackgrndMessageProc() == YES)
\r
891 while(Error == WSAEWOULDBLOCK);
\r
895 DoPrintf("# Exit accept");
\r
899 return(accept(s, addr, addrlen));
\r
906 /*----- recv
\91\8a\93\96\82Ì
\8aÖ
\90\94 --------------------------------------------------------
\r
909 * SOCKET s :
\83\
\83P
\83b
\83g
\r
910 * char *buf :
\83f
\81[
\83^
\82ð
\93Ç
\82Ý
\8d\9e\82Þ
\83o
\83b
\83t
\83@
\r
911 * int len :
\92·
\82³
\r
912 * int flags : recv
\82É
\97^
\82¦
\82é
\83t
\83\89\83O
\r
913 * int *TimeOutErr :
\83^
\83C
\83\80\83A
\83E
\83g
\82µ
\82½
\82©
\82Ç
\82¤
\82©
\82ð
\95Ô
\82·
\83\8f\81[
\83N
\r
916 * int : recv
\82Ì
\96ß
\82è
\92l
\82Æ
\93¯
\82¶
\r
919 *
\83^
\83C
\83\80\83A
\83E
\83g
\82Ì
\8e\9e\82Í TimeOut=YES
\81ARet=SOCKET_ERROR
\82É
\82È
\82é
\r
920 *----------------------------------------------------------------------------*/
\r
921 int do_recv(SOCKET s, char *buf, int len, int flags, int *TimeOutErr, int *CancelCheckWork)
\r
930 DoPrintf("# Start recv (S=%x)", s);
\r
933 *CancelCheckWork = NO;
\r
934 Ret = SOCKET_ERROR;
\r
941 // OpenSSL
\82Å
\82Í
\8eó
\90M
\8am
\94F
\82ÍFD_READ
\82ª
\95¡
\90\94\89ñ
\8eó
\90M
\82³
\82ê
\82é
\89Â
\94\
\90«
\82ª
\82 \82é
\r
942 // while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES))
\r
943 while(AskCryptMode() == CRYPT_NONE && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES))
\r
945 if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)
\r
951 if(BackgrndMessageProc() == YES)
\r
952 *CancelCheckWork = YES;
\r
953 else if(TimeOut != 0)
\r
956 ElapseTime -= StartTime;
\r
957 if(ElapseTime >= TimeOut)
\r
959 DoPrintf("do_recv timed out");
\r
961 *CancelCheckWork = YES;
\r
966 if(/*(Ret != 0) && */(Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO))
\r
971 DoPrintf("## recv()");
\r
975 // Ret = recv(s, buf, len, flags);
\r
976 if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)
\r
977 Ret = recvS(s, buf, len, flags);
\r
979 Ret = recv(s, buf, len, flags);
\r
980 if(Ret != SOCKET_ERROR)
\r
982 Error = WSAGetLastError();
\r
984 if(BackgrndMessageProc() == YES)
\r
987 //
\8eó
\90M
\8am
\94F
\82ð
\83o
\83C
\83p
\83X
\82µ
\82½
\82½
\82ß
\82±
\82±
\82Å
\83^
\83C
\83\80\83A
\83E
\83g
\82Ì
\8am
\94F
\r
988 if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)
\r
990 if(BackgrndMessageProc() == YES)
\r
991 *CancelCheckWork = YES;
\r
993 else if(TimeOut != 0)
\r
996 ElapseTime -= StartTime;
\r
997 if(ElapseTime >= TimeOut)
\r
999 DoPrintf("do_recv timed out");
\r
1000 *TimeOutErr = YES;
\r
1001 *CancelCheckWork = YES;
\r
1004 if(*CancelCheckWork == YES)
\r
1007 while(Error == WSAEWOULDBLOCK);
\r
1010 if(BackgrndMessageProc() == YES)
\r
1011 Ret = SOCKET_ERROR;
\r
1014 DoPrintf("# Exit recv (%d)", Ret);
\r
1018 return(recv(s, buf, len, flags));
\r
1024 int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int *CancelCheckWork)
\r
1029 time_t ElapseTime;
\r
1033 DoPrintf("# Start send (S=%x)", s);
\r
1036 *CancelCheckWork = NO;
\r
1037 Ret = SOCKET_ERROR;
\r
1044 DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE");
\r
1046 WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE);
\r
1047 if(BackgrndMessageProc() == YES)
\r
1048 *CancelCheckWork = YES;
\r
1051 //
\91\97\90M
\83o
\83b
\83t
\83@
\82Ì
\8bó
\82«
\8am
\94F
\82É
\82Í
\89e
\8b¿
\82µ
\82È
\82¢
\82ª
\94O
\82Ì
\82½
\82ß
\r
1052 // while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))
\r
1053 while(AskCryptMode() == CRYPT_NONE && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))
\r
1055 if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)
\r
1062 if(BackgrndMessageProc() == YES)
\r
1063 *CancelCheckWork = YES;
\r
1064 else if(TimeOut != 0)
\r
1066 time(&ElapseTime);
\r
1067 ElapseTime -= StartTime;
\r
1068 if(ElapseTime >= TimeOut)
\r
1070 DoPrintf("do_write timed out");
\r
1071 *TimeOutErr = YES;
\r
1072 *CancelCheckWork = YES;
\r
1077 if((Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO))
\r
1082 DoPrintf("## send()");
\r
1086 // Ret = send(s, buf, len, flags);
\r
1087 if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)
\r
1088 Ret = sendS(s, buf, len, flags);
\r
1090 Ret = send(s, buf, len, flags);
\r
1091 if(Ret != SOCKET_ERROR)
\r
1094 DoPrintf("## send() OK");
\r
1098 Error = WSAGetLastError();
\r
1100 if(BackgrndMessageProc() == YES)
\r
1103 //
\91\97\90M
\83o
\83b
\83t
\83@
\8am
\94F
\82ð
\83o
\83C
\83p
\83X
\82µ
\82½
\82½
\82ß
\82±
\82±
\82Å
\83^
\83C
\83\80\83A
\83E
\83g
\82Ì
\8am
\94F
\r
1104 if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)
\r
1106 if(BackgrndMessageProc() == YES)
\r
1107 *CancelCheckWork = YES;
\r
1109 else if(TimeOut != 0)
\r
1111 time(&ElapseTime);
\r
1112 ElapseTime -= StartTime;
\r
1113 if(ElapseTime >= TimeOut)
\r
1115 DoPrintf("do_recv timed out");
\r
1116 *TimeOutErr = YES;
\r
1117 *CancelCheckWork = YES;
\r
1120 if(*CancelCheckWork == YES)
\r
1123 while(Error == WSAEWOULDBLOCK);
\r
1126 if(BackgrndMessageProc() == YES)
\r
1127 Ret = SOCKET_ERROR;
\r
1130 DoPrintf("# Exit send (%d)", Ret);
\r
1134 return(send(s, buf, len, flags));
\r
1144 * int
\83X
\83e
\81[
\83^
\83X
\r
1146 *----------------------------------------------------------------------------*/
\r
1148 int CheckClosedAndReconnect(void)
\r
1153 //SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
\r
1156 if(AskAsyncDone(AskCmdCtrlSkt(), &Error, FD_CLOSE_BIT) == YES)
\r
1158 Sts = ReConnectCmdSkt();
\r