WarFTPDaemon.cpp
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:6k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // This is part of the WAR SOFTWARE SERIES initiated by Jarle Aase
  2. // Copyright 1996 by Jarle Aase. All rights reserved.
  3. // See the "War Software Series Licende Agreement" for details concerning 
  4. // use and distribution.
  5. // ---
  6. // This source code, executables and programs containing source code or
  7. // binaries or proprietetary technology from the War Software Series are
  8. // NOT alloed used, viewed or tested by any governmental agencies in
  9. // any countries. This includes the government, departments, police, 
  10. // military etc.
  11. // ---
  12. // This file is intended for use with Tab space = 2
  13. // Created and maintained in MSVC Developer Studio
  14. // ---
  15. // NAME : WarFTPDaemon.cpp
  16. // PURPOSE : Windows entry point
  17. // PROGRAM : War FTP Daemon
  18. // DATE : Sept. 19 1996
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. // REVISION HISTORY
  22. // 
  23. #include "stdafx.h"
  24. #define EXT // Link external vars to this module
  25. #define MAIN_MODULE // Link and initialize static data structures to this module
  26. #include "WarFTPDaemon.h" // Project header file
  27. #include "FTPDaemon.h" // FTP Daemon thread class
  28. #include "WarSoftware.h" // Standard lib
  29. #include "WarDaemon.h" // Standrad Daemon lib
  30. #include "FTPDaemonCore.h" // FTP server implementation
  31. #ifdef _DEBUG
  32. #define new DEBUG_NEW
  33. #undef THIS_FILE
  34. static char THIS_FILE[] = __FILE__;
  35. #endif
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CWarFTPDaemonApp
  38. BEGIN_MESSAGE_MAP(CWarFTPDaemonApp, CWinApp)
  39. //{{AFX_MSG_MAP(CWarFTPDaemonApp)
  40. // NOTE - the ClassWizard will add and remove mapping macros here.
  41. //    DO NOT EDIT what you see in these blocks of generated code!
  42. //}}AFX_MSG
  43. END_MESSAGE_MAP()
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CWarFTPDaemonApp construction
  46. CWarFTPDaemonApp::CWarFTPDaemonApp()
  47. {
  48. // TODO: add construction code here,
  49. // Place all significant initialization in InitInstance
  50. }
  51. /////////////////////////////////////////////////////////////////////////////
  52. // The one and only CWarFTPDaemonApp object
  53. CWarFTPDaemonApp theApp;
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CWarFTPDaemonApp initialization
  56. BOOL CWarFTPDaemonApp::InitInstance()
  57. {
  58. InitWarSoftwareLibDLL();
  59. InitWarDaemonLibDLL();
  60. InitFTPDaemonCoreDLL();
  61. CDaemon MyDaemon;
  62. COptions::SetDefaultIniFile(".\FtpDaemon.ini");
  63. MyDaemon.Process("FTP",I_PROGRAM, I_VERSION, I_COPYRIGHT, RUNTIME_CLASS(CFTPDaemon));
  64. return FALSE;
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CFTPDaemon
  68. IMPLEMENT_DYNCREATE(CFTPDaemon, CDaemonBase)
  69. CFTPDaemon::CFTPDaemon()
  70. {
  71. m_Log = gLog = new CFTPDLog;
  72. m_RemoteAdminListenSocket = new CFTPDRemoteListen;
  73. m_User = new CUsr;
  74. m_FTPD = NULL;
  75. // Initialize program version info
  76. CProgramInfo::m_PROGRAM = I_PROGRAM;
  77. CProgramInfo::m_VERSION = I_VERSION;
  78. CProgramInfo::m_COPYRIGHT = I_COPYRIGHT;
  79. CProgramInfo::m_SVRTYPE = CProgramInfo::stFTP;
  80. }
  81. CFTPDaemon::~CFTPDaemon()
  82. {
  83. delete m_User;
  84. if (m_Log)
  85. {
  86. LogMsg(LOGF_DEBUG,"~CFTPDaemon(): - Last goodbye. Closing down the log module.");
  87. delete gLog;
  88. }
  89. m_Log = NULL;
  90. }
  91. BOOL CFTPDaemon::InitInstance()
  92. {
  93. m_SysTrayIdle = AfxGetApp()->LoadIcon(IDR_WARFTPD);
  94. m_SysTrayOnline = AfxGetApp()->LoadIcon(IDI_SYSONLINE);
  95. m_SysTrayOffline = AfxGetApp()->LoadIcon(IDI_SYSOFFLINE);
  96. m_ServerStat.m_ServerType = "FTP";
  97. if (!CDaemonBase::InitInstance())
  98. return FALSE;
  99. return TRUE;
  100. }
  101. BOOL CFTPDaemon::GoOnline(BOOL Online)
  102. {
  103. if (m_FTPD)
  104. {
  105. delete m_FTPD;
  106. m_FTPD = NULL;
  107. }
  108. if (Online)
  109. {
  110. m_FTPD = new CFtpDaemonCore;
  111. if (!m_FTPD->Create(NULL, m_Log))
  112. {
  113. LogMsg(LOGF_SYSTEM,"CDaemonBase::GoOnline() - Failed to start FTP Server subsystem.");
  114. delete m_FTPD;
  115. m_FTPD = NULL;
  116. Online = FALSE;
  117. }
  118. }
  119. CDaemonStatusSvr::SetOnline(Online);
  120. return TRUE;
  121. }
  122. int CFTPDaemon::ExitInstance()
  123. {
  124. LogMsg(LOGF_SYSTEM,"Server terminating. Stopping all services...");
  125. delete m_FTPD;
  126. return CDaemonBase::ExitInstance();
  127. }
  128. /////////////////////////////////////////////////////////////////////////////
  129. // RefreshStats 
  130. // Derived to update the lower level daemon status information fro what
  131. // we know..
  132. void CFTPDaemon::RefreshStats()
  133. {
  134. CFtpDaemonCore *pFtp = CFtpDaemonCore::GetFtpSvr();
  135. ASSERT(AfxIsValidAddress(pFtp, sizeof(CFtpDaemonCore)));
  136. m_ServerStat.m_ServerName = pFtp->m_Options.m_ServerName;
  137. m_ServerStat.m_ServerEmail = pFtp->m_Options.m_ServerEmail;
  138. m_ServerStat.m_ServerPort = pFtp->m_Options.m_Port;
  139. m_ServerStat.m_ServerListeningIP = pFtp->m_Options.m_IPname;
  140. CDaemonBase::RefreshStats();
  141. }
  142. BEGIN_MESSAGE_MAP(CFTPDaemon, CDaemonBase)
  143. //{{AFX_MSG_MAP(CFTPDaemon)
  144. // NOTE - the ClassWizard will add and remove mapping macros here.
  145. //}}AFX_MSG_MAP
  146. END_MESSAGE_MAP()
  147. /////////////////////////////////////////////////////////////////////////////
  148. // CFTPDaemon message handlers
  149. void CFTPDRemoteListen::OnAccept( int nErrorCode )
  150. {
  151. CSock::OnAccept(nErrorCode);
  152. if (nErrorCode)
  153. return;
  154. CFTPDRemoteAdmin *NewSocket = new CFTPDRemoteAdmin;
  155. try
  156. {
  157. if (!DoAccept(NewSocket))
  158. {
  159. delete NewSocket;
  160. return;
  161. }
  162. }
  163. catch(CSocketException *pExc)
  164. {
  165. LogMsg(LOGF_DEBUG,"CFTPDRemoteListen::OnAccept - Caught exception '%s' from %s. New connection terminated.", 
  166. pExc->m_ErrorText, pExc->m_FromModule);
  167. if (pExc->m_pSock == NewSocket)
  168. delete NewSocket;
  169. delete pExc;
  170. return;
  171. }
  172. catch(...)
  173. {
  174. LogMsg(LOGF_ERROR,"CFTPDRemoteListen::OnAccept(%d) - Caught unknown exception. New connection terminated.", nErrorCode);
  175. return;
  176. }
  177. // Intitialize connection
  178. // Note: ":<sp>" is valid as end of line marker on last line for 
  179. // the remote admin interface.
  180. CString cBuf;
  181. cBuf.Format("%s readynLogin: ", m_SocketName);
  182. NewSocket->SendCtrlMsg(220, cBuf, FALSE, FALSE);
  183. }
  184. BOOL CFTPDRemoteListen::Initialize(int PortNumber, LPCSTR ServiceName, LPCSTR ListenIP)
  185. {
  186. if (!PortNumber)
  187. PortNumber = 22; // FTP remote admin port
  188. if (!ServiceName)
  189. ServiceName = "FTP Remote Admin";
  190. m_Type = LT_REMOTE;
  191. return CDaemonServiceSocket::Initialize(PortNumber, ServiceName, ListenIP);
  192. }