1 /*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 * http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15
16 #include <unistd.h>
17 #include "logger.h"
18
GetLogLevel(void)19 LogLevel GetLogLevel(void)
20 {
21 #ifdef TLS_DEBUG
22 return ENUM_LOG_LEVEL_TRACE;
23 #else
24 return ENUM_LOG_LEVEL_FATAL;
25 #endif
26 }
27
ConvertLevel2Str(LogLevel level)28 static const char *ConvertLevel2Str(LogLevel level)
29 {
30 switch (level) {
31 case ENUM_LOG_LEVEL_TRACE:
32 return "TRACE";
33 case ENUM_LOG_LEVEL_DEBUG:
34 return "DEBUG";
35 case ENUM_LOG_LEVEL_WARNING:
36 return "WARNING";
37 case ENUM_LOG_LEVEL_ERROR:
38 return "ERROR";
39 case ENUM_LOG_LEVEL_FATAL:
40 return "FATAL";
41 default:
42 return "UNKNOWN";
43 }
44 }
45
LogWrite(LogLevel level,const char * file,int line,const char * fmt,...)46 int LogWrite(LogLevel level, const char *file, int line, const char *fmt, ...)
47 {
48 int len, ilen;
49 LogLevel curLevel;
50 va_list vargs;
51 int tmpLevel = level;
52 char logBuf[LOG_MAX_SIZE] = {0};
53
54 if ((tmpLevel < ENUM_LOG_LEVEL_TRACE) || (tmpLevel > ENUM_LOG_LEVEL_FATAL)) {
55 return 0;
56 }
57
58 // Print logs whose levels are higher than or equal to the current level.
59 curLevel = GetLogLevel();
60 if (level < curLevel) {
61 return 0;
62 }
63
64 // Process the log header
65 if (file == NULL || line == 0) {
66 len = snprintf_s(logBuf, LOG_MAX_SIZE, (size_t)(LOG_MAX_SIZE - 1), "[%d_TEST_%s]",
67 getpid(), ConvertLevel2Str((LogLevel)tmpLevel));
68 } else {
69 len = snprintf_s(logBuf, LOG_MAX_SIZE, (size_t)(LOG_MAX_SIZE - 1), "[%d_TEST_%s][%s:%d]",
70 getpid(), ConvertLevel2Str((LogLevel)tmpLevel), file, line);
71 }
72
73 if (len < 0 || len > LOG_MAX_SIZE - 1) {
74 return 0;
75 }
76
77 va_start(vargs, fmt);
78 ilen = vsnprintf_s(logBuf + len, (size_t)(LOG_MAX_SIZE - len), (size_t)(LOG_MAX_SIZE - len - 1), fmt, vargs);
79 if (ilen < 0 || ilen > LOG_MAX_SIZE - len - 1) {
80 // In the case of overflow truncation, the maximum value is used
81 len = LOG_MAX_SIZE;
82 logBuf[len - 1] = '\0';
83 goto EXIT;
84 }
85
86 len += ilen;
87 logBuf[len] = '\n';
88 logBuf[len + 1] = '\0';
89 EXIT:
90 va_end(vargs);
91 #ifdef TLS_DEBUG
92 printf("%s", logBuf);
93 #endif
94 return 0;
95 }
96