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

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 "ResLocks.h"
  27. #include "StrUtils.h"
  28. #include "SList.h"
  29. #include "BuffSock.h"
  30. #include "MailConfig.h"
  31. #include "MessQueue.h"
  32. #include "MailSvr.h"
  33. #include "MiscUtils.h"
  34. #include "SvrUtils.h"
  35. #include "UsrUtils.h"
  36. #include "TabIndex.h"
  37. #include "ExtAliases.h"
  38. #define SVR_EXT_ALIAS_FILE          "extaliases.tab"
  39. #define ALIAS_TABLE_LINE_MAX        1024
  40. enum ExtAliasFields {
  41. ealRmtDomain = 0,
  42. ealRmtName,
  43. ealDomain,
  44. ealName,
  45. ealMax
  46. };
  47. struct ExAlDBScanData {
  48. char szTmpDBFile[SYS_MAX_PATH];
  49. FILE *pDBFile;
  50. };
  51. static int ExAlRebuildAliasIndexes(char const *pszAliasFilePath);
  52. static char *ExAlGetTableFilePath(char *pszLnkFilePath, int iMaxPath);
  53. static ExtAlias *ExAlGetAliasFromStrings(char **ppszStrings);
  54. static int ExAlWriteAlias(FILE * pAliasFile, ExtAlias * pExtAlias);
  55. static int iIdxExAlias_RmtDomain_RmtName[] = {
  56. ealRmtDomain,
  57. ealRmtName,
  58. INDEX_SEQUENCE_TERMINATOR
  59. };
  60. int ExAlCheckAliasIndexes(void)
  61. {
  62. char szAliasFilePath[SYS_MAX_PATH] = "";
  63. ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath));
  64. ///////////////////////////////////////////////////////////////////////////////
  65. //  Align RmtDomain-RmtName index
  66. ///////////////////////////////////////////////////////////////////////////////
  67. if (TbixCheckIndex(szAliasFilePath, iIdxExAlias_RmtDomain_RmtName, false) < 0)
  68. return (ErrGetErrorCode());
  69. return (0);
  70. }
  71. static int ExAlRebuildAliasIndexes(char const *pszAliasFilePath)
  72. {
  73. ///////////////////////////////////////////////////////////////////////////////
  74. //  Rebuild RmtDomain-RmtName index
  75. ///////////////////////////////////////////////////////////////////////////////
  76. if (TbixCreateIndex(pszAliasFilePath, iIdxExAlias_RmtDomain_RmtName, false) < 0)
  77. return (ErrGetErrorCode());
  78. return (0);
  79. }
  80. static char *ExAlGetTableFilePath(char *pszLnkFilePath, int iMaxPath)
  81. {
  82. CfgGetRootPath(pszLnkFilePath, iMaxPath);
  83. StrNCat(pszLnkFilePath, SVR_EXT_ALIAS_FILE, iMaxPath);
  84. return (pszLnkFilePath);
  85. }
  86. static ExtAlias *ExAlGetAliasFromStrings(char **ppszStrings)
  87. {
  88. int iFieldsCount = StrStringsCount(ppszStrings);
  89. if (iFieldsCount < ealMax)
  90. return (NULL);
  91. ExtAlias *pExtAlias = (ExtAlias *) SysAlloc(sizeof(ExtAlias));
  92. if (pExtAlias == NULL)
  93. return (NULL);
  94. pExtAlias->pszRmtDomain = SysStrDup(ppszStrings[ealRmtDomain]);
  95. pExtAlias->pszRmtName = SysStrDup(ppszStrings[ealRmtName]);
  96. pExtAlias->pszDomain = SysStrDup(ppszStrings[ealDomain]);
  97. pExtAlias->pszName = SysStrDup(ppszStrings[ealName]);
  98. return (pExtAlias);
  99. }
  100. ExtAlias *ExAlAllocAlias(void)
  101. {
  102. ExtAlias *pExtAlias = (ExtAlias *) SysAlloc(sizeof(ExtAlias));
  103. if (pExtAlias == NULL)
  104. return (NULL);
  105. pExtAlias->pszRmtDomain = NULL;
  106. pExtAlias->pszRmtName = NULL;
  107. pExtAlias->pszDomain = NULL;
  108. pExtAlias->pszName = NULL;
  109. return (pExtAlias);
  110. }
  111. void ExAlFreeAlias(ExtAlias * pExtAlias)
  112. {
  113. if (pExtAlias->pszDomain != NULL)
  114. SysFree(pExtAlias->pszDomain);
  115. if (pExtAlias->pszName != NULL)
  116. SysFree(pExtAlias->pszName);
  117. if (pExtAlias->pszRmtDomain != NULL)
  118. SysFree(pExtAlias->pszRmtDomain);
  119. if (pExtAlias->pszRmtName != NULL)
  120. SysFree(pExtAlias->pszRmtName);
  121. SysFree(pExtAlias);
  122. }
  123. static int ExAlWriteAlias(FILE * pAliasFile, ExtAlias * pExtAlias)
  124. {
  125. ///////////////////////////////////////////////////////////////////////////////
  126. //  Remote domain
  127. ///////////////////////////////////////////////////////////////////////////////
  128. char *pszQuoted = StrQuote(pExtAlias->pszRmtDomain, '"');
  129. if (pszQuoted == NULL)
  130. return (ErrGetErrorCode());
  131. fprintf(pAliasFile, "%st", pszQuoted);
  132. SysFree(pszQuoted);
  133. ///////////////////////////////////////////////////////////////////////////////
  134. //  Remote user
  135. ///////////////////////////////////////////////////////////////////////////////
  136. pszQuoted = StrQuote(pExtAlias->pszRmtName, '"');
  137. if (pszQuoted == NULL)
  138. return (ErrGetErrorCode());
  139. fprintf(pAliasFile, "%st", pszQuoted);
  140. SysFree(pszQuoted);
  141. ///////////////////////////////////////////////////////////////////////////////
  142. //  Domain
  143. ///////////////////////////////////////////////////////////////////////////////
  144. pszQuoted = StrQuote(pExtAlias->pszDomain, '"');
  145. if (pszQuoted == NULL)
  146. return (ErrGetErrorCode());
  147. fprintf(pAliasFile, "%st", pszQuoted);
  148. SysFree(pszQuoted);
  149. ///////////////////////////////////////////////////////////////////////////////
  150. //  Local user
  151. ///////////////////////////////////////////////////////////////////////////////
  152. pszQuoted = StrQuote(pExtAlias->pszName, '"');
  153. if (pszQuoted == NULL)
  154. return (ErrGetErrorCode());
  155. fprintf(pAliasFile, "%sn", pszQuoted);
  156. SysFree(pszQuoted);
  157. return (0);
  158. }
  159. int ExAlAddAlias(ExtAlias * pExtAlias)
  160. {
  161. char szAliasFilePath[SYS_MAX_PATH] = "";
  162. ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath));
  163. char szResLock[SYS_MAX_PATH] = "";
  164. RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock,
  165.   sizeof(szResLock)));
  166. if (hResLock == INVALID_RLCK_HANDLE)
  167. return (ErrGetErrorCode());
  168. FILE *pAliasFile = fopen(szAliasFilePath, "r+t");
  169. if (pAliasFile == NULL) {
  170. RLckUnlockEX(hResLock);
  171. ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND);
  172. return (ERR_EXTALIAS_FILE_NOT_FOUND);
  173. }
  174. char szAliasLine[ALIAS_TABLE_LINE_MAX] = "";
  175. while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) {
  176. char **ppszStrings = StrGetTabLineStrings(szAliasLine);
  177. if (ppszStrings == NULL)
  178. continue;
  179. int iFieldsCount = StrStringsCount(ppszStrings);
  180. if ((iFieldsCount >= ealMax) &&
  181.     (stricmp(pExtAlias->pszRmtDomain, ppszStrings[ealRmtDomain]) == 0) &&
  182.     (stricmp(pExtAlias->pszRmtName, ppszStrings[ealRmtName]) == 0)) {
  183. StrFreeStrings(ppszStrings);
  184. fclose(pAliasFile);
  185. RLckUnlockEX(hResLock);
  186. ErrSetErrorCode(ERR_EXTALIAS_EXIST);
  187. return (ERR_EXTALIAS_EXIST);
  188. }
  189. StrFreeStrings(ppszStrings);
  190. }
  191. fseek(pAliasFile, 0, SEEK_END);
  192. if (ExAlWriteAlias(pAliasFile, pExtAlias) < 0) {
  193. fclose(pAliasFile);
  194. RLckUnlockEX(hResLock);
  195. ErrSetErrorCode(ERR_WRITE_EXTALIAS_FILE);
  196. return (ERR_WRITE_EXTALIAS_FILE);
  197. }
  198. fclose(pAliasFile);
  199. ///////////////////////////////////////////////////////////////////////////////
  200. //  Rebuild indexes
  201. ///////////////////////////////////////////////////////////////////////////////
  202. if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) {
  203. ErrorPush();
  204. RLckUnlockEX(hResLock);
  205. return (ErrorPop());
  206. }
  207. RLckUnlockEX(hResLock);
  208. return (0);
  209. }
  210. ExtAlias *ExAlGetAlias(char const *pszRmtDomain, char const *pszRmtName)
  211. {
  212. char szAliasFilePath[SYS_MAX_PATH] = "";
  213. ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath));
  214. char szResLock[SYS_MAX_PATH] = "";
  215. RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAliasFilePath, szResLock,
  216.   sizeof(szResLock)));
  217. if (hResLock == INVALID_RLCK_HANDLE)
  218. return (NULL);
  219. ///////////////////////////////////////////////////////////////////////////////
  220. //  Lookup record using the specified index
  221. ///////////////////////////////////////////////////////////////////////////////
  222. char **ppszTabTokens = TbixLookup(szAliasFilePath, iIdxExAlias_RmtDomain_RmtName, false,
  223.   pszRmtDomain,
  224.   pszRmtName,
  225.   NULL);
  226. if (ppszTabTokens == NULL) {
  227. RLckUnlockSH(hResLock);
  228. ErrSetErrorCode(ERR_EXTALIAS_NOT_FOUND);
  229. return (NULL);
  230. }
  231. ExtAlias *pExtAlias = ExAlGetAliasFromStrings(ppszTabTokens);
  232. StrFreeStrings(ppszTabTokens);
  233. RLckUnlockSH(hResLock);
  234. return (pExtAlias);
  235. }
  236. int ExAlRemoveAlias(ExtAlias * pExtAlias)
  237. {
  238. char szAliasFilePath[SYS_MAX_PATH] = "";
  239. ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath));
  240. char szTmpFile[SYS_MAX_PATH] = "";
  241. SysGetTmpFile(szTmpFile);
  242. char szResLock[SYS_MAX_PATH] = "";
  243. RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock,
  244.   sizeof(szResLock)));
  245. if (hResLock == INVALID_RLCK_HANDLE)
  246. return (ErrGetErrorCode());
  247. FILE *pAliasFile = fopen(szAliasFilePath, "rt");
  248. if (pAliasFile == NULL) {
  249. RLckUnlockEX(hResLock);
  250. ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND);
  251. return (ERR_EXTALIAS_FILE_NOT_FOUND);
  252. }
  253. FILE *pTmpFile = fopen(szTmpFile, "wt");
  254. if (pTmpFile == NULL) {
  255. fclose(pAliasFile);
  256. RLckUnlockEX(hResLock);
  257. ErrSetErrorCode(ERR_FILE_CREATE);
  258. return (ERR_FILE_CREATE);
  259. }
  260. int iAliasFound = 0;
  261. char szAliasLine[ALIAS_TABLE_LINE_MAX] = "";
  262. while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) {
  263. char **ppszStrings = StrGetTabLineStrings(szAliasLine);
  264. if (ppszStrings == NULL)
  265. continue;
  266. int iFieldsCount = StrStringsCount(ppszStrings);
  267. if ((iFieldsCount >= ealMax) &&
  268.     (stricmp(pExtAlias->pszRmtDomain, ppszStrings[ealRmtDomain]) == 0) &&
  269.     (stricmp(pExtAlias->pszRmtName, ppszStrings[ealRmtName]) == 0)) {
  270. ++iAliasFound;
  271. } else
  272. fprintf(pTmpFile, "%sn", szAliasLine);
  273. StrFreeStrings(ppszStrings);
  274. }
  275. fclose(pAliasFile);
  276. fclose(pTmpFile);
  277. if (iAliasFound == 0) {
  278. SysRemove(szTmpFile);
  279. RLckUnlockEX(hResLock);
  280. ErrSetErrorCode(ERR_EXTALIAS_NOT_FOUND);
  281. return (ERR_EXTALIAS_NOT_FOUND);
  282. }
  283. char szTmpAliasFilePath[SYS_MAX_PATH] = "";
  284. SysSNPrintf(szTmpAliasFilePath, sizeof(szTmpAliasFilePath) - 1, "%s.tmp",
  285.     szAliasFilePath);
  286. if (MscMoveFile(szAliasFilePath, szTmpAliasFilePath) < 0) {
  287. RLckUnlockEX(hResLock);
  288. return (ErrGetErrorCode());
  289. }
  290. if (MscMoveFile(szTmpFile, szAliasFilePath) < 0) {
  291. MscMoveFile(szTmpAliasFilePath, szAliasFilePath);
  292. RLckUnlockEX(hResLock);
  293. return (ErrGetErrorCode());
  294. }
  295. SysRemove(szTmpAliasFilePath);
  296. ///////////////////////////////////////////////////////////////////////////////
  297. //  Rebuild indexes
  298. ///////////////////////////////////////////////////////////////////////////////
  299. if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) {
  300. ErrorPush();
  301. RLckUnlockEX(hResLock);
  302. return (ErrorPop());
  303. }
  304. RLckUnlockEX(hResLock);
  305. return (0);
  306. }
  307. int ExAlRemoveUserAliases(const char *pszDomain, const char *pszName)
  308. {
  309. char szAliasFilePath[SYS_MAX_PATH] = "";
  310. ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath));
  311. char szTmpFile[SYS_MAX_PATH] = "";
  312. SysGetTmpFile(szTmpFile);
  313. char szResLock[SYS_MAX_PATH] = "";
  314. RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock,
  315.   sizeof(szResLock)));
  316. if (hResLock == INVALID_RLCK_HANDLE) {
  317. ErrorPush();
  318. CheckRemoveFile(szTmpFile);
  319. return (ErrorPop());
  320. }
  321. FILE *pAliasFile = fopen(szAliasFilePath, "rt");
  322. if (pAliasFile == NULL) {
  323. RLckUnlockEX(hResLock);
  324. CheckRemoveFile(szTmpFile);
  325. ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND);
  326. return (ERR_EXTALIAS_FILE_NOT_FOUND);
  327. }
  328. FILE *pTmpFile = fopen(szTmpFile, "wt");
  329. if (pTmpFile == NULL) {
  330. fclose(pAliasFile);
  331. RLckUnlockEX(hResLock);
  332. CheckRemoveFile(szTmpFile);
  333. ErrSetErrorCode(ERR_FILE_CREATE);
  334. return (ERR_FILE_CREATE);
  335. }
  336. int iAliasFound = 0;
  337. char szAliasLine[ALIAS_TABLE_LINE_MAX] = "";
  338. while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) {
  339. char **ppszStrings = StrGetTabLineStrings(szAliasLine);
  340. if (ppszStrings == NULL)
  341. continue;
  342. int iFieldsCount = StrStringsCount(ppszStrings);
  343. if ((iFieldsCount >= ealMax) && (stricmp(pszDomain, ppszStrings[ealDomain]) == 0)
  344.     && (stricmp(pszName, ppszStrings[ealName]) == 0)) {
  345. ++iAliasFound;
  346. } else
  347. fprintf(pTmpFile, "%sn", szAliasLine);
  348. StrFreeStrings(ppszStrings);
  349. }
  350. fclose(pAliasFile);
  351. fclose(pTmpFile);
  352. if (iAliasFound == 0) {
  353. SysRemove(szTmpFile);
  354. RLckUnlockEX(hResLock);
  355. return (0);
  356. }
  357. char szTmpAliasFilePath[SYS_MAX_PATH] = "";
  358. SysSNPrintf(szTmpAliasFilePath, sizeof(szTmpAliasFilePath) - 1, "%s.tmp",
  359.     szAliasFilePath);
  360. if (MscMoveFile(szAliasFilePath, szTmpAliasFilePath) < 0) {
  361. ErrorPush();
  362. RLckUnlockEX(hResLock);
  363. return (ErrorPop());
  364. }
  365. if (MscMoveFile(szTmpFile, szAliasFilePath) < 0) {
  366. ErrorPush();
  367. MscMoveFile(szTmpAliasFilePath, szAliasFilePath);
  368. RLckUnlockEX(hResLock);
  369. return (ErrorPop());
  370. }
  371. SysRemove(szTmpAliasFilePath);
  372. ///////////////////////////////////////////////////////////////////////////////
  373. //  Rebuild indexes
  374. ///////////////////////////////////////////////////////////////////////////////
  375. if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) {
  376. ErrorPush();
  377. RLckUnlockEX(hResLock);
  378. return (ErrorPop());
  379. }
  380. RLckUnlockEX(hResLock);
  381. return (0);
  382. }
  383. int ExAlRemoveDomainAliases(const char *pszDomain)
  384. {
  385. char szAliasFilePath[SYS_MAX_PATH] = "";
  386. ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath));
  387. char szTmpFile[SYS_MAX_PATH] = "";
  388. SysGetTmpFile(szTmpFile);
  389. char szResLock[SYS_MAX_PATH] = "";
  390. RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock,
  391.   sizeof(szResLock)));
  392. if (hResLock == INVALID_RLCK_HANDLE) {
  393. ErrorPush();
  394. CheckRemoveFile(szTmpFile);
  395. return (ErrorPop());
  396. }
  397. FILE *pAliasFile = fopen(szAliasFilePath, "rt");
  398. if (pAliasFile == NULL) {
  399. RLckUnlockEX(hResLock);
  400. CheckRemoveFile(szTmpFile);
  401. ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND);
  402. return (ERR_EXTALIAS_FILE_NOT_FOUND);
  403. }
  404. FILE *pTmpFile = fopen(szTmpFile, "wt");
  405. if (pTmpFile == NULL) {
  406. fclose(pAliasFile);
  407. RLckUnlockEX(hResLock);
  408. CheckRemoveFile(szTmpFile);
  409. ErrSetErrorCode(ERR_FILE_CREATE);
  410. return (ERR_FILE_CREATE);
  411. }
  412. int iAliasFound = 0;
  413. char szAliasLine[ALIAS_TABLE_LINE_MAX] = "";
  414. while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) {
  415. char **ppszStrings = StrGetTabLineStrings(szAliasLine);
  416. if (ppszStrings == NULL)
  417. continue;
  418. int iFieldsCount = StrStringsCount(ppszStrings);
  419. if ((iFieldsCount >= ealMax) && (stricmp(pszDomain, ppszStrings[ealDomain]) == 0)) {
  420. ++iAliasFound;
  421. } else
  422. fprintf(pTmpFile, "%sn", szAliasLine);
  423. StrFreeStrings(ppszStrings);
  424. }
  425. fclose(pAliasFile);
  426. fclose(pTmpFile);
  427. if (iAliasFound == 0) {
  428. SysRemove(szTmpFile);
  429. RLckUnlockEX(hResLock);
  430. return (0);
  431. }
  432. char szTmpAliasFilePath[SYS_MAX_PATH] = "";
  433. SysSNPrintf(szTmpAliasFilePath, sizeof(szTmpAliasFilePath) - 1, "%s.tmp",
  434.     szAliasFilePath);
  435. if (MscMoveFile(szAliasFilePath, szTmpAliasFilePath) < 0) {
  436. ErrorPush();
  437. SysRemove(szTmpFile);
  438. RLckUnlockEX(hResLock);
  439. return (ErrorPop());
  440. }
  441. if (MscMoveFile(szTmpFile, szAliasFilePath) < 0) {
  442. ErrorPush();
  443. MscMoveFile(szTmpAliasFilePath, szAliasFilePath);
  444. SysRemove(szTmpFile);
  445. RLckUnlockEX(hResLock);
  446. return (ErrorPop());
  447. }
  448. SysRemove(szTmpAliasFilePath);
  449. ///////////////////////////////////////////////////////////////////////////////
  450. //  Rebuild indexes
  451. ///////////////////////////////////////////////////////////////////////////////
  452. if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) {
  453. ErrorPush();
  454. RLckUnlockEX(hResLock);
  455. return (ErrorPop());
  456. }
  457. RLckUnlockEX(hResLock);
  458. return (0);
  459. }
  460. int ExAlGetDBFileSnapShot(const char *pszFileName)
  461. {
  462. char szAliasFilePath[SYS_MAX_PATH] = "";
  463. ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath));
  464. char szResLock[SYS_MAX_PATH] = "";
  465. RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAliasFilePath, szResLock,
  466.   sizeof(szResLock)));
  467. if (hResLock == INVALID_RLCK_HANDLE)
  468. return (ErrGetErrorCode());
  469. if (MscCopyFile(pszFileName, szAliasFilePath) < 0) {
  470. RLckUnlockSH(hResLock);
  471. return (ErrGetErrorCode());
  472. }
  473. RLckUnlockSH(hResLock);
  474. return (0);
  475. }
  476. EXAL_HANDLE ExAlOpenDB(void)
  477. {
  478. ExAlDBScanData *pGLSD = (ExAlDBScanData *) SysAlloc(sizeof(ExAlDBScanData));
  479. if (pGLSD == NULL)
  480. return (INVALID_EXAL_HANDLE);
  481. SysGetTmpFile(pGLSD->szTmpDBFile);
  482. if (ExAlGetDBFileSnapShot(pGLSD->szTmpDBFile) < 0) {
  483. SysFree(pGLSD);
  484. return (INVALID_EXAL_HANDLE);
  485. }
  486. if ((pGLSD->pDBFile = fopen(pGLSD->szTmpDBFile, "rt")) == NULL) {
  487. SysRemove(pGLSD->szTmpDBFile);
  488. SysFree(pGLSD);
  489. return (INVALID_EXAL_HANDLE);
  490. }
  491. return ((EXAL_HANDLE) pGLSD);
  492. }
  493. void ExAlCloseDB(EXAL_HANDLE hLinksDB)
  494. {
  495. ExAlDBScanData *pGLSD = (ExAlDBScanData *) hLinksDB;
  496. fclose(pGLSD->pDBFile);
  497. SysRemove(pGLSD->szTmpDBFile);
  498. SysFree(pGLSD);
  499. }
  500. ExtAlias *ExAlGetFirstAlias(EXAL_HANDLE hLinksDB)
  501. {
  502. ExAlDBScanData *pGLSD = (ExAlDBScanData *) hLinksDB;
  503. rewind(pGLSD->pDBFile);
  504. ExtAlias *pExtAlias = NULL;
  505. char szAliasLine[ALIAS_TABLE_LINE_MAX] = "";
  506. while ((pExtAlias == NULL) &&
  507.        (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pGLSD->pDBFile) != NULL)) {
  508. char **ppszStrings = StrGetTabLineStrings(szAliasLine);
  509. if (ppszStrings == NULL)
  510. continue;
  511. int iFieldsCount = StrStringsCount(ppszStrings);
  512. if (iFieldsCount >= ealMax)
  513. pExtAlias = ExAlGetAliasFromStrings(ppszStrings);
  514. StrFreeStrings(ppszStrings);
  515. }
  516. return (pExtAlias);
  517. }
  518. ExtAlias *ExAlGetNextAlias(EXAL_HANDLE hLinksDB)
  519. {
  520. ExAlDBScanData *pGLSD = (ExAlDBScanData *) hLinksDB;
  521. ExtAlias *pExtAlias = NULL;
  522. char szAliasLine[ALIAS_TABLE_LINE_MAX] = "";
  523. while ((pExtAlias == NULL) &&
  524.        (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pGLSD->pDBFile) != NULL)) {
  525. char **ppszStrings = StrGetTabLineStrings(szAliasLine);
  526. if (ppszStrings == NULL)
  527. continue;
  528. int iFieldsCount = StrStringsCount(ppszStrings);
  529. if (iFieldsCount >= ealMax)
  530. pExtAlias = ExAlGetAliasFromStrings(ppszStrings);
  531. StrFreeStrings(ppszStrings);
  532. }
  533. return (pExtAlias);
  534. }