add hal-tdm-log.c file
[platform/hal/api/tdm.git] / src / hal-tdm-log.c
1 #include <stdio.h>
2 #include <dlog.h>
3 #include "hal-tdm-types.h"
4 #include "common.h"
5
6 #define TDM_PATH_LEN        1024
7
8 #define COLOR_RED "\x1b[31m"      /* for error */
9 #define COLOR_YELLOW "\x1b[33m"   /* for warning */
10 #define COLOR_GREEN "\x1b[32m"    /* for info */
11 #define COLOR_RESET "\x1b[0m"
12
13 #if ENABLE_DLOG
14 static unsigned int dlog_enable = 1;
15 #else
16 static unsigned int dlog_enable = 0;
17 #endif
18 static unsigned int color_enable = 1;
19
20 unsigned int tdm_log_debug_level = HAL_TDM_LOG_LEVEL_INFO;
21
22 static int stdout_fd = -1;
23
24 void
25 tdm_log_set_path(const char *path)
26 {
27         if (!path) {
28                 if (stdout_fd != -1) {
29                         fflush(stdout);
30                         close(STDOUT_FILENO);
31                         dup2(stdout_fd, STDOUT_FILENO);
32                         close(stdout_fd);
33                         stdout_fd = -1;
34                 }
35         } else {
36                 char fd_name[TDM_PATH_LEN];
37                 int  log_fd = -1;
38                 FILE *log_fl;
39
40                 snprintf(fd_name, TDM_PATH_LEN, "%s", path);
41
42                 log_fl = fopen(fd_name, "a");
43                 if (!log_fl) {
44                         HAL_TDM_ERR("failed: open file(%s)\n", fd_name);
45                         return;
46                 }
47
48                 if (stdout_fd == -1) {
49                         fflush(stdout);
50                         stdout_fd = dup(STDOUT_FILENO);
51                         if (stdout_fd < 0) {
52                                 HAL_TDM_ERR("dup failed: %m\n");
53                                 fclose(log_fl);
54                                 return;
55                         }
56                 }
57
58                 setvbuf(log_fl, NULL, _IOLBF, 512);
59                 log_fd = fileno(log_fl);
60
61                 close(STDOUT_FILENO);
62                 dup2(log_fd, STDOUT_FILENO);
63                 fclose(log_fl);
64         }
65 }
66
67 static void
68 _tdm_log_vprint_stdout(int level, const char *fmt, va_list arg)
69 {
70         char *lvl_str[] = {"HAL_TDM_NON", "HAL_TDM_ERR", "HAL_TDM_WRN", "HAL_TDM_INF", "HAL_TDM_DBG"};
71         char *color[] = {COLOR_RESET, COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_RESET};
72
73         if (level > tdm_log_debug_level)
74                 return;
75
76         if (color_enable)
77                 printf("%s", color[level]);
78         printf("[%s]", lvl_str[level]);
79         if (color_enable)
80                 printf(COLOR_RESET);
81         vprintf(fmt, arg);
82         printf("\n");
83 }
84
85 void
86 tdm_log_print_stdout(int level, const char *fmt, ...)
87 {
88         va_list arg;
89         va_start(arg, fmt);
90         _tdm_log_vprint_stdout(level, fmt, arg);
91         va_end(arg);
92 }
93
94 static void
95 _tdm_log_dlog_print(int level, const char *fmt, va_list arg)
96 {
97         log_priority dlog_prio;
98
99         switch (level) {
100         case HAL_TDM_LOG_LEVEL_ERR:
101                 dlog_prio = DLOG_ERROR;
102                 break;
103         case HAL_TDM_LOG_LEVEL_WRN:
104                 dlog_prio = DLOG_WARN;
105                 break;
106         case HAL_TDM_LOG_LEVEL_INFO:
107                 dlog_prio = DLOG_INFO;
108                 break;
109         case HAL_TDM_LOG_LEVEL_DBG:
110                 dlog_prio = DLOG_DEBUG;
111                 break;
112         default:
113                 return;
114         }
115         __dlog_vprint(LOG_ID_SYSTEM, dlog_prio, LOG_TAG, fmt, arg);
116 }
117
118 void
119 hal_tdm_log_print(int level, const char *fmt, ...)
120 {
121         va_list arg;
122
123         if (level > tdm_log_debug_level)
124                 return;
125
126         if (dlog_enable) {
127                 va_start(arg, fmt);
128                 _tdm_log_dlog_print(level, fmt, arg);
129                 va_end(arg);
130         } else {
131                 va_start(arg, fmt);
132                 _tdm_log_vprint_stdout(level, fmt, arg);
133                 va_end(arg);
134         }
135 }