blob: 142ce138e762ede580badc132c1561795645ba4e [file] [log] [blame]
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <time.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
#include <signal.h>
#include "json-c/json.h"
#include "json-c/printbuf.h"
#include "log_config.h"
#include "mbtk_type.h"
//#define DEBUG 1
#ifdef MBTK_DUMP_SUPPORT
void mbtk_debug_open(const char *log_file, bool thread_support);
#endif
#ifdef DEBUG
#define mbtk_log(...) printf(__VA_ARGS__)
#else
#define mbtk_log(...)
#endif
int emmc_pro = -1;
#define MAX_BUFFER_SIZE (8*1024)
#define MAX_SLEEP_TIME 2147483647
int tmp_syslog_fd = -1;
int tmp_rd_fd = -1;
//char syslog_buff[MAX_BUFFER_SIZE] = {0};
//char radiolog_buff[MAX_BUFFER_SIZE] = {0};
char *radio_globalPtr = NULL;
char *sys_globalPtr = NULL;
int radio_len = 0;
int sys_len = 0;
static void signal_handler(int signum)
{
printf("Received SIGTERM signal, fflush buffer\n");
if(fcntl(tmp_syslog_fd, F_GETFL) != -1 && sys_globalPtr !=NULL )
{
if(write(tmp_syslog_fd, sys_globalPtr, sys_len) < 0)
{
perror("write error");
}
// memset(syslog_buff,0,MAX_BUFFER_SIZE);
memset(sys_globalPtr, 0, MAX_BUFFER_SIZE);
sys_globalPtr =NULL;
}
if(fcntl(tmp_rd_fd, F_GETFL) != -1 && radio_globalPtr !=NULL)
{
if(write(tmp_rd_fd, radio_globalPtr, radio_len) < 0)
{
perror("write error");
}
//memset(radiolog_buff,0,MAX_BUFFER_SIZE);
memset(radio_globalPtr, 0, MAX_BUFFER_SIZE);
radio_globalPtr =NULL;
}
}
static void handler_free(log_config_entry* listdata)
{
int i, n;
struct filter_list_t* _filter_list = NULL;
log_config_entry* entry;
for (i = 0; i < 5; i++) {
entry = listdata + i;
if (entry->name) {
//free(entry->name);
if (entry->out_path) {
//free(entry->out_path);
}
if (entry->ip) {
free(entry->ip);
}
_filter_list = entry->filter_list;
for (n = 0; n < 10; n++) {
printf("%s %d: malloc %p!\n", __FUNCTION__, __LINE__, _filter_list);
if (_filter_list) {
printf("%s %d: malloc %p!\n", __FUNCTION__, __LINE__, _filter_list->next);
if (_filter_list->tag && _filter_list->tag[0] != '\0') {
free(_filter_list->tag);
}
struct filter_list_t* tmp_filter_list = _filter_list;
_filter_list = _filter_list->next;
free(tmp_filter_list);
} else {
break;
}
}
} else {
break;
}
}
}
int parse_config(log_config_entry* listdata)
{
json_object* jsonobj = NULL;
json_object* tmpjson = NULL;
json_object* datajson = NULL;
json_object* listjson = NULL;
json_object* fileterjson = NULL;
json_object* fileter_listjson = NULL;
log_config_entry* entry;
int i, n, ret, array_length;
char* cmdval = NULL;
printf("MBTK_LOGD: in parse_config\n");
jsonobj = json_object_from_file(LOG_CONFIG_PATH);
if (NULL == jsonobj) {
printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
return -1;
}
ret = json_object_object_get_ex(jsonobj, "logd", &tmpjson);
if (!ret) {
printf("get jsondata error ...\n");
}
if (NULL == tmpjson) {
printf("the tmpjson : [%s]\n", json_object_to_json_string(tmpjson));
}
/**获取total***/
cmdval = (char*)json_object_get_string(tmpjson);
printf("logd enable : %s\n", cmdval);
json_object_put(tmpjson);
/***获取data***/
json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
for (i = 0 ; i < 5; i++) {
struct filter_list_t* _filter_list = NULL;
struct filter_list_t* tmp_filter_list = NULL;
datajson = json_object_array_get_idx(tmpjson, i);
if (NULL == datajson) {
mbtk_log("the datajson exit\n");
break;
}
entry = listdata + i;
json_object_object_get_ex(datajson, "enable", &listjson);
entry->enable = json_object_get_int(listjson);
mbtk_log("enable: %d\n", entry->enable);
json_object_object_get_ex(datajson, "name", &listjson);
entry->name = (char*)json_object_get_string(listjson);
printf("cmdval: %s\n", entry->name);
json_object_object_get_ex(datajson, "log_file", &listjson);
entry->out_path = (char*)json_object_get_string(listjson);
mbtk_log("cmdval: %s\n", entry->out_path);
json_object_object_get_ex(datajson, "emmc_protect", &listjson);
emmc_pro = json_object_get_int(listjson);
printf("emmc_pro enable: %d\n", emmc_pro);
json_object_object_get_ex(datajson, "log_stream", &listjson);
if (listjson) {
entry->ip = (char*)json_object_get_string(listjson);
cmdval = strstr(entry->ip, ":");
if (cmdval) {
entry->port = &cmdval[1];
cmdval[0] = 0;
mbtk_log("cmdval: %s [%s]\n", entry->ip, entry->port);
} else {
printf("Can't find port!!\n");
free(entry->ip);
entry->ip = NULL;
}
}
json_object_object_get_ex(datajson, "rotate_file_size", &listjson);
entry->rotate_file_size = json_object_get_int(listjson) * 1024;
mbtk_log("rotate_file_size: %d\n", entry->rotate_file_size);
json_object_object_get_ex(datajson, "rotate_file_count", &listjson);
entry->rotate_file_count = json_object_get_int(listjson);
mbtk_log("rotate_file_count: %d\n", entry->rotate_file_count);
json_object_object_get_ex(datajson, "filter_list", &listjson);
if (NULL == listjson) {
printf("%s %d: object failure!\n", __FUNCTION__, __LINE__);
json_object_put(listjson);
continue;
}
entry->filter_list = (struct filter_list_t*)malloc(sizeof(struct filter_list_t));
_filter_list = entry->filter_list;
array_length = json_object_array_length(listjson);
for (n = 0 ; n <= array_length; n++) {
fileterjson = json_object_array_get_idx(listjson, n);
if (NULL == fileterjson) {
mbtk_log("the fileterjson exit\n");
free(tmp_filter_list->next);
tmp_filter_list->next = NULL;
break;
}
memset(_filter_list, 0, sizeof(struct filter_list_t));
json_object_object_get_ex(fileterjson, "priority", &fileter_listjson);
const char* str = json_object_get_string(fileter_listjson);
if (str) {
_filter_list->priority = str[0];
mbtk_log("fileter_listjson: %c\n", _filter_list->priority);
}
json_object_object_get_ex(fileterjson, "tag", &fileter_listjson);
// if (NULL == fileter_listjson) {
// printf("%s %d: object failure!\n", __FUNCTION__, __LINE__);
// }
str = json_object_get_string(fileter_listjson);
if (str) {
_filter_list->tag = strdup(str);
mbtk_log("fileter_listjson: %s\n", _filter_list->tag);
}
else
{
_filter_list->tag = "\0";
}
//json_object_put(fileter_listjson);
_filter_list->next = (struct filter_list_t*)malloc(sizeof(struct filter_list_t));
if (NULL == _filter_list->next) {
printf("%s %d: malloc failure!\n", __FUNCTION__, __LINE__);
break;
}
tmp_filter_list = _filter_list;
_filter_list = _filter_list->next;
}
}
/***释放json对象***/
json_object_put(jsonobj);
printf("MBTK_LOGD: parse_config end\n");
return 0;
}
#define LOGD_PID "/var/run/mbtk_logd.pid"
#if 0
static int save_pid(void)
{
pid_t process_id;
int fd, ret;
char buf[12] = {0};
process_id = getpid();
if(access(LOGD_PID, F_OK) == 0)
{
printf("mbtk_logd 进程已经存在\n");
return -1;
}
fd = open(LOGD_PID, O_CREAT | O_WRONLY, 0600);
if (fd < 0) {
fprintf(stderr, "failed to open %s: %s\n", LOGD_PID, strerror(errno));
return -2;
}
snprintf(buf, sizeof(buf), "%d\n", process_id);
ret = write(fd, buf, strlen(buf));
close(fd);
if(ret > 0)
return 0;
else
return -2;
}
#endif
int main(int argc, char* argv[])
{
log_config_entry listdata[5];
pthread_t pid[5] = {0};
int i, ret;
void* tret;
//struct filter_list_t* _filter_list = NULL;
signal(SIGTERM, signal_handler);
#ifdef MBTK_DUMP_SUPPORT
mbtk_debug_open(NULL, TRUE);
#endif
int lock_file = open("/tmp/mbtk_logd.lock", O_CREAT|O_RDWR, 0666);
int rc = flock(lock_file,LOCK_EX|LOCK_NB);
if(rc) {
if(EWOULDBLOCK == errno) {
printf("Error: cannot restart the mbtk_logd repeatedly\n");
exit(0);
}
}
memset(listdata, 0, sizeof(log_config_entry) * 5);
ret = parse_config(listdata);
if (ret) {
return -1;
}
printf("logd %s start !\n", __FUNCTION__);
for (i = 0; i < 5; ++i) {
if (NULL == listdata[i].name) {
break;
}
if (0 == listdata[i].enable) {
printf("%s log disabled !\n", listdata[i].name);
continue;
}
if (0 == memcmp(listdata[i].name, "radio", 5)) {
ret = pthread_create(&pid[i], NULL, alog_thread, &listdata[i]);
if (ret != 0) {
fprintf(stderr, "\n%s: Failed to create pthread\n", __FUNCTION__);
}
} else if (0 == memcmp(listdata[i].name, "syslog", 6)) {
ret = pthread_create(&pid[i], NULL, syslog_main, &listdata[i]);
if (ret != 0) {
fprintf(stderr, "\n%s %d: Failed to create pthread\n", __FUNCTION__, __LINE__);
}
} else if (0 == memcmp(listdata[i].name, "local_socket", 12)) {
ret = pthread_create(&pid[i], NULL, socket_log_thread, &listdata[i]);
if (ret != 0) {
fprintf(stderr, "\n%s %d: Failed to create pthread\n", __FUNCTION__, __LINE__);
}
} else if (0 == memcmp(listdata[i].name, "/dev/ttyS0", 8)) {
ret = pthread_create(&pid[i], NULL, common_log_thread, &listdata[i]);
if (ret != 0) {
fprintf(stderr, "\n%s %d: Failed to create pthread\n", __FUNCTION__, __LINE__);
}
}
}
for (i = 0; i < 5; ++i) {
if (NULL == listdata[i].name) {
break;
}
if (pid[i]) {
if (pthread_join(pid[i], &tret) != 0) {
printf("Join thread %d : %ld error!\n", i, pid[i]);
exit(1);
}
}
}
handler_free(listdata);
sleep(MAX_SLEEP_TIME);
return 0;
}