blob: 16065529d2f7ed068620e67fdd2a3c776d41ed3f [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include <stdio.h>
2#include <include/log.h>
3#include <sys/un.h>
4#include <pthread.h>
5#include <stdarg.h>
6#include <stdlib.h>
7#include <sys/prctl.h>
8#include <time.h>
9#include <string.h>
10#include <sys/time.h>
11#include <syslog.h>
12#include <sys/types.h>
13#include <sys/stat.h>
14#include <fcntl.h>
15#include <errno.h>
16
17#include "mbtk_type.h"
18#include "mbtk_log.h"
19
20#define LOG_VERBOSE 8
21
22static int tlog_fd = -1;
b.liu30d950d2023-09-25 20:37:45 +080023// Default for radio log.
24static int syslog_radio_enable = 2;
liubin281ac462023-07-19 14:22:54 +080025static FILE* logfile = NULL;
26static int signal_fd = -1;
27
28/**
29 * @brief mbtk_log_init
30 *
31 * @details 设置Log输出方式
32 * @param
33 * path:
34 * 不填参数(NULL) stdout : 命令行输
35 * "syslog":输出到syslog
36 * "radio":CatStudio
37 * 文件路径:输出到自定义文件路径
38 * tag : 自定义tag
39 *
40 * example:
41 * mbtk_log_init(NULL, "MBTK_RIL");
42 * mbtk_log_init("syslog", "MBTK_RIL");
43 * mbtk_log_init("radio", "MBTK_RIL");
44 * mbtk_log_init("/tmp/log/test.log", "MBTK_RIL");
45 */
46void mbtk_log_init(char* path, char* tag)
47{
48 if (str_empty(path)) {
49 tlog_fd = STDOUT_FILENO;
50 } else if (0 == memcmp(path, "syslog", 6)) {
51 openlog(tag, LOG_PID, LOG_USER);
52 syslog_radio_enable = 1;
53 } else if (0 == memcmp(path, "radio", 5)) {
54 if (tag && strlen(tag) > 0) {
55 set_service_log_tag(tag);
56 } else {
57 set_service_log_tag("MBTK");
58 }
59 syslog_radio_enable = 2;
60 } else if (path) {
61 tlog_fd = open(path, O_CREAT | O_WRONLY | O_APPEND, 0600);
62 if (tlog_fd < 0) {
63 fprintf(stderr, "failed to open %s: %s\n", path, strerror(errno));
64 exit(-1);
65 }
66 }
67}
68
69/* Control the log output */
70void mbtk_log(int level, const char* format, ...)
71{
72 char buf[1024] = {0};
73 va_list ap;
74 struct timeval log_time;
75 int length = 0;
76
77 va_start(ap, format);
78 length = vsnprintf(buf, sizeof(buf), format, ap);
79 if (length < 0 || 0 == length) {
80 return -1;
81 }
82
83 if (1 == syslog_radio_enable) {
84 syslog(level, "%s", buf);
85 } else if (2 == syslog_radio_enable) {
86 __android_log_printf(LOG_ID_RADIO, level, "%s", buf);
87 } else if (-1 != tlog_fd) {
88 char tmp[50] = {0};
89 gettimeofday(&log_time, NULL);
90 struct tm* tm_t = localtime(&(log_time.tv_sec));
91 strftime(tmp, 50, "%F %T", tm_t);
92 snprintf(tmp + strlen(tmp), sizeof(tmp) - strlen(tmp), " %d<%d>:", (int)(log_time.tv_usec / 1000), level);
93 write(tlog_fd, tmp, strlen(tmp));
94 write(tlog_fd, buf, length);
95 if (buf[length - 1] != '\n') {
96 write(tlog_fd, "\n", 1);
97 }
98 if (tlog_fd > 2) {
99 fsync(tlog_fd);
100 }
101 }
102
103 va_end(ap);
104}
105
106void log_hex(const char* tag, const void* data, int data_len)
107{
108 char buffer[60];
109 char str[17];
110 int size = 0;
111 uint8* ptr = (uint8*)data;
112 int i, j;
113 memset(buffer, 0x0, 60);
114 memset(str, 0x0, 17);
115 LOGI("%s,Length-%d:", tag, data_len);
116 LOGI(" 0 1 2 3 4 5 6 7 8 9 a b c d e f");
117 size += snprintf(buffer, 60, "%04x| ", 0);
118 for (i = 0; i < data_len; i++) {
119 size += snprintf(buffer + size, 60 - size, "%02x ", ptr[i]);
120 if (isprint(ptr[i])) {
121 str[i % 16] = ptr[i];
122 } else {
123 str[i % 16] = '.';
124 }
125 if ((i + 1) % 16 == 0 || i == data_len - 1) {
126 for (j = size; j < 54; j++) {
127 buffer[j] = ' ';
128 }
129 LOGI("%s| %s", buffer, str);
130
131 memset(buffer, 0x0, 60);
132 memset(str, 0x0, 17);
133 size = 0;
134 size += snprintf(buffer, 60, "%04x| ", (i + 1) / 16);
135 }
136 }
137}
138
139#define _MOPEN_RILD_SOCKET "/tmp/logd_socket"
140
141int mbtk_signal_log(char *data)
142{
143 char buff[256];
144 int size = 0;
145 int ret = 0;
146 int i = 0;
147 static struct sockaddr_un srv_addr;
148
149 if(signal_fd < 0) {
150 if (access(_MOPEN_RILD_SOCKET, F_OK) == -1) {
151 LOGW("Service not running...");
152 return -1;
153 }
154
155 signal_fd = socket(PF_UNIX, SOCK_STREAM, 0);
156 if (signal_fd < 0) {
157 LOGE("cannot creat socket");
158 return -1;
159 }
160
161 srv_addr.sun_family = AF_UNIX;
162 strcpy(srv_addr.sun_path, _MOPEN_RILD_SOCKET);
163 ret = connect(signal_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
164 if (ret < 0) {
165 LOGE("cannot connect server, ret=%d, errno=%d", ret, errno);
166 close(signal_fd);
167 signal_fd = -1;
168 return -1;
169 }
170 }
171
172 memset(buff, 0, sizeof(buff));
173 snprintf(buff, sizeof(buff), "%s\n", data);
174 size = write(signal_fd, buff, sizeof(buff));
175 if (size < 0 || size == 0) {
176 LOGE("cannot write , ret=%d, errno=%d\n", ret, errno);
177 return 1;
178 }
179
180 // close(signal_fd);
181
182 return 0;
183}