On Wed, 26 May 2010, Stephan Mueller wrote:
> An update of the patch: I forgot to also close the directory file handle
> which leads to a file descriptor leak.
>
> Furthermore, I removed the SysRemove() call as I think it is not
> necessary any more - the file is never created if it is not needed. and
> If it is needed, it should not be created.
Heh, it could have been 10 years that I do not touch LMAIL :)
There is no need at all to create the temp file actually, although unless
you're running LMAIL every 100 milliseconds, it does not really matter.
- Davide
diff --git a/LMAILSvr.cpp b/LMAILSvr.cpp
index ab92383..cfaacd5 100644
--- a/LMAILSvr.cpp
+++ b/LMAILSvr.cpp
@@ -112,8 +112,8 @@ static int LMAILLogEnabled(SHB_HANDLE hShbLMAIL,
LMAILConfig *pLMAILCfg)
return (ulFlags & LMAILF_LOG_ENABLED) ? 1 : 0;
}
-static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg, long lThreadId, char
*pszSSFileName,
- int iMaxSSFileName)
+static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg, long lThreadId,
+ SysListHead *pHead)
{
char szSpoolDir[SYS_MAX_PATH];
@@ -127,15 +127,7 @@ static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg,
long lThreadId, char *p
if (hResLock == INVALID_RLCK_HANDLE)
return ErrGetErrorCode();
- UsrGetTmpFile(NULL, pszSSFileName, iMaxSSFileName);
-
- FILE *pSSFile = fopen(pszSSFileName, "wb");
-
- if (pSSFile == NULL) {
- ErrorPush();
- RLckUnlockSH(hResLock);
- return ErrorPop();
- }
+ SYS_INIT_LIST_HEAD(pHead);
int iFileCount = 0;
char szSpoolFileName[SYS_MAX_PATH];
@@ -149,27 +141,19 @@ static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg,
long lThreadId, char *p
if ((ulHashValue % (unsigned long)
pLMAILCfg->lNumThreads) ==
(unsigned long) lThreadId) {
- fprintf(pSSFile, "%s\r\n", szSpoolFileName);
+ MscLstDatumAddT(pHead, szSpoolFileName,
+ strlen(szSpoolFileName));
++iFileCount;
}
} while (MscNextFile(hFileScan, szSpoolFileName,
sizeof(szSpoolFileName)));
MscCloseFindFile(hFileScan);
}
- fclose(pSSFile);
RLckUnlockSH(hResLock);
- if (iFileCount == 0) {
- SysRemove(pszSSFileName);
- SetEmptyString(pszSSFileName);
-
- ErrSetErrorCode(ERR_NO_LOCAL_SPOOL_FILES);
- return ERR_NO_LOCAL_SPOOL_FILES;
- }
-
- return 0;
+ return iFileCount;
}
-static int LMAILRemoveProcessed(LMAILConfig *pLMAILCfg, char const
*pszListFileName)
+static int LMAILRemoveProcessed(LMAILConfig *pLMAILCfg, SysListHead *pHead)
{
char szSpoolDir[SYS_MAX_PATH];
@@ -183,23 +167,17 @@ static int LMAILRemoveProcessed(LMAILConfig *pLMAILCfg,
char const *pszListFileN
if (hResLock == INVALID_RLCK_HANDLE)
return ErrGetErrorCode();
- FILE *pSSFile = fopen(pszListFileName, "rb");
-
- if (pSSFile == NULL) {
- ErrorPush();
- RLckUnlockEX(hResLock);
- return ErrorPop();
- }
+ SysListHead *pPos;
- char szSpoolFileName[SYS_MAX_PATH];
-
- while (MscGetString(pSSFile, szSpoolFileName, sizeof(szSpoolFileName) -
1) != NULL) {
+ for (pPos = SYS_LIST_FIRST(pHead); pPos != NULL;
+ pPos = SYS_LIST_NEXT(pPos, pHead)) {
+ LstDatum *pLDm = SYS_LIST_ENTRY(pPos, LstDatum, LLnk);
char szSpoolFilePath[SYS_MAX_PATH];
- sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR,
szSpoolFileName);
+ sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR,
+ pLDm->Data.pData);
CheckRemoveFile(szSpoolFilePath);
}
- fclose(pSSFile);
RLckUnlockEX(hResLock);
return 0;
@@ -402,7 +380,8 @@ static int LMAILSubmitLocalFile(LMAILConfig *pLMAILCfg,
const char *pszMailFile,
return 0;
}
-static int LMAILProcessList(LMAILConfig *pLMAILCfg, long lThreadId, char const
*pszSSFileName)
+static int LMAILProcessList(LMAILConfig *pLMAILCfg, long lThreadId,
+ SysListHead *pHead)
{
char szSpoolDir[SYS_MAX_PATH];
@@ -423,15 +402,15 @@ static int LMAILProcessList(LMAILConfig *pLMAILCfg, long
lThreadId, char const *
}
SvrReleaseConfigHandle(hSvrConfig);
- FILE *pSSFile;
- char szSpoolFileName[SYS_MAX_PATH];
+ SysListHead *pPos;
- if ((pSSFile = fopen(pszSSFileName, "rb")) == NULL)
- return ErrGetErrorCode();
- while (MscGetString(pSSFile, szSpoolFileName, sizeof(szSpoolFileName) -
1) != NULL) {
+ for (pPos = SYS_LIST_FIRST(pHead); pPos != NULL;
+ pPos = SYS_LIST_NEXT(pPos, pHead)) {
+ LstDatum *pLDm = SYS_LIST_ENTRY(pPos, LstDatum, LLnk);
char szSpoolFilePath[SYS_MAX_PATH];
- sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR,
szSpoolFileName);
+ sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR,
+ pLDm->Data.pData);
if (LMAILSubmitLocalFile(pLMAILCfg, szSpoolFilePath, lThreadId,
szSMTPDomain) < 0) {
SysLogMessage(LOG_LEV_ERROR, "LMAIL [%02ld] error
(\"%s\"): %s\n",
@@ -442,34 +421,36 @@ static int LMAILProcessList(LMAILConfig *pLMAILCfg, long
lThreadId, char const *
lThreadId, szSpoolFilePath);
}
}
- fclose(pSSFile);
return 0;
}
static int LMAILProcessLocalSpool(SHB_HANDLE hShbLMAIL, long lThreadId)
{
+ int iFileCount;
LMAILConfig *pLMAILCfg;
- char szSSFileName[SYS_MAX_PATH];
+ SysListHead SnapList;
if ((pLMAILCfg = LMAILGetConfigCopy(hShbLMAIL)) == NULL)
return ErrGetErrorCode();
- if (LMAILGetFilesSnapShot(pLMAILCfg, lThreadId, szSSFileName,
- sizeof(szSSFileName)) < 0) {
- ErrorPush();
- SysFree(pLMAILCfg);
- return ErrorPop();
- }
- if (LMAILProcessList(pLMAILCfg, lThreadId, szSSFileName) < 0) {
+ if ((iFileCount = LMAILGetFilesSnapShot(pLMAILCfg, lThreadId,
+ &SnapList)) < 0) {
ErrorPush();
- SysRemove(szSSFileName);
SysFree(pLMAILCfg);
return ErrorPop();
}
+ if (iFileCount > 0) {
+ if (LMAILProcessList(pLMAILCfg, lThreadId, &SnapList) < 0) {
+ ErrorPush();
+ MscFreeDatumList(&SnapList);
+ SysFree(pLMAILCfg);
+ return ErrorPop();
+ }
- LMAILRemoveProcessed(pLMAILCfg, szSSFileName);
+ LMAILRemoveProcessed(pLMAILCfg, &SnapList);
- SysRemove(szSSFileName);
+ MscFreeDatumList(&SnapList);
+ }
SysFree(pLMAILCfg);
return 0;
_______________________________________________
xmail mailing list
[email protected]
http://xmailserver.org/mailman/listinfo/xmail