Errors.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 "StrUtils.h"
  26. struct ErrorStrings {
  27. int iErrorCode;
  28. char const *pszError;
  29. };
  30. struct ErrorEnv {
  31. int iErrorNo;
  32. char *pszInfo[1];
  33. };
  34. static void ErrFreeEnv(void *pData);
  35. static void ErrOnceSetup(void);
  36. static ErrorEnv *ErrSetupEnv(void);
  37. static int ErrGetErrorIndex(int iErrorCode);
  38. static SYS_THREAD_ONCE OnceSetup = SYS_THREAD_ONCE_INIT;
  39. static SYS_TLSKEY ErrTlsKey;
  40. static ErrorStrings Errors[] = {
  41. {ERR_SUCCESS, "Success"},
  42. {ERR_SERVER_SHUTDOWN, "Server shutdown"},
  43. {ERR_MEMORY, "Memory allocation error"},
  44. {ERR_NETWORK, "Network kernel error"},
  45. {ERR_SOCKET_CREATE, "Cannot create socket"},
  46. {ERR_TIMEOUT, "Timeout error"},
  47. {ERR_LOCKED, "Already locked"},
  48. {ERR_SOCKET_BIND, "Socket bind error"},
  49. {ERR_CONF_PATH, "Mail root path not found"},
  50. {ERR_USERS_FILE_NOT_FOUND, "Users table file not found"},
  51. {ERR_FILE_CREATE, "Unable to create file"},
  52. {ERR_USER_NOT_FOUND, "User not found"},
  53. {ERR_USER_EXIST, "User already exist"},
  54. {ERR_WRITE_USERS_FILE, "Error writing users file"},
  55. {ERR_NO_USER_PRFILE, "User profile file not found"},
  56. {ERR_FILE_DELETE, "Unable to remove file"},
  57. {ERR_DIR_CREATE, "Unable to create directory"},
  58. {ERR_DIR_DELETE, "Unable to remove directory"},
  59. {ERR_FILE_OPEN, "Unable to open file"},
  60. {ERR_INVALID_FILE, "Invalid file structure"},
  61. {ERR_FILE_WRITE, "Unable to write file"},
  62. {ERR_MSG_NOT_IN_RANGE, "Message out of range"},
  63. {ERR_MSG_DELETED, "Message deleted"},
  64. {ERR_INVALID_PASSWORD, "Invalid password"},
  65. {ERR_ALIAS_FILE_NOT_FOUND, "Users alias file not found"},
  66. {ERR_ALIAS_EXIST, "Alias already exist"},
  67. {ERR_WRITE_ALIAS_FILE, "Error writing alias file"},
  68. {ERR_ALIAS_NOT_FOUND, "Alias not found"},
  69. {ERR_SVR_PRFILE_NOT_LOCKED, "Server profile not locked"},
  70. {ERR_GET_PEER_INFO, "Error getting peer address info"},
  71. {ERR_SMTP_PATH_PARSE_ERROR, "Error parsing SMTP command line"},
  72. {ERR_BAD_RETURN_PATH, "Bad return path syntax"},
  73. {ERR_BAD_EMAIL_ADDR, "Bad email address"},
  74. {ERR_RELAY_NOT_ALLOWED, "Relay not allowed"},
  75. {ERR_BAD_FORWARD_PATH, "Bad forward path syntax"},
  76. {ERR_GET_SOCK_INFO, "Error getting sock address info"},
  77. {ERR_GET_SOCK_HOST, "Error getting sock host name"},
  78. {ERR_NO_DOMAIN, "Unable to know server domain"},
  79. {ERR_USER_NOT_LOCAL, "User not local"},
  80. {ERR_BAD_SERVER_ADDR, "Invalid server address"},
  81. {ERR_BAD_SERVER_RESPONSE, "Bad server response"},
  82. {ERR_INVALID_POP3_RESPONSE, "Invalid POP3 response"},
  83. {ERR_LINKS_FILE_NOT_FOUND, "POP3 links file not found"},
  84. {ERR_LINK_EXIST, "POP3 link already exist"},
  85. {ERR_WRITE_LINKS_FILE, "Error writing POP3 links file"},
  86. {ERR_LINK_NOT_FOUND, "POP3 link not found"},
  87. {ERR_SMTPGW_FILE_NOT_FOUND, "SMTP gateway file not found"},
  88. {ERR_GATEWAY_ALREADY_EXIST, "SMTP gateway already exist"},
  89. {ERR_GATEWAY_NOT_FOUND, "SMTP gateway not found"},
  90. {ERR_USER_NOT_MAILINGLIST, "User is not a mailing list"},
  91. {ERR_NO_USER_MLTABLE_FILE, "Mailing list users table file not found"},
  92. {ERR_MLUSER_ALREADY_EXIST, "Mailing list user already exist"},
  93. {ERR_MLUSER_NOT_FOUND, "Mailing list user not found"},
  94. {ERR_SPOOL_FILE_NOT_FOUND, "Spool file not found"},
  95. {ERR_INVALID_SPOOL_FILE, "Invalid spool file"},
  96. {ERR_SPOOL_FILE_EXPIRED, "Spool file has reached max retry ops"},
  97. {ERR_SMTPRELAY_FILE_NOT_FOUND, "SMTP relay file not found"},
  98. {ERR_DOMAINS_FILE_NOT_FOUND, "POP3 domains file not found"},
  99. {ERR_DOMAIN_NOT_HANDLED, "POP3 domain not handled"},
  100. {ERR_BAD_SMTP_RESPONSE, "Bad SMTP response"},
  101. {ERR_CFG_VAR_NOT_FOUND, "Config variabile not found"},
  102. {ERR_BAD_DNS_RESPONSE, "Bad DNS response"},
  103. {ERR_SMTPGW_NOT_FOUND, "SMTP gateway not found"},
  104. {ERR_INCOMPLETE_CONFIG, "Incomplete server configuration file"},
  105. {ERR_MAIL_ERROR_LOOP, "Mail error loop detected"},
  106. {ERR_EXTALIAS_FILE_NOT_FOUND, "External-Alias file not found"},
  107. {ERR_EXTALIAS_EXIST, "External alias already exist"},
  108. {ERR_WRITE_EXTALIAS_FILE, "Error writing External-Alias file"},
  109. {ERR_EXTALIAS_NOT_FOUND, "External alias not found"},
  110. {ERR_NO_USER_DEFAULT_PRFILE, "Unable to open default user profile"},
  111. {ERR_FINGER_QUERY_FORMAT, "Error in FINGER query"},
  112. {ERR_LOCKED_RESOURCE, "Resource already locked"},
  113. {ERR_NO_PREDEFINED_MX, "No predefined mail exchanger"},
  114. {ERR_NO_MORE_MXRECORDS, "No more MX records"},
  115. {ERR_INVALID_MESSAGE_FORMAT, "Invalid message format"},
  116. {ERR_SMTP_BAD_MAIL_FROM, "[MAIL FROM:] not permitted by remote SMTP server"},
  117. {ERR_SMTP_BAD_RCPT_TO, "[RCPT TO:] not permitted by remote SMTP server"},
  118. {ERR_SMTP_BAD_DATA, "[DATA] not permitted by remote SMTP server"},
  119. {ERR_INVALID_MXRECS_STRING, "Invalid MX records string format"},
  120. {ERR_SETSOCKOPT, "Error in function {setsockopt}"},
  121. {ERR_CREATEEVENT, "Error in function {CreateEvent}"},
  122. {ERR_CREATESEMAPHORE, "Error in function {CreateSemaphore}"},
  123. {ERR_CLOSEHANDLE, "Error in function {CloseHandle}"},
  124. {ERR_RELEASESEMAPHORE, "Error in function {ReleaseSemaphore}"},
  125. {ERR_BEGINTHREADEX, "Error in function {_beginthreadex}"},
  126. {ERR_CREATEFILEMAPPING, "Error in function {CreateFileMapping}"},
  127. {ERR_MAPVIEWOFFILE, "Error in function {MapViewOfFile}"},
  128. {ERR_UNMAPVIEWOFFILE, "Error in function {UnmapViewOfFile}"},
  129. {ERR_SEMGET, "Error in function {semget}"},
  130. {ERR_SEMCTL, "Error in function {semctl}"},
  131. {ERR_SEMOP, "Error in function {semop}"},
  132. {ERR_FORK, "Error in function {fork}"},
  133. {ERR_SHMGET, "Error in function {shmget}"},
  134. {ERR_SHMCTL, "Error in function {shmctl}"},
  135. {ERR_SHMAT, "Error in function {shmat}"},
  136. {ERR_SHMDT, "Error in function {shmdt}"},
  137. {ERR_OPENDIR, "Error in function {opendir}"},
  138. {ERR_STAT, "Error in function {stat}"},
  139. {ERR_SMTP_BAD_CMD_SEQUENCE, "Bad SMTP command sequence"},
  140. {ERR_NO_ROOT_DOMAIN_VAR, "RootDomain config var not found"},
  141. {ERR_NS_NOT_FOUND, "Name Server for domain not found"},
  142. {ERR_NO_DEFINED_MXS_FOR_DOMAIN, "No MX records defined for domain"},
  143. {ERR_BAD_CTRL_COMMAND, "Bad CTRL command syntax"},
  144. {ERR_DOMAIN_ALREADY_HANDLED, "Domain already exist"},
  145. {ERR_BAD_CTRL_LOGIN, "Bad controller login"},
  146. {ERR_CTRL_ACCOUNTS_FILE_NOT_FOUND, "Controller accounts file not found"},
  147. {ERR_SPAMMER_IP, "Server registered spammer IP"},
  148. {ERR_TRUNCATED_DGRAM_DNS_RESPONSE, "Truncated UDP DNS response"},
  149. {ERR_NO_DGRAM_DNS_RESPONSE, "Unable to get UDP DNS response"},
  150. {ERR_EMPTY_DNS_RESPONSE, "Empty DNS response"},
  151. {ERR_BAD_SMARTDNSHOST_SYNTAX, "Bad SmartDNSHost config syntax"},
  152. {ERR_MAILBOX_SIZE, "User maximum mailbox size reached"},
  153. {ERR_DYNDNS_CONFIG, "Bad "DynDnsSetup" config syntax"},
  154. {ERR_PROCESS_EXECUTE, "Error executing external process"},
  155. {ERR_BAD_MAILPROC_CMD_SYNTAX, "Bad mailproc.tab command syntax"},
  156. {ERR_NO_MAILPROC_FILE, "User mail processing file not present"},
  157. {ERR_DNS_RECURSION_NOT_AVAILABLE, "DNS recursion not available"},
  158. {ERR_POP3_EXTERNAL_LINK_DISABLED, "External POP3 link disabled"},
  159. {ERR_BAD_DOMAIN_PROC_CMD_SYNTAX, "Error in custom domain processing file syntax"},
  160. {ERR_NOT_A_CUSTOM_DOMAIN, "Not a custom domain"},
  161. {ERR_NO_MORE_TOKENS, "No more tokens"},
  162. {ERR_SELECT, "Error in function {select}"},
  163. {ERR_REGISTER_EVENT_SOURCE, "Error in function {RegisterEventSource}"},
  164. {ERR_NOMORESEMS, "No more semaphores available"},
  165. {ERR_INVALID_SEMAPHORE, "Invalid semaphore"},
  166. {ERR_SHMEM_ALREADY_EXIST, "Shared memory already exist"},
  167. {ERR_SHMEM_NOT_EXIST, "Shared memory not exist"},
  168. {ERR_SEM_NOT_EXIST, "Semaphore not exist"},
  169. {ERR_SERVER_BUSY, "Server too busy, retry later"},
  170. {ERR_IP_NOT_ALLOWED, "Server does not like Your IP"},
  171. {ERR_FILE_EOF, "End of file reached"},
  172. {ERR_BAD_TAG_ADDRESS, "Bad tag ( From: , etc ... ) address"},
  173. {ERR_MAILFROM_UNKNOWN, "Unable to extract "MAIL FROM: <>" address"},
  174. {ERR_FILTERED_MESSAGE, "Message rejected by server filters"},
  175. {ERR_NO_DOMAIN_FILTER, "Domain filter not defined"},
  176. {ERR_POP3_RETR_BROKEN, "POP3 RETR operation broken in data retrieval"},
  177. {ERR_CCLN_INVALID_RESPONSE, "Invalid controller response"},
  178. {ERR_CCLN_ERROR_RESPONSE, "Controller response error"},
  179. {ERR_INCOMPLETE_PROCESSING, "Custom domain processing incomplete"},
  180. {ERR_NO_EXTERNAL_AUTH_DEFINED, "No external auth defined for requested username@domain"},
  181. {ERR_EXTERNAL_AUTH_FAILURE, "External authentication error"},
  182. {ERR_MD5_AUTH_FAILED, "MD5 authentication failed"},
  183. {ERR_NO_SMTP_AUTH_CONFIG, "SMTP authentication config not found"},
  184. {ERR_UNKNOWN_SMTP_AUTH, "Unknown SMTP authentication mode"},
  185. {ERR_BAD_SMTP_AUTH_CONFIG, "Bad SMTP authentication config"},
  186. {ERR_BAD_EXTRNPRG_EXITCODE, "Bad external program exit code"},
  187. {ERR_BAD_SMTP_CMD_SYNTAX, "Bad SMTP command syntax"},
  188. {ERR_SMTP_AUTH_FAILED, "SMTP client authentication failed"},
  189. {ERR_BAD_SMTP_EXTAUTH_RESPONSE_FILE, "Bad external SMTP auth response file syntax"},
  190. {ERR_SMTP_USE_FORBIDDEN, "Server use is forbidden"},
  191. {ERR_SPAM_ADDRESS, "Server registered spammer domain"},
  192. {ERR_SOCK_NOMORE_DATA, "End of socket stream data"},
  193. {ERR_BAD_TAB_INDEX_FIELD, "Bad TAB field index"},
  194. {ERR_FILE_READ, "Error reading file"},
  195. {ERR_BAD_INDEX_FILE, "Bad index file format"},
  196. {ERR_INDEX_HASH_NOT_FOUND, "Record hash not found in index"},
  197. {ERR_RECORD_NOT_FOUND, "Record not found in TAB file"},
  198. {ERR_HEAP_ALLOC, "Heap block alloc error"},
  199. {ERR_HEAP_FREE, "Heap block free error"},
  200. {ERR_RESOURCE_NOT_LOCKED, "Trying to unlock an unlocked resource"},
  201. {ERR_LOCK_ENTRY_NOT_FOUND, "Resource lock entry not found"},
  202. {ERR_LINE_TOO_LONG, "Stream line too long"},
  203. {ERR_MAIL_LOOP_DETECTED, "Mail loop detected"},
  204. {ERR_FILE_MOVE, "Unable to move file"},
  205. {ERR_INVALID_MAILDIR_SUBPATH, "Error invalid Maildir sub path"},
  206. {ERR_SMTP_TOO_MANY_RECIPIENTS, "Too many SMTP recipients"},
  207. {ERR_DNS_CACHE_FILE_FMT, "Error in DNS cache file format"},
  208. {ERR_DNS_CACHE_FILE_EXPIRED, "DNS cache file expired"},
  209. {ERR_MMAP, "Error in function {mmap}"},
  210. {ERR_NOT_LOCKED, "Not locked"},
  211. {ERR_SMTPFWD_FILE_NOT_FOUND, "SMTP forward gateway file not found"},
  212. {ERR_SMTPFWD_NOT_FOUND, "SMTP forward gateway not found"},
  213. {ERR_USER_BREAK, "Operation interrupted"},
  214. {ERR_SET_THREAD_PRIORITY, "Error setting thread priority"},
  215. {ERR_NULL_SENDER, "Empty message sender"},
  216. {ERR_RCPTTO_UNKNOWN, "Mail tag "To:" missing"},
  217. {ERR_LOADMODULE, "Error moading dynamic module"},
  218. {ERR_LOADMODULESYMBOL, "Error moading dynamic module symbol"},
  219. {ERR_NOMORE_TLSKEYS, "No more TLS keys are available"},
  220. {ERR_INVALID_TLSKEY, "Invalid TLS key"},
  221. {ERR_ERRORINIT_FAILED, "Error initialization failed"},
  222. {ERR_SENDFILE, "Error in function {sendfile}"},
  223. {ERR_MUTEXINIT, "Error in function {pthread_mutex_init}"},
  224. {ERR_CONDINIT, "Error in function {pthread_cond_init}"},
  225. {ERR_THREADCREATE, "Error in function {pthread_create}"},
  226. {ERR_CREATEMUTEX, "Error in function {CreateMutex}"},
  227. {ERR_NO_LOCAL_SPOOL_FILES, "Local spool empty"},
  228. {ERR_NO_HANDLED_DOMAIN, "Unable to retrieve an handled domain from peer IP"},
  229. {ERR_INVALID_MAIL_DOMAIN, "Remote domain has no DNS/MX entries"},
  230. {ERR_BAD_CMDSTR_CHARS, "Bad characters in command line"},
  231. {ERR_FETCHMSG_UNDELIVERED, "POP3 fetched message failed delivery"},
  232. {ERR_USER_VAR_NOT_FOUND, "User configuration variable not found"},
  233. {ERR_NO_POP3_IP, "Invalid or not available POP3 connection IP"},
  234. {ERR_NO_MESSAGE_FILE, "Message file not existent"},
  235. {ERR_GET_DISK_SPACE_INFO, "Error getting disk space info"},
  236. {ERR_GET_MEMORY_INFO, "Error getting memory info"},
  237. {ERR_LOW_DISK_SPACE, "System low in disk space"},
  238. {ERR_LOW_VM_SPACE, "System low in virtual memory"},
  239. {ERR_USER_DISABLED, "Account disabled"},
  240. {ERR_BAD_DNS_NAME_RECORD, "Bad format for DNS name record"},
  241. {ERR_MESSAGE_SIZE, "Message exceeds fixed maximum message size"},
  242. {ERR_SMTPSRV_MSG_SIZE, "Message too big for the remote SMTP server"},
  243. {ERR_MAPS_CONTAINED, "The peer IP is mapped"},
  244. {ERR_ADOMAIN_FILE_NOT_FOUND, "Domain aliases file not found"},
  245. {ERR_ADOMAIN_EXIST, "Domain alias already exist"},
  246. {ERR_ADOMAIN_NOT_FOUND, "Domain alias not found"},
  247. {ERR_NOT_A_CMD_ALIAS, "Cmd alias not found"},
  248. {ERR_GETSOCKOPT, "Error in function {getsockopt}"},
  249. {ERR_NO_HDR_FETCH_TAGS, "No fetch headers tags string supplied"},
  250. {ERR_SET_FILE_TIME, "Error setting file times"},
  251. {ERR_LISTDIR_NOT_FOUND, "Listing directory not found"},
  252. {ERR_DUPLICATE_HANDLE, "Error in function {DuplicateHandle}"},
  253. {ERR_EMPTY_LOG, "Log file is empty"},
  254. {ERR_BAD_RELATIVE_PATH, "Error in relative path syntax"},
  255. {ERR_DNS_NXDOMAIN, "DNS name not exist"},
  256. {ERR_BAD_RFCNAME, "Name does not respect RFC822"},
  257. {ERR_CONNECT, "Error connecting to remote address"},
  258. {ERR_MESSAGE_DELETED, "Message marked for deletion"},
  259. {ERR_PIPE, "Pipe creation error"},
  260. {ERR_WAITPID, "Error in function {waitpid}"},
  261. {ERR_MUNMAP, "Error in function {munmap}"},
  262. {ERR_INVALID_MMAP_OFFSET, "Invalid memory map offset"},
  263. {ERR_UNMAPFILEVIEW, "File view unmap failed"},
  264. {ERR_INVALID_IMAP_LINE, "Invalid IMAP syntax"},
  265. {ERR_IMAP_RESP_NO, "IMAP response NO"},
  266. {ERR_IMAP_RESP_BAD, "IMAP response BAD"},
  267. {ERR_IMAP_RESP_BYE, "IMAP response BYE"},
  268. {ERR_IMAP_UNKNOWN_AUTH, "Unknown IMAP authentication method"},
  269. {ERR_DNS_IS_CNAME, "CNAME DNS record detected"},
  270. {ERR_NO_MESSAGE_AUTH, "Message authentication not found"},
  271. };
  272. static void ErrFreeEnv(void *pData)
  273. {
  274. ErrorEnv *pEV = (ErrorEnv *) pData;
  275. if (pEV != NULL) {
  276. char **ppszInfo = pEV->pszInfo;
  277. for (int ii = 0; ii < CountOf(Errors); ii++, ppszInfo++)
  278. if (*ppszInfo != NULL)
  279. SysFree(*ppszInfo), *ppszInfo = NULL;
  280. SysFree(pEV);
  281. }
  282. }
  283. static void ErrOnceSetup(void)
  284. {
  285. SysCreateTlsKey(ErrTlsKey, ErrFreeEnv);
  286. }
  287. static ErrorEnv *ErrSetupEnv(void)
  288. {
  289. SysThreadOnce(&OnceSetup, ErrOnceSetup);
  290. ErrorEnv *pEV = (ErrorEnv *) SysGetTlsKeyData(ErrTlsKey);
  291. if (pEV == NULL) {
  292. if ((pEV = (ErrorEnv *) SysAlloc(sizeof(ErrorEnv) +
  293.  CountOf(Errors) * sizeof(char *))) == NULL)
  294. return (NULL);
  295. pEV->iErrorNo = ERR_SUCCESS;
  296. char **ppszInfo = pEV->pszInfo;
  297. for (int ii = 0; ii < CountOf(Errors); ii++, ppszInfo++)
  298. *ppszInfo = NULL;
  299. if (SysSetTlsKeyData(ErrTlsKey, pEV) < 0) {
  300. SysFree(pEV);
  301. return (NULL);
  302. }
  303. }
  304. return (pEV);
  305. }
  306. static int ErrGetErrorIndex(int iErrorCode)
  307. {
  308. for (int ii = 0; ii < CountOf(Errors); ii++)
  309. if (Errors[ii].iErrorCode == iErrorCode)
  310. return (ii);
  311. return (-1);
  312. }
  313. int ErrGetErrorCode(void)
  314. {
  315. ErrorEnv *pEV = ErrSetupEnv();
  316. if (pEV == NULL)
  317. return (ERR_ERRORINIT_FAILED);
  318. return (pEV->iErrorNo);
  319. }
  320. int ErrSetErrorCode(int iError, char const *pszInfo)
  321. {
  322. ErrorEnv *pEV = ErrSetupEnv();
  323. if (pEV == NULL)
  324. return (ERR_ERRORINIT_FAILED);
  325. pEV->iErrorNo = iError;
  326. if (pszInfo != NULL) {
  327. int iErrIndex = ErrGetErrorIndex(iError);
  328. if (iErrIndex >= 0) {
  329. if (pEV->pszInfo[iErrIndex] != NULL)
  330. SysFree(pEV->pszInfo[iErrIndex]);
  331. pEV->pszInfo[iErrIndex] = SysStrDup(pszInfo);
  332. }
  333. }
  334. return (0);
  335. }
  336. const char *ErrGetErrorString(int iError)
  337. {
  338. int iErrIndex = ErrGetErrorIndex(iError);
  339. return ((iErrIndex >= 0) ? Errors[iErrIndex].pszError : "Unknown error code");
  340. }
  341. const char *ErrGetErrorString(void)
  342. {
  343. ErrorEnv *pEV = ErrSetupEnv();
  344. if (pEV == NULL)
  345. return (ErrGetErrorString(ERR_ERRORINIT_FAILED));
  346. return (ErrGetErrorString(pEV->iErrorNo));
  347. }
  348. char *ErrGetErrorStringInfo(int iError)
  349. {
  350. ErrorEnv *pEV = ErrSetupEnv();
  351. if (pEV == NULL)
  352. return (SysStrDup(ErrGetErrorString(iError)));
  353. int iErrIndex = ErrGetErrorIndex(iError);
  354. if (iErrIndex < 0)
  355. return (SysStrDup("Unknown error code"));
  356. int iInfoLength = (pEV->pszInfo[iErrIndex] != NULL) ? strlen(pEV->pszInfo[iErrIndex]) : 0;
  357. char *pszErrorInfo = (char *) SysAlloc(strlen(Errors[iErrIndex].pszError) +
  358.        iInfoLength + 256);
  359. if (pszErrorInfo == NULL)
  360. return (NULL);
  361. if (pEV->pszInfo[iErrIndex] != NULL)
  362. sprintf(pszErrorInfo,
  363. "ErrCode   = %dn"
  364. "ErrString = %sn"
  365. "ErrInfo   = %s", iError, Errors[iErrIndex].pszError,
  366. pEV->pszInfo[iErrIndex]);
  367. else
  368. sprintf(pszErrorInfo,
  369. "ErrCode   = %dn" "ErrString = %s", iError, Errors[iErrIndex].pszError);
  370. return (pszErrorInfo);
  371. }
  372. int ErrLogMessage(int iLogLevel, char const *pszFormat, ...)
  373. {
  374. char *pszErrorInfo = ErrGetErrorStringInfo(ErrGetErrorCode());
  375. if (pszErrorInfo == NULL)
  376. return (ErrGetErrorCode());
  377. char *pszUserMessage = NULL;
  378. STRSPRINTF(pszUserMessage, pszFormat, pszFormat);
  379. if (pszUserMessage == NULL) {
  380. SysFree(pszErrorInfo);
  381. return (ErrGetErrorCode());
  382. }
  383. SysLogMessage(iLogLevel, "<<n" "%sn" "%s" ">>n", pszErrorInfo, pszUserMessage);
  384. SysFree(pszUserMessage);
  385. SysFree(pszErrorInfo);
  386. return (0);
  387. }
  388. int ErrFileLogString(char const *pszFileName, char const *pszMessage)
  389. {
  390. char *pszErrorInfo = ErrGetErrorStringInfo(ErrGetErrorCode());
  391. if (pszErrorInfo == NULL)
  392. return (ErrGetErrorCode());
  393. FILE *pLogFile = fopen(pszFileName, "a+t");
  394. if (pLogFile == NULL) {
  395. SysFree(pszErrorInfo);
  396. ErrSetErrorCode(ERR_FILE_CREATE, pszFileName);
  397. return (ERR_FILE_CREATE);
  398. }
  399. fprintf(pLogFile, "<<n" "%sn" "%s" ">>n", pszErrorInfo, pszMessage);
  400. fclose(pLogFile);
  401. SysFree(pszErrorInfo);
  402. return (0);
  403. }