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