Maildir.cpp
上传用户:woshihumen
上传日期:2013-07-18
资源大小:484k
文件大小:6k
源码类别:

Email服务器

开发平台:

Visual C++

  1. /*
  2.  *  XMail by Davide Libenzi ( Intranet and Internet mail server )
  3.  *  Copyright (C) 1999,..,2004  Davide Libenzi
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  *  Davide Libenzi <davidel@xmailserver.org>
  20.  *
  21.  */
  22. #include "SysInclude.h"
  23. #include "SysDep.h"
  24. #include "SvrDefines.h"
  25. #include "ShBlocks.h"
  26. #include "StrUtils.h"
  27. #include "SList.h"
  28. #include "MD5.h"
  29. #include "Base64Enc.h"
  30. #include "BuffSock.h"
  31. #include "MailConfig.h"
  32. #include "UsrUtils.h"
  33. #include "SvrUtils.h"
  34. #include "MessQueue.h"
  35. #include "MailSvr.h"
  36. #include "MiscUtils.h"
  37. #include "Maildir.h"
  38. int MdirCreateStructure(char const *pszBasePath)
  39. {
  40. ///////////////////////////////////////////////////////////////////////////////
  41. //  Create Maildir directory
  42. ///////////////////////////////////////////////////////////////////////////////
  43. char szMaildirPath[SYS_MAX_PATH] = "";
  44. StrSNCpy(szMaildirPath, pszBasePath);
  45. AppendSlash(szMaildirPath);
  46. StrSNCat(szMaildirPath, MAILDIR_DIRECTORY);
  47. if (SysMakeDir(szMaildirPath) < 0)
  48. return (ErrGetErrorCode());
  49. ///////////////////////////////////////////////////////////////////////////////
  50. //  Create Maildir/tmp directory
  51. ///////////////////////////////////////////////////////////////////////////////
  52. char szSubPath[SYS_MAX_PATH] = "";
  53. sprintf(szSubPath, "%s" SYS_SLASH_STR "tmp", szMaildirPath);
  54. if (SysMakeDir(szSubPath) < 0)
  55. return (ErrGetErrorCode());
  56. ///////////////////////////////////////////////////////////////////////////////
  57. //  Create Maildir/new directory
  58. ///////////////////////////////////////////////////////////////////////////////
  59. sprintf(szSubPath, "%s" SYS_SLASH_STR "new", szMaildirPath);
  60. if (SysMakeDir(szSubPath) < 0)
  61. return (ErrGetErrorCode());
  62. ///////////////////////////////////////////////////////////////////////////////
  63. //  Create Maildir/cur directory
  64. ///////////////////////////////////////////////////////////////////////////////
  65. sprintf(szSubPath, "%s" SYS_SLASH_STR "cur", szMaildirPath);
  66. if (SysMakeDir(szSubPath) < 0)
  67. return (ErrGetErrorCode());
  68. return (0);
  69. }
  70. int MdirGetTmpMaildirEntry(char const *pszMaildirPath, char *pszFilePath)
  71. {
  72. char szTmpPath[SYS_MAX_PATH] = "";
  73. sprintf(szTmpPath, "%s" SYS_SLASH_STR "tmp", pszMaildirPath);
  74. return (MscUniqueFile(szTmpPath, pszFilePath));
  75. }
  76. int MdirMoveTmpEntryInNew(char const *pszTmpEntryPath)
  77. {
  78. ///////////////////////////////////////////////////////////////////////////////
  79. //  Lookup Maildir/tmp/ subpath
  80. ///////////////////////////////////////////////////////////////////////////////
  81. char const *pszTmpDir = MAILDIR_DIRECTORY SYS_SLASH_STR "tmp" SYS_SLASH_STR;
  82. char const *pszLookup = strstr(pszTmpEntryPath, pszTmpDir);
  83. if (pszLookup == NULL) {
  84. ErrSetErrorCode(ERR_INVALID_MAILDIR_SUBPATH);
  85. return (ERR_INVALID_MAILDIR_SUBPATH);
  86. }
  87. ///////////////////////////////////////////////////////////////////////////////
  88. //  Build Maildir/new file path
  89. ///////////////////////////////////////////////////////////////////////////////
  90. int iBaseLength = (int) (pszLookup - pszTmpEntryPath);
  91. char const *pszNewDir = MAILDIR_DIRECTORY SYS_SLASH_STR "new" SYS_SLASH_STR;
  92. char const *pszSlash = strrchr(pszTmpEntryPath, SYS_SLASH_CHAR);
  93. char szNewEntryPath[SYS_MAX_PATH] = "";
  94. StrSNCpy(szNewEntryPath, pszTmpEntryPath);
  95. StrNCpy(szNewEntryPath + iBaseLength, pszNewDir, sizeof(szNewEntryPath) - iBaseLength);
  96. StrNCat(szNewEntryPath, pszSlash + 1, sizeof(szNewEntryPath));
  97. ///////////////////////////////////////////////////////////////////////////////
  98. //  Move to Maildir/new
  99. ///////////////////////////////////////////////////////////////////////////////
  100. if (SysMoveFile(pszTmpEntryPath, szNewEntryPath) < 0)
  101. return (ErrGetErrorCode());
  102. return (0);
  103. }
  104. int MdirMoveMessage(char const *pszMaildirPath, const char *pszFileName, char const *pszMessageID)
  105. {
  106. ///////////////////////////////////////////////////////////////////////////////
  107. //  Allocate a Maildir/tmp entry
  108. ///////////////////////////////////////////////////////////////////////////////
  109. char szTmpEntryPath[SYS_MAX_PATH] = "";
  110. if (pszMessageID == NULL) {
  111. if (MdirGetTmpMaildirEntry(pszMaildirPath, szTmpEntryPath) < 0)
  112. return (ErrGetErrorCode());
  113. } else
  114. sprintf(szTmpEntryPath, "%s" SYS_SLASH_STR "tmp" SYS_SLASH_STR "%s",
  115. pszMaildirPath, pszMessageID);
  116. ///////////////////////////////////////////////////////////////////////////////
  117. //  This perform a copy&delete to Maildir/tmp
  118. ///////////////////////////////////////////////////////////////////////////////
  119. if (MscMoveFile(pszFileName, szTmpEntryPath) < 0) {
  120. ErrorPush();
  121. CheckRemoveFile(szTmpEntryPath);
  122. return (ErrorPop());
  123. }
  124. ///////////////////////////////////////////////////////////////////////////////
  125. //  This perform a fast system move from Maildir/tmp to Maildir/new
  126. ///////////////////////////////////////////////////////////////////////////////
  127. if (MdirMoveTmpEntryInNew(szTmpEntryPath) < 0) {
  128. ErrorPush();
  129. SysRemove(szTmpEntryPath);
  130. return (ErrorPop());
  131. }
  132. return (0);
  133. }