[][openwrt][mt7988][tops][refactor tops-tool and add logger suuport]

[Description]
Refactor tops-tool and add logger support

add menu config for tops-tool
move common code into common part

save log cmd will open log relayfs and save
its data(log) as file in the filesystem

log relayfs path :
/sys/kernel/debug/tops/log-mgmt0
/sys/kernel/debug/tops/log-offload0

log file path :
<LOG_DIR>/log-mgmt-<time>
<LOG_DIR>/log-offload-<time>

[Release-log]
N/A

Change-Id: I1c563efbb584540eeb1b78c2a438c0173c4cdbba
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7988095
diff --git a/feed/app/tops-tool/src/dump.c b/feed/app/tops-tool/src/dump.c
index e037eff..4169f5a 100644
--- a/feed/app/tops-tool/src/dump.c
+++ b/feed/app/tops-tool/src/dump.c
@@ -19,24 +19,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
+#include "common.h"
 #include "dump.h"
 
-static int time_to_str(time_t *time_sec, char *time_str, unsigned int time_str_size)
-{
-	struct tm *ptm;
-	int ret;
-
-	ptm = gmtime(time_sec);
-	if (!ptm)
-		return -1;
-
-	ret = strftime(time_str, time_str_size, "%Y%m%d%H%M%S", ptm);
-	if (!ret)
-		return -2;
-
-	return 0;
-}
-
 static int save_dump_data(char *dump_root_dir,
 			  struct dump_data_header *dd_hdr,
 			  char *dd)
@@ -54,7 +39,7 @@
 			  dump_time_str, sizeof(dump_time_str));
 	if (ret < 0) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("time_to_str(%lu) fail(%d)\n"),
+			LOG_FMT("time_to_str(%lu) fail(%d)\n"),
 			dd_hdr->info.dump_time_sec, ret);
 		return ret;
 	}
@@ -72,7 +57,7 @@
 	ret = mkdir(dump_dir, 0775);
 	if (ret && errno != EEXIST) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("mkdir(%s) fail(%s)\n"),
+			LOG_FMT("mkdir(%s) fail(%s)\n"),
 			dump_dir, strerror(errno));
 		goto free_dump_dir;
 	}
@@ -94,7 +79,7 @@
 	fd = open(dump_file, O_WRONLY | O_CREAT, 0664);
 	if (fd < 0) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("open(%s) fail(%s)\n"),
+			LOG_FMT("open(%s) fail(%s)\n"),
 			dump_file, strerror(errno));
 		ret = fd;
 		goto free_dump_file;
@@ -104,7 +89,7 @@
 	ret = lseek(fd, 0, SEEK_SET);
 	if (ret < 0) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("lseek fail(%s)\n"),
+			LOG_FMT("lseek fail(%s)\n"),
 			strerror(errno));
 		goto close_dump_file;
 	}
@@ -115,7 +100,7 @@
 	ret = lseek(fd, dd_hdr->data_offset, SEEK_CUR);
 	if (ret < 0) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("lseek fail(%s)\n"),
+			LOG_FMT("lseek fail(%s)\n"),
 			strerror(errno));
 		goto close_dump_file;
 	}
@@ -126,14 +111,14 @@
 		ret = stat(dump_file, &st);
 		if (ret < 0) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("stat(%s) fail(%s)\n"),
+				LOG_FMT("stat(%s) fail(%s)\n"),
 				dump_file, strerror(errno));
 			goto close_dump_file;
 		}
 
 		if ((size_t)st.st_size != dump_file_size) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("file(%s) size %zu != %zu\n"),
+				LOG_FMT("file(%s) size %zu != %zu\n"),
 				dump_file, st.st_size, dump_file_size);
 			ret = -EINVAL;
 			goto close_dump_file;
@@ -179,77 +164,9 @@
 	return out_len;
 }
 
-static int mkdir_p(char *path, mode_t mode)
+int tops_tool_save_dump_data(int argc, char *argv[])
 {
-	size_t path_len;
-	char *cpy_path;
-	char *cur_path;
-	char *tmp_path;
-	char *dir;
-	int ret;
-
-	path_len = strlen(path) + 1;
-	if (path_len == 0)
-		return -EINVAL;
-
-	cpy_path = malloc(path_len);
-	if (!cpy_path)
-		return -ENOMEM;
-	strncpy(cpy_path, path, path_len);
-
-	cur_path = calloc(1, path_len);
-	if (!cur_path) {
-		ret = -ENOMEM;
-		goto free_cpy_path;
-	}
-
-	tmp_path = malloc(path_len);
-	if (!tmp_path) {
-		ret = -ENOMEM;
-		goto free_cur_path;
-	}
-
-	for (dir = strtok(cpy_path, "/");
-	     dir != NULL;
-	     dir = strtok(NULL, "/")) {
-		/* keep current path */
-		strncpy(tmp_path, cur_path, path_len);
-
-		/* append directory in current path */
-		ret = snprintf(cur_path, path_len, "%s/%s", tmp_path, dir);
-		if (ret < 0) {
-			fprintf(stderr,
-				DUMP_LOG_FMT("append dir(%s) in cur_path(%s) fail(%d)\n"),
-				dir, cur_path, ret);
-			goto free_tmp_path;
-		}
-
-		ret = mkdir(cur_path, mode);
-		if (ret && errno != EEXIST) {
-			fprintf(stderr,
-				DUMP_LOG_FMT("mkdir(%s) fail(%s)\n"),
-				cur_path, strerror(errno));
-			goto free_tmp_path;
-		}
-	}
-
-	ret = 0;
-
-free_tmp_path:
-	free(tmp_path);
-
-free_cur_path:
-	free(cur_path);
-
-free_cpy_path:
-	free(cpy_path);
-
-	return ret;
-}
-
-int tops_save_dump_data(char *dump_root_dir)
-{
-	struct stat st = { 0 };
+	char *dump_root_dir = argv[2];
 	int ret = 0;
 	int fd;
 
@@ -259,7 +176,7 @@
 	/* reserve 256 bytes for saving name of dump directory and dump file */
 	if (strlen(dump_root_dir) > (PATH_MAX - 256)) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("dump_root_dir(%s) length %zu > %u\n"),
+			LOG_FMT("dump_root_dir(%s) length %zu > %u\n"),
 			dump_root_dir, strlen(dump_root_dir), PATH_MAX - 256);
 		return -EINVAL;
 	}
@@ -267,7 +184,7 @@
 	ret = mkdir_p(dump_root_dir, 0775);
 	if (ret < 0) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("mkdir_p(%s) fail(%d)\n"),
+			LOG_FMT("mkdir_p(%s) fail(%d)\n"),
 			dump_root_dir, ret);
 		return ret;
 	}
@@ -275,7 +192,7 @@
 	fd = open(DUMP_DATA_PATH, O_RDONLY);
 	if (fd < 0) {
 		fprintf(stderr,
-			DUMP_LOG_FMT("open(%s) fail(%s)\n"),
+			LOG_FMT("open(%s) fail(%s)\n"),
 			DUMP_DATA_PATH, strerror(errno));
 		return fd;
 	}
@@ -291,7 +208,7 @@
 		ret = poll(&pfd, 1, -1);
 		if (ret < 0) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("poll fail(%s)\n"),
+				LOG_FMT("poll fail(%s)\n"),
 				strerror(errno));
 			break;
 		}
@@ -299,7 +216,7 @@
 		ret = read_retry(fd, &dd_hdr, sizeof(struct dump_data_header));
 		if (ret < 0) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("read dd_hdr fail(%d)\n"), ret);
+				LOG_FMT("read dd_hdr fail(%d)\n"), ret);
 			break;
 		}
 
@@ -308,13 +225,13 @@
 
 		if (dd_hdr.data_len == 0) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("read empty data\n"));
+				LOG_FMT("read empty data\n"));
 			continue;
 		}
 
 		if (dd_hdr.data_len > sizeof(dd)) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("data length %u > %lu\n"),
+				LOG_FMT("data length %u > %lu\n"),
 				dd_hdr.data_len, sizeof(dd));
 			ret = -ENOMEM;
 			break;
@@ -323,13 +240,13 @@
 		ret = read_retry(fd, dd, dd_hdr.data_len);
 		if (ret < 0) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("read dd fail(%d)\n"), ret);
+				LOG_FMT("read dd fail(%d)\n"), ret);
 			break;
 		}
 
 		if ((uint32_t)ret != dd_hdr.data_len) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("read dd length %u != %u\n"),
+				LOG_FMT("read dd length %u != %u\n"),
 				(uint32_t)ret, dd_hdr.data_len);
 			ret = -EAGAIN;
 			break;
@@ -338,7 +255,7 @@
 		ret = save_dump_data(dump_root_dir, &dd_hdr, dd);
 		if (ret) {
 			fprintf(stderr,
-				DUMP_LOG_FMT("save_dump_data(%s) fail(%d)\n"),
+				LOG_FMT("save_dump_data(%s) fail(%d)\n"),
 				dump_root_dir, ret);
 			break;
 		}