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
xmail@xmailserver.org
http://xmailserver.org/mailman/listinfo/xmail

Reply via email to