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

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 : WarFsys.cpp
  16. // PURPOSE : Memory optimized file system for the War Daemons
  17. // PROGRAM : 
  18. // DATE : March 11 1997
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. //
  22. // Overview:
  23. // This dll provides the higher levels in the server with file system calls.
  24. // The file system support UNIX/VFsys file attributes, VFsys and Win95/NT 4 
  25. // soft-links and true multithread/multiprocess access.
  26. //
  27. // This implementation use a UNIX file system only. That is, all paths are '/'
  28. // Each user has his own 'virtual' environment with one or more root path's.
  29. // If one root path is used, the root will be the physical entry point for that
  30. // path. If the root is /, a list with all disk drives will be created as 
  31. // a maps.
  32. // If a user has a map as root directory, a 'virtual' directory is created for
  33. // that user, He will then not have write access to the root dir.
  34. // Listed directories are cached, and used as the primary file system until
  35. // the cache expire. Changes in the file system will be reflected in the cache.
  36. // This should speed things up a bit...
  37. //
  38. // Only one file system dll might be running at one time pr. machine. All
  39. // daemons will share the same file system.
  40. //
  41. // Exports are done in the .def file.
  42. // 
  43. // REVISION HISTORY
  44. // 
  45. #include "stdafx.h"
  46. #include "WarDaemon.h"
  47. #include "WarSMemory.h"
  48. #include "WarFsys.h"
  49. #include "WarFsysDll.h"
  50. #include <afxdllx.h>
  51. #ifdef _DEBUG
  52. #define new DEBUG_NEW
  53. #undef THIS_FILE
  54. static char THIS_FILE[] = __FILE__;
  55. #endif
  56. #define LogMsg FsysLogMsg 
  57. static AFX_EXTENSION_MODULE WarFsysDLL = { NULL, NULL };
  58. int Initialize();
  59. WAR_FSYS_HDR *GetFsysHdr(CSharedMemSegment *pSharedMem);
  60. WAR_FSYS_HDR *pFsysHdr = NULL;
  61. CSharedMemSegment *pSharedMem;
  62. extern "C" int APIENTRY
  63. DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  64. {
  65. if (dwReason == DLL_PROCESS_ATTACH)
  66. {
  67. LogMsg(LOGF_SYSTEM,"WARFSYS.DLL Initializing! Basic, memory optimized file system.");
  68. // Extension DLL one-time initialization
  69. AfxInitExtensionModule(WarFsysDLL, hInstance);
  70. // Insert this DLL into the resource chain
  71. new CDynLinkLibrary(WarFsysDLL);
  72. }
  73. else if (dwReason == DLL_PROCESS_DETACH)
  74. {
  75. LogMsg(LOGF_DEBUG,"WARFSYS.DLL Terminating!");
  76. if (pSharedMem)
  77. delete pSharedMem;
  78. }
  79. return Initialize();
  80. }
  81. // Initialize global memory
  82. int Initialize()
  83. {
  84. if (!pSharedMem)
  85. {
  86. pSharedMem = new CSharedMemSegment;
  87. if (pSharedMem->Create("WarFsysShared", sizeof(WAR_FSYS_HDR), FALSE) == NULL)
  88. {
  89. delete pSharedMem;
  90. return 0;
  91. }
  92. // See if we have to initialize
  93. pFsysHdr = GetFsysHdr(pSharedMem);
  94. }
  95. return pFsysHdr != NULL;
  96. }
  97. WAR_FSYS_HDR *GetFsysHdr(CSharedMemSegment *pSharedMem)
  98. {
  99. WAR_FSYS_HDR *pHdr = NULL;
  100. CGlobalLock Lock(WAR_FSYS_SHARED_LOCK);
  101. pHdr = (WAR_FSYS_HDR *)pSharedMem->GetDataPtr();
  102. if (!pHdr->IsInitialized)
  103. {
  104. // Initialize
  105. CString Path = GetStartupPath(), cBuf;
  106. LPSTR p = Path.GetBuffer(1);
  107. p = strrchr(p, '\');
  108. if (!p)
  109. return NULL;
  110. *p = 0;
  111. Path.ReleaseBuffer();
  112. cBuf = Path;
  113. cBuf += "\Daemons\.Index\";
  114. strcpy(PrivateIndexPath, cBuf);
  115. cBuf = Path;
  116. cBuf += "\Daemons\WarFsys.ini";
  117. strcpy(PrivateIniPath, cBuf);
  118. pHdr->IsInitialized = TRUE;
  119. }
  120. return pHdr;
  121. }
  122. void FsysLogMsg(int flag, LPCSTR Format, ...)
  123. {
  124. if (!ShouldLog(CLog::GetLog(), flag))
  125. return;
  126. {
  127. CString cBuf;
  128. ASSERT(AfxIsValidString(Format, FALSE));
  129. cBuf.Format("WARFSYS.DLL: %s", Format);
  130. va_list argList;
  131. va_start(argList, Format);
  132. CLog::GetLog()->LogMsgV(flag, cBuf, argList);
  133. va_end(argList);
  134. }
  135. }
  136. ///////////////////////////////////////////////////////////////////////////////////
  137. // API entry point functions
  138. HANDLE fsys_OpenFsys(
  139.  LPCSTR RootPath, 
  140.  LPCSTR Maps, 
  141.  LPCSTR HomeDir, 
  142.  USER User, 
  143.  USER Class, 
  144.  BOOL IsAdmin, 
  145.  HANDLE hNTsec
  146.  )
  147. {
  148. return INVALID_HANDLE_VALUE;
  149. }
  150. void fsys_CloseFsys(HANDLE hFsys)
  151. {
  152. }
  153. BOOL fsys_ChDir(HANDLE hFsys, LPCSTR Path)
  154. {
  155. return TRUE;
  156. }
  157. BOOL fsys_CanAccess(HANDLE hFsys, LPCSTR Path, int AccessMode)
  158. {
  159. return TRUE;
  160. }
  161. HANDLE fsys_CreateFile(
  162. HANDLE hFsys,
  163.     LPCTSTR lpFileName, // pointer to name of the file 
  164.     DWORD dwDesiredAccess, // access (read-write) mode 
  165.     DWORD dwShareMode, // share mode 
  166.     LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security descriptor 
  167.     DWORD dwCreationDistribution, // how to create 
  168.     DWORD dwFlagsAndAttributes, // file attributes 
  169.     HANDLE hTemplateFile  // handle to file with attributes to copy  
  170.    )
  171. {
  172. return INVALID_HANDLE_VALUE;
  173. }
  174. BOOL fsys_CreateDirectory(HANDLE hFsys, LPCSTR Path)
  175. {
  176. return TRUE;
  177. }
  178. BOOL fsys_DeleteFile(HANDLE hFsys, LPCSTR Path)
  179. {
  180. return TRUE;
  181. }
  182. FLEN fsys_GetDiskFreeSpace(HANDLE hFsys, LPCSTR Path)
  183. {
  184. return TRUE;
  185. }
  186. BOOL fsys_MoveFile(HANDLE hFsys, LPCTSTR ExistingFileName, LPCTSTR NewFileName) 
  187. {
  188. return TRUE;
  189. }
  190. HANDLE fsys_GetOSHandle(HANDLE hFile)
  191. {
  192. return INVALID_HANDLE_VALUE;
  193. }
  194. void fsys_CloseHandle(HANDLE hFsys)
  195. {
  196. }
  197. HANDLE fsys_FindFirstFile(HANDLE hFsys, LPCTSTR lpFileName, CFileInfo& FileInfo)
  198. {
  199. return INVALID_HANDLE_VALUE;
  200. }
  201. BOOL fsys_FindNextFile(HANDLE hFindFile, CFileInfo& FileInfo)
  202. {
  203. return TRUE;
  204. }
  205. void fsys_FindClose(HANDLE hFindFile)
  206. {
  207. }
  208. CString fsys_GetCWD(HANDLE hFsys)
  209. {
  210. return "";
  211. }
  212. ///////////////////////////////////////////////////////////////////////////////////
  213. // CWarFsysHandle
  214. CSharedBlksMem *CWarFsysHandle::m_pSM = NULL;
  215. int CWarFsysHandle::m_NumObjects = 0;
  216. CWarFsysHandle::CWarFsysHandle()
  217. {
  218. ++m_NumObjects;
  219. }
  220. CWarFsysHandle::~CWarFsysHandle()
  221. {
  222. if (!--m_NumObjects && m_pSM)
  223. delete m_pSM; // Last one out clean's up
  224. }
  225. HANDLE CWarFsysHandle::OpenFsys(
  226. LPCSTR RootPath, 
  227. LPCSTR Maps, 
  228. LPCSTR HomeDir, 
  229. USER User, 
  230. USER Class, 
  231. BOOL IsAdmin, 
  232. HANDLE hNTsec);
  233. {
  234. if (!m_pSM)
  235. {
  236. // Create shared memory for file system cache
  237. int CacheBlkSize = GetPrivateProfileInt("Shared memory", "seglen", (1024 * 1024), pFsysHdr->PrivateIniPath);
  238. CString cBuf;
  239. cBuf.Format("%d", CacheBlkSize);
  240. WritePrivateProfileString("Shared memory", "seglen", cBuf, pFsysHdr->PrivateIniPath);
  241. m_pSM = new CSharedBlksMem;
  242. if (!m_pSM->Create("warfsys", CacheBlkSize))
  243. {
  244. delete m_pSM;
  245. m_pSM = NULL;
  246. FsysLogMsg(LOGF_ERROR,"CWarFsysHandle::OpenFsys() - Failed to create shared memory. (seglen=%d)", CacheBlkSize);
  247. return INVALID_HANDLE_VALUE;
  248. }
  249. // Create root node
  250. }