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

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.h
  16. // PURPOSE : Header file for all file systems used by the War daemons
  17. // PROGRAM : 
  18. // DATE : March 11 1997
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. //
  22. //
  23. // REVISION HISTORY
  24. // 
  25. #ifndef __WARFSYSH
  26. #define __WARFSYSH
  27. #ifndef __UNIXFSYSTYPESH
  28. #include "unixfsystypes.h"
  29. #endif
  30. #ifdef __WARDAEMONH
  31. #ifndef __USERH
  32. #include "user.h"
  33. #endif
  34. #endif
  35. class CWarFile;
  36. #define HANDLE_PENDING (HANDLE)0xfffffffe
  37. /////////////////////////////////////////////////////////////////////////////
  38. // Simple file system
  39. class DLL_WAR_SOFTWARE_ CFileInfo
  40. {
  41. public:
  42. DWORD m_Flags;
  43. DWORD m_DOSflags;
  44. USER m_User;
  45. USER m_Group;
  46. int m_Inode;
  47. int m_Links;
  48. CString m_Comment;
  49. CString m_Name;
  50. BOOL m_Hide; // Dont show in dir listings (used by ls to hide . files)
  51. FILETIME m_CreationTime;
  52. FILETIME m_LastModifyTime;
  53. FLEN m_FileSize;
  54. DWORD m_DLcount;
  55. DWORD m_SpecialNewFilePerms;
  56. USER *m_pMoreUsers; // Array of more users with class permission
  57. public:
  58. CFileInfo();
  59. ~CFileInfo();
  60. virtual LPCSTR FileName() const {return m_Name;}
  61. virtual CString MakeFileNameASCII();
  62. virtual BOOL Hide(int State);
  63. FLEN GetFileLength() {return m_FileSize;}
  64. FLEN GetFileBlocks() {return m_FileSize / (FLEN)512;}
  65. int GetInode();
  66. int GetLinks();
  67. const LPFILETIME GetModifyTime() const {return (const LPFILETIME)&m_LastModifyTime;}
  68. const LPFILETIME GetAccessTime() const {return (const LPFILETIME)&m_LastModifyTime;}
  69. const LPFILETIME GetCreationTime() const {return (const LPFILETIME)&m_CreationTime;}
  70. const LPFILETIME GetLastModeTime() const {return (const LPFILETIME)&m_LastModifyTime;}
  71. BOOL IsDirectory() {return (m_Flags & NODE_DIR);}
  72. BOOL IsReadOnly() {return (m_Flags & NODE_READONLY);}
  73. int GetFileNameLen() {return m_Name.GetLength();}
  74. DWORD GetPermissions() {return m_Flags;}
  75. LPCSTR GetComment() {return m_Comment.IsEmpty() ? (LPCSTR)NULL : (LPCSTR)m_Comment;}
  76. USER GetUser() {return m_User; }
  77. USER GetGroup() {return m_Group; }
  78. DWORD GetDLCount() {return m_DLcount; }
  79. DWORD GetSpecialNewFilePerms() {return m_SpecialNewFilePerms;}
  80. #ifdef __WARDAEMONH
  81. // Server support (this is real bad coding!!)
  82. LPCSTR CFileInfo::GetUserName(CString& cBuf) const
  83. {
  84. if (!m_User || !CUsr::FindUser(m_User,cBuf))
  85. return "root";
  86. return (LPCSTR)cBuf;
  87. }
  88. LPCSTR CFileInfo::GetGroupName(CString& cBuf) const
  89. {
  90. if (!m_Group || !CUsr::FindUser(m_Group,cBuf))
  91. return "root";
  92. return (LPCSTR)cBuf;
  93. }
  94. #else
  95. LPCSTR CFileInfo::GetUserName(CString& cBuf) const {return "root"; }
  96. LPCSTR CFileInfo::GetGroupName(CString& cBuf) const {return "root"; }
  97. #endif // __WARDAEMONH
  98. };
  99. class DLL_WAR_SOFTWARE_ CFileInfoList
  100. {
  101. public:
  102. CLinkedList m_List;
  103. int m_MaxCols;
  104. CLinkedListItem *m_Prev;
  105. CString m_FullPath;
  106. public:
  107. CFileInfoList();
  108. ~CFileInfoList();
  109. void Add(CFileInfo *Node);
  110. CFileInfo *GetNext(CFileInfo *Current);
  111. void Sort(int (*SortFunc)(const void *, const void *));
  112. BOOL ListRaw(CString& cReturnBuf, DWORD Flags = 0);
  113. };
  114. // File system driver at the physical layer
  115. class DLL_WAR_SOFTWARE_ CFileSystemTemplate
  116. {
  117. public:
  118. SMEM Name; // Name of file system
  119. SMEM LoginName; // LPCSTR network login name
  120. SMEM LoginPwd; // LPCSTR network login password
  121. SMEM NetPath; // LPCSTR physical network path in DOS format
  122. DWORD Flags; // Bitflags
  123. DWORD NumOpenFiles;
  124. DWORD NumOpenHandles; 
  125. FLEN FreeSpace; // Bytes available on system
  126. enum
  127. {
  128. COPY_TO_TEMP = 0x00000001, // Copy files to a temp dir
  129. NETLOGIN = 0x00000002, // Network - perform login
  130. ISOPEN = 0x00000004, // File system is opened
  131. ISVIRTUAL = 0x00000008, // Virtual file system, no IO
  132. READONLY = 0x00000010, // Read only file system
  133. };
  134. // IO calll
  135. BOOL (*CreateDirectory)(LPCTSTR Path);
  136. BOOL (*RemoveDirectory)(LPCTSTR lpPathName);
  137. BOOL (*DeleteFile)(LPCSTR Path);
  138. FLEN (*GetDiskFreeSpace)(LPCSTR Path);
  139. BOOL (*MoveFile)(LPCTSTR ExistingFileName, LPCTSTR NewFileName);
  140. void (*CloseHandle)(HANDLE hVal);
  141. HANDLE (*FindFirstFile)(LPCTSTR lpFileName, CFileInfo& FileInfo);
  142. BOOL (*FindNextFile)(HANDLE hVal, CFileInfo& FileInfo);
  143. void (*FindClose)(HANDLE hVal);
  144. DWORD (*GetFileAttributes)(LPCTSTR lpFileName );
  145. UINT (*GetDriveType)(LPCTSTR lpRootPathName);
  146. FLEN (*GetFileSize)(HANDLE hFile);
  147. FLEN (*Seek)(HANDLE hFile, FLEN flOfs, DWORD dwFrom);
  148. HANDLE (*GetSecurityHandleFromFindHandle)(HANDLE hFind);
  149. HANDLE (*CreateFile)(
  150.     LPCTSTR lpFileName, // pointer to name of the file 
  151.     DWORD dwDesiredAccess, // access (read-write) mode 
  152.     DWORD dwShareMode, // share mode 
  153.     LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security descriptor 
  154.     DWORD dwCreationDistribution, // how to create 
  155.     DWORD dwFlagsAndAttributes, // file attributes 
  156.     HANDLE hTemplateFile  // handle to file with attributes to copy  
  157.    );
  158. BOOL (*ReadFile)(
  159.     HANDLE hFile, // handle of file to read 
  160.     LPVOID lpBuffer, // address of buffer that receives data  
  161.     DWORD nNumberOfBytesToRead, // number of bytes to read 
  162.     LPDWORD lpNumberOfBytesRead, // address of number of bytes read 
  163.     LPOVERLAPPED lpOverlapped  // address of structure for data 
  164.    );
  165. BOOL (*ReadFileEx)(
  166.     HANDLE hFile, // handle of file to read 
  167.     LPVOID lpBuffer, // address of buffer 
  168.     DWORD nNumberOfBytesToRead, // number of bytes to read 
  169.     LPOVERLAPPED lpOverlapped, // address of offset 
  170.     LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  // address of completion routine 
  171.    );
  172. BOOL (*WriteFile)(
  173.     HANDLE hFile, // handle to file to write to 
  174.     LPCVOID lpBuffer, // pointer to data to write to file 
  175.     DWORD nNumberOfBytesToWrite, // number of bytes to write 
  176.     LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written 
  177.     LPOVERLAPPED lpOverlapped  // pointer to structure needed for overlapped I/O
  178.    );
  179. BOOL (*WriteFileEx)(
  180.     HANDLE hFile,  // handle to output file
  181.     LPCVOID lpBuffer,  // pointer to input buffer
  182.     DWORD nNumberOfBytesToWrite,  // number of bytes to write
  183.     LPOVERLAPPED lpOverlapped,  // pointer to async. i/o data
  184.     LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  // ptr. to completion routine
  185.    );
  186. };
  187. //////////////////////////////////////////////////////////////////
  188. // User level interface. Handles all stuff in regard with
  189. // the daemon.
  190. struct CREATE_HDR
  191. {
  192. // Path goes in CUserFsys::m_FsysPath1
  193. DWORD HdrLen;
  194. DWORD dwDesiredAccess; // access (read-write) mode 
  195. DWORD dwShareMode; // share mode 
  196. LPSECURITY_ATTRIBUTES lpSecurityAttributes; // pointer to security descriptor 
  197. DWORD dwCreationDistribution; // how to create 
  198. DWORD dwFlagsAndAttributes; // file attributes 
  199. HANDLE hTemplateFile;  // handle to file with attributes to copy  
  200. DWORD Flags;
  201. LPARAM lParam; // Callback data
  202. void (*Callback)(CWarFile *, BOOL, LPARAM); // Callback function
  203. CWarFile *pFile;
  204. };
  205. class DLL_WAR_SOFTWARE_ CUserFsys
  206. {
  207. public:
  208. CUserFsys(LPVOID *pRef = NULL);
  209. ~CUserFsys();
  210. public:
  211. virtual BOOL Create(
  212. LPCSTR Roots, 
  213. LPCSTR Home, 
  214. USER User, 
  215. USER Class, 
  216. LPCSTR Name = NULL,
  217. DWORD Umask = 0, 
  218. USER AssignTo = INVALID_USER_VALUE);
  219. virtual void Logout();
  220. virtual BOOL CreateFile(LPCSTR Path, CREATE_HDR *pHdr);
  221. static BOOL StartFileSystem(LPCSTR IniPath = NULL);
  222. void LogMsg(int flag, LPCSTR Format, ...);
  223. static void CloseFileSystem(); // Master - called to shut down
  224. static BOOL FsysIsStarted() {return m_hFsys != NULL;}
  225. virtual BOOL BldFileInfoList(CFileInfoList& FileList, LPCSTR Path, BOOL ListDir);
  226. virtual BOOL ChDir(LPCSTR Path);
  227. virtual BOOL ChMod(CCmdArgs& Args);
  228. virtual void OnCallback(LPARAM lParam);
  229. HWND GetFsys_hWnd() {return m_Fsys_hWnd;}
  230. virtual BOOL FsysStat();
  231. virtual BOOL CreateDirectory(LPCSTR FsysPath);
  232. virtual BOOL DeleteDirectory(LPCSTR FsysPath);
  233. virtual BOOL DeleteFile(LPCSTR FsysPath);
  234. virtual BOOL DeleteGeneric(LPCSTR FsysPath); 
  235. virtual BOOL LinkFile(LPCSTR FromPath, LPCSTR ToPath);
  236. virtual BOOL MoveFile(LPCSTR FromPath, LPCSTR ToPath);
  237. virtual BOOL Stat(LPCSTR FsysPath);
  238. protected:
  239. BOOL ProcessRequest(int Type, WPARAM wParam, LPARAM lParam);
  240. static CLinkedList m_ObjectList; // CUserFsys
  241. static HINSTANCE m_hFsys;
  242. static HWND m_Fsys_hWnd;
  243. public:
  244. USER m_User;
  245. USER m_Class;
  246. USER m_AssignTo;
  247. DWORD m_Umask;
  248. unsigned m_IsAdmin : 1; // Is administrator - override security
  249. unsigned m_IsSystem : 1; // Is System - override everything :-)
  250. unsigned m_CallbackPending : 1; // Can not be deleted yet
  251. unsigned m_IsZombie : 1; // the socket is dead.
  252. unsigned m_FsysErrno : 8; // File system error code (NOT DOS error)
  253. DWORD m_DOSErrno; // DOS error number
  254. int m_LastReqType; // Callback code
  255. LPARAM m_FsysLparam; // Used internally by the File system
  256. CREATE_HDR m_CreateHdr; // Used when a file is created/opeed
  257. CString m_FsysPath1; // Used to pass data to/from fsys
  258. CString m_FsysPath2; // Used to pass data to/from fsys
  259. CString m_FsysPath3; // Used to pass data to/from fsys
  260. CString m_Output;
  261. CCmdArgs m_Args; // Used by UNIX derived functions
  262. FLEN m_FileLen; // Used by STAT
  263. FILETIME m_FileTime; // Used by STAT
  264. DWORD m_FilePerms; // Used by STAT
  265. HANDLE m_hNTsec; // Use NT security if present
  266. CString m_CWD; // Current directory
  267. CString m_DOSCWD; // Physical CWD
  268. CString m_Home;
  269. CString m_Name; // Visual name of user
  270. CLinkedList m_OpenFiles; // CWarFsysFileHandle
  271. //CLinkedList m_OpenFinds; // CWarFsysFindHandle
  272. protected:
  273. LPVOID *m_pRef;
  274. // Callback functions
  275. protected:
  276. virtual BOOL SetOnHold(); // Called when a callback needs to wait...
  277. // Return FALSE to abort the operation
  278. virtual void ReleaseHold(); // Release hold state - callback is not called.
  279. virtual void CheckForZombie(); // Release resources and throw an execpion
  280. virtual BOOL OnCreate(int nErrorCode); // Called after Create()
  281. virtual BOOL OnChdir(int nErrorCode);
  282. virtual BOOL OnPrpCmdLine(int nErrorCode);
  283. virtual BOOL OnList(int nErrorCode);
  284. virtual BOOL OnCreateFile(int nErrorCode);
  285. virtual BOOL OnWlist(int nErrorCode);
  286. virtual BOOL OnChmod(int nErrorCode);
  287. virtual BOOL OnFsysStat(int nErrorCode);
  288. virtual BOOL OnCreateDirectory(int nErrorCode);
  289. virtual BOOL OnDeleteDirectory(int nErrorCode);
  290. virtual BOOL OnDeleteFile(int nErrorCode);
  291. virtual BOOL OnDeleteGeneric(int nErrorCode);
  292. virtual BOOL OnLinkFile(int nErrorCode);
  293. virtual BOOL OnMoveFile(int nErrorCode);
  294. virtual BOOL OnStat(int nErrorCode);
  295. };
  296. // Class for file IO
  297. class DLL_WAR_SOFTWARE_ CWarFile : public CObject
  298. {
  299. public:
  300. CWarFile(CUserFsys *pFsys = NULL);
  301. void Destroy(); // Public destructor
  302. protected:
  303. ~CWarFile();
  304. public:
  305. // Data members
  306. HANDLE m_hFile; // Handle to file
  307. CFileSystemTemplate *m_DEV; // Device driver
  308. CString m_Path; // Open path
  309. CUserFsys *m_pFsys;
  310. int m_CallbackPending;
  311. int m_ProtectFromDelete;
  312. BOOL m_IsZombie;
  313. SMEM m_smNode;
  314. // IO Calls
  315. HANDLE GetOSHandle() {return m_hFile;}
  316. void Close();
  317. DWORD GetFileAttributes();
  318. UINT GetDriveType();
  319. FLEN GetFileSize();
  320. FLEN Seek(FLEN lsOfs, UINT nFrom );
  321. BOOL IsOpen() {return ((m_hFile != INVALID_HANDLE_VALUE)
  322. && (m_hFile != HANDLE_PENDING));}
  323. BOOL CallbackIsPending() {return m_hFile == (HANDLE)HANDLE_PENDING; }
  324. BOOL ProcessFlagsLocal(DWORD Flags);
  325. BOOL Create(
  326.     LPCTSTR lpFileName, // pointer to name of the file 
  327.     DWORD dwDesiredAccess, // access (read-write) mode 
  328.     DWORD dwShareMode, // share mode 
  329.     LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security descriptor 
  330.     DWORD dwCreationDistribution, // how to create 
  331.     DWORD dwFlagsAndAttributes, // file attributes 
  332.     HANDLE hTemplateFile,  // handle to file with attributes to copy  
  333. DWORD Flags, // Special flags
  334. LPARAM lParam, // Callback data
  335. void (*Callback)(CWarFile *, BOOL, LPARAM) // Callback function
  336.    );
  337. BOOL Read(
  338.     LPVOID lpBuffer, // address of buffer that receives data  
  339.     DWORD nNumberOfBytesToRead, // number of bytes to read 
  340.     LPDWORD lpNumberOfBytesRead, // address of number of bytes read 
  341.     LPOVERLAPPED lpOverlapped  // address of structure for data 
  342.    );
  343. BOOL ReadEx(
  344.     LPVOID lpBuffer, // address of buffer 
  345.     DWORD nNumberOfBytesToRead, // number of bytes to read 
  346.     LPOVERLAPPED lpOverlapped, // address of offset 
  347.     LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  // address of completion routine 
  348.    );
  349. BOOL Write(
  350.     LPCVOID lpBuffer, // pointer to data to write to file 
  351.     DWORD nNumberOfBytesToWrite, // number of bytes to write 
  352.     LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written 
  353.     LPOVERLAPPED lpOverlapped  // pointer to structure needed for overlapped I/O
  354.    );
  355. BOOL WriteEx(
  356.     LPCVOID lpBuffer,  // pointer to input buffer
  357.     DWORD nNumberOfBytesToWrite,  // number of bytes to write
  358.     LPOVERLAPPED lpOverlapped,  // pointer to async. i/o data
  359.     LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  // ptr. to completion routine
  360.    );
  361. enum // Flags
  362. {
  363. UNIQUE_NAME = 0x00000001,
  364. WRITE_LOCK = 0x00000002,
  365. };
  366. };
  367. enum // File system messages
  368. {
  369. FSM_CALLBACK = WM_USER,
  370. FSM_CREATEFILE,
  371. FSM_CREATEUSER, // Called by CUserFsys::Create()
  372. FSM_PRPCMDLINE, // Prepare command line
  373. FSM_LIST,
  374. FSM_CHDIR,
  375. FSM_CLOSEFILE, // Notification, no callback
  376. FSM_CHMOD,
  377. FSM_WLST, // War native list, place output in m_FsysPath2
  378. FSM_FSYSSTAT, // Give information
  379. FSM_CREATEDIR, // Create directory
  380. FSM_DELEDIR, // Delete directory
  381. FSM_DELEFILE, // Delete file
  382. FSM_DELE, // Delete file or directory
  383. FSM_LINK, // Soft link a file
  384. FSM_MOVE, // Rename (or) move a file. Works on files and directories.
  385. FSM_QUIT, // Quit a fsys thread
  386. FSM_STAT, // Return filelength and filedate
  387. };
  388. enum // File system eror messages
  389. {
  390. FSE_NO_ERROR,
  391. FSE_UNKNOWN_CALL,
  392. FSE_NO_ROOTPATH,
  393. FSE_BAD_ROOTPATH,
  394. FSE_BAD_PATH,
  395. FSE_PERMISSION_DENIED,
  396. FSE_PATH_NOT_FOUND,
  397. FSE_UNIX_ERROR,
  398. FSE_INVALID
  399. };
  400. #endif __WARFSYSH