[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/hostapp/zdump_ref/ramdump.c b/ap/hostapp/zdump_ref/ramdump.c
new file mode 100755
index 0000000..f48280b
--- /dev/null
+++ b/ap/hostapp/zdump_ref/ramdump.c
@@ -0,0 +1,645 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump.c
+* Îļþ±êʶ:     ramdump.c
+* ÄÚÈÝÕªÒª:     ramdump linuxµ¼³ö¹¤¾ß
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create                             ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include<stdlib.h>
+#include<stdio.h>
+#include<string.h>
+#include<sys/types.h>
+#include<sys/stat.h>
+#include<fcntl.h>
+#include<errno.h>
+#include<getopt.h>
+#include<stdarg.h>
+#include<termios.h>
+#include<stddef.h>
+#include<dirent.h>
+#include <unistd.h>
+#include<time.h>
+//#include<properties.h>
+//#include<cutils/properties.h>
+//#include<cutils/log.h>
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define MODEM_TRAP_PATH "/dev/ttyUSB0"
+#define MODEM_TRAP_PATH2 "/dev/ttyUSB1"
+// #define MODEM_RAMDUMP_PATH "/data/local/log/Ramdump"
+#define RAMDUMP_DEFAULT_BAUD B115200
+#define RAMDUMP_DEFAULT_DELAY 1000
+#define USB_DIR_FILE_NAME_SIZE 1024
+#define LOG_TAG "Modem_Ramdump"
+#define USB_DIR_BASE "/sys/bus/usb/devices"
+#define USB_PID 0x0197
+#define SUCCESS  0
+#define FAIL    -1
+
+//#define printf(...) ALOGE(__VA_ARGS__)
+
+/*Ramdump Ö¸ÁÒå*/
+#define DUMPFILE_LINK_REQ       (UINT32)1       //ͬ²½ÇëÇó
+#define DUMPFILE_LINK_RSP       (UINT32)2       //ͬ²½ÇëÇóÓ¦´ð£¬¸½´øramdumpÎļþÊýÄ¿
+#define DUMPFILE_FILE_REQ       (UINT32)3       //ÇëÇóÖ¸¶¨±àºÅÎļþÐÅÏ¢
+#define DUMPFILE_FILE_RSP       (UINT32)4       //Îļþ±àºÅÎļþÐÅÏ¢Ó¦´ð£¬¸½´ø´«ÊäÎļþÃû¼°´óС
+#define DUMPFILE_READ_REQ       (UINT32)5       //ÇëÇó¶Áȡָ¶¨±àºÅÎļþÄÚÈÝ
+#define DUMPFILE_READ_RSP       (UINT32)6       //ÎļþÄÚÈݶÁȡӦ´ð£¬¸½´øÎļþÄÚÈÝ
+#define DUMPFILE_END_REQ        (UINT32)7       //´«Êä½áÊø
+#define DUMPFILE_END_RSP        (UINT32)8       //´«Êä½áÊøÓ¦´ð
+#define DUMPFILE_CMD_FAIL       (UINT32)9       //Ö¸Áî´íÈ¥
+#define DUMPFILE_NO_FAIL        (UINT32)10      //Îļþ±àºÅ´íÎó
+#define DUMPFILE_LENGTH_FAIL    (UINT32)11      //ÎļþλÖôóС´íÎó
+#define CMD_BUFFER_LEN          (UINT32)16      //Ö¸Áî²Á·À¶¾
+#define FILENAME_LEN            (UINT32)32      //ÎļþÃû³¤¶È
+#define FILENAME_MAX_LEN        (UINT32)256      //ÎļþÃû×î´ó³¤¶È
+#define DATA_BLOCK_SIZE         (0x40000) // Êý¾Ý»º³å´óС
+//#define DATA_BLOCK_SIZE         (0x00800) // Êý¾Ý»º³å´óС,2k
+
+#define MIN(a, b) ((a)< (b) ? (a): (b))
+#define DEFAULT_RAMDUMP_FOLD   "/home/dujing/code/v3/ramdump/ramdump_file/"   //"/mnt/sdcard/ramdump"
+
+//#define ZTE_LOG_PATH      "/home/dujing/code/v3/ramdump/zte_file"
+#define CPLOG_PATH  "persist.service.ztelog.path"
+//#define CPLOG_TIMESTAMP_DIR  "persist.service.ztelog.timedir"
+#define __FUNCTION__ "ramdumpfuc"
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef struct {
+	char file_name[32];
+	unsigned int file_size;
+} file_info_t;
+typedef unsigned int UINT32;
+
+/*******************************************************************************
+*                                º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+extern int dev_get_usbsys_val(const char *sys_filename, int base);
+extern int dev_strStartsWith(const char *line, const char *src);
+extern int dev_get_ttyport_by_syspath(char *syspath);
+extern int dev_get_device(void);
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+static int g_modem_fd = -1;
+static int g_reboot_flag = 0;
+static int g_moniter_time = 0;
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+int PROPERTY_VALUE_MAX = 256;
+extern int g_usb_dev;
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+static void mdp_print_array(const char* prefix, const char *buf, int length)
+{
+#if 0
+	int i = 0;
+	int len = MIN(length,16 );
+	printf("%s ", prefix );
+	for (i = 0; i< len; i++) {
+		printf("%02X ", buf[i]);
+	}
+	if (length > len)
+		printf("...");
+	printf("\n");
+#endif
+}
+
+static int tty_write(int fd, const char *buf, int size)
+{
+	int ret = 0;
+	int repeat_count = 0;
+WRITE:
+	ret = write(fd, buf, size);
+	if (0 == ret) {
+		printf("%s error: %s\n", __FUNCTION__, strerror(errno));
+		repeat_count += 1;
+		if (3 > repeat_count) {
+			sleep(1);
+		    goto WRITE;
+		}
+	}
+	if (ret != size) {
+		printf("%s failed, size=%d, ret=%d\n", __FUNCTION__, size, ret);
+		return -1;
+	}
+	return 0;
+}
+
+static int tty_read(int fd, char *buf, int size, unsigned int delay_ms)
+{
+	int ret = -1;
+	int read_count = 0;
+	fd_set fds;
+	int repeat_count = 0;
+	struct timeval tv;
+	if (buf == NULL)
+		return -1;
+	tv.tv_sec = delay_ms / 1000;
+	tv.tv_usec = (delay_ms % 1000) * 1000;
+	FD_ZERO(&fds);//Çå¿Õfd_set¼¯ºÏ
+	FD_SET(fd, &fds);//½«¸ø¶¨µÄÃèÊö·ûfd¼ÓÈ뼯ºÏµ±ÖÐ
+READ:
+	ret = select(fd + 1, &fds, NULL, NULL, &tv);
+	if (ret > 0) {
+		read_count = read(fd, buf, size);
+		if (read_count <= 0) {
+			printf("%s read failed for ret=%d\n", __FUNCTION__, read_count);
+			return -1;
+		}
+		return read_count;
+	} else if (ret == 0) {
+		printf("%s select time out %dms\n", __FUNCTION__, delay_ms);
+		printf("%s timeout error: %s\n", __FUNCTION__, strerror(errno));
+		if (3 > repeat_count) {
+			repeat_count += 1;
+			sleep(1);
+			goto READ;
+		}
+	} else {
+		printf("%s select failed %s\n", __FUNCTION__, strerror(errno));
+	}
+	return -1;
+}
+
+static int mdp_send(const char *buf, int size)
+{
+	mdp_print_array(__FUNCTION__, buf, size);
+	return tty_write(g_modem_fd, buf, size);
+}
+
+static int mdp_receive(char *buf, int size)
+{
+	int count = 0;
+	int ret = 0;
+	int length = size;
+	char *pbuffer = buf;
+	while (length > 0) {
+		count = tty_read(g_modem_fd, pbuffer, size, RAMDUMP_DEFAULT_DELAY);
+		if (count < 0) {
+			return -1;
+		}
+		pbuffer += count;
+		length -= count;
+	}
+	mdp_print_array(__FUNCTION__, buf, size);
+	return size;
+}
+
+static int mdp_send_command(unsigned int cmd, unsigned int argc, ...)
+{
+	char buffer[CMD_BUFFER_LEN] = {0};
+	unsigned int i = 0;
+	unsigned int arg = 0;
+	UINT32 *pbuffer = (UINT32*)buffer;
+	*pbuffer = cmd;
+	va_list ap;
+	va_start(ap, argc);
+	for (i=0; i<argc; i++) {
+		arg = va_arg(ap, unsigned int);
+		*(++pbuffer) = arg;
+	}
+	va_end(ap);
+	return mdp_send(buffer, CMD_BUFFER_LEN);
+}
+
+static int mdp_receive_ack(unsigned int ack)
+{
+	int ret = 0;
+	unsigned int  resp;
+	char buffer[64] = {0};
+	ret = mdp_receive((char *)&resp, sizeof(unsigned int));
+//    ret = mdp_receive(buffer, 64);
+	if (ret > 0) {
+//        resp = *(unsigned int*)buffer;
+		if (ack == resp)
+			return 0;
+	}
+	return -1;
+}
+
+static int init_devices(char* dev_path, speed_t speed)
+{
+	int fd = -1;
+	struct termios tios;
+	printf("%s\n", __FUNCTION__);
+	fd = open(dev_path, O_RDWR);
+	if (fd < 0) {
+		printf("Can't open %s(%s)\n", dev_path, strerror(errno));
+		return -1;
+	}
+	if (tcgetattr(fd, &tios) < 0) {
+		printf(" tcgetattr failed(%s)\n", strerror(errno));
+		return -1;
+	}
+	tios.c_cflag = CS8 | CREAD | CRTSCTS | CLOCAL;
+	tios.c_iflag = IGNPAR;
+	tios.c_oflag = 0;
+	tios.c_lflag = 0;
+	tios.c_cc[VTIME] = 0;
+	tios.c_cc[VMIN] = 1;
+	cfsetispeed(&tios, RAMDUMP_DEFAULT_BAUD);
+	cfsetospeed(&tios, RAMDUMP_DEFAULT_BAUD);
+	tcflush(fd, TCIFLUSH);
+	if (tcsetattr(fd,TCSANOW, &tios) < 0) {
+		printf(" tcgetattr failed(%s)\n", strerror(errno));
+		return -1;
+	}
+	return fd;
+}
+
+static int create_fold(char *fold)
+{
+	char buffer[256]= {0};
+	snprintf(buffer, 256, "mkdir -p %s\n", fold);
+	int ret = system(buffer);
+	if (ret < 0)
+		return -1;
+	return 0;
+}
+
+static int create_file(char* fold, char * path)
+{
+	int fd = -1;
+	DIR *pdir = NULL;
+	char file_name[FILENAME_MAX_LEN] = {0};
+	int ret = 0;
+	if ((fold==NULL) || (*fold=='\0'))
+		fold = DEFAULT_RAMDUMP_FOLD;
+	if ( (path==NULL) || (*path=='\0')) {
+		printf("%s path=NULL\n", __FUNCTION__);
+		return -1;
+	}
+	if ((pdir = opendir(fold)) == NULL) {
+		ret = create_fold(fold);
+		if (ret < 0) {
+			printf("%s create fold %s failed (%s)", __FUNCTION__, fold, strerror(errno));
+			return -1;
+		}
+	}
+	if (pdir != NULL)
+		closedir(pdir);
+	snprintf(file_name, FILENAME_MAX_LEN, "%s/%s", fold, path);
+	unlink(file_name);
+	printf("%s %s\n", __FUNCTION__, file_name);
+	fd = open(file_name, O_CREAT| O_RDWR, 0777);
+	if (fd < 0) {
+		printf("failed to create %s (%s)\n", path, strerror(errno));
+	}
+	return fd;
+}
+
+static int write_to_file(int fd, char*buffer, int size)
+{
+	int ret = 0;
+	if ((fd < 0) || (buffer==NULL) || (size<=0))
+		return -1;
+	ret = write(fd, buffer, size);
+	if (ret < size) {
+		printf("write to file failed, ret=%d, size=%d\n", ret, size);
+		return -1;
+	}
+	return 0;
+
+}
+
+static int dump_file(int index, char *fold)
+{
+	int ret = 0;
+	char path[256] = {0};
+	char cmd_buffer[CMD_BUFFER_LEN] = {0};
+	file_info_t file_info = {{0}, 0};
+	char data_buffer[DATA_BLOCK_SIZE] = {0};
+	int fd = 0;
+	int file_size, read_count, file_offset;
+
+	if ((ret = mdp_send_command(DUMPFILE_FILE_REQ, 1, index)) < 0) {
+		printf("%s failed to send command DUMPFILE_FILE_REQ\n", __FUNCTION__);
+		return -1;
+	}
+	if ((ret = mdp_receive_ack(DUMPFILE_FILE_RSP)) < 0) {
+		printf("%s failed to receive DUMPFILE_FILE_RSP\n", __FUNCTION__);
+		return -1;
+	}
+	if ((ret = mdp_receive((char*)&file_info, sizeof(file_info))) < 0) {
+		printf("%s failed to get fileinfo\n", __FUNCTION__);
+		return -1;
+	}
+	if ((fd = create_file(fold, file_info.file_name)) < 0) {
+		printf("failed to create file %s\n", file_info.file_name);
+		return -1;
+	}
+	printf("filename=%s\t size=%d\n", file_info.file_name, file_info.file_size);
+	file_size = file_info.file_size;
+	file_offset = read_count = 0;
+	while (file_size > 0) {
+		read_count = MIN(file_size, DATA_BLOCK_SIZE);
+		if (mdp_send_command(DUMPFILE_READ_REQ, 3, index, file_offset, read_count) < 0) {
+			printf("%s failed to send DUMPFILE_READ_REQ\n", __FUNCTION__);
+			ret = -1;
+			goto exit;
+		}
+		if (mdp_receive_ack(DUMPFILE_READ_RSP) < 0) {
+			printf("%s failed to receive ack DUMPFILE_READ_RSP\n", __FUNCTION__);
+			ret = -1;
+			goto exit;
+		}
+		if (mdp_receive(data_buffer, read_count) < 0) {
+			printf("failed to read file data\n");
+			ret = -1;
+			goto exit;
+		}
+		if (write_to_file(fd, data_buffer, read_count)< 0) {
+			printf("failed to write file data\n");
+			ret = -1;
+			goto exit;
+		}
+		file_offset += read_count;
+		file_size -= read_count;
+	}
+	ret = 0;
+exit:
+	close(fd);
+	return ret;;
+}
+
+static int do_modem_ramdump( char* tty, char*path)
+{
+	int ret = -1;
+	int file_number = 0;
+	int i = 0;
+
+	g_modem_fd = init_devices(tty, RAMDUMP_DEFAULT_BAUD);
+	if (g_modem_fd < 0) {
+		printf("failed to open %s\n", tty);
+		return -1;
+	}
+	if ((ret = mdp_send_command(DUMPFILE_LINK_REQ, 0)) < 0) {
+		printf("Send DUMPFILE_LINK_REQ failed\n");
+		ret = -1;
+		goto exit;
+	}
+	if ((ret = mdp_receive_ack(DUMPFILE_LINK_RSP)) < 0) {
+		printf("failed to receive DUMPFILE_LINK_RSP\n");
+		ret =  -1;
+		goto exit;
+	}
+	ret = mdp_receive((char*)&file_number, sizeof(unsigned int));
+	if (ret < 0) {
+		printf("failed to get filenumber\n");
+		ret = -1;
+		goto exit;
+	}
+	printf("file_number = %d\n", file_number);
+	for (i = 0; i < file_number; i++) {
+		printf("dump file index=%d \n", i);
+		ret = dump_file(i, path);
+		if (ret < 0) {
+			printf("dump file index=%d failed\n", i);
+			ret = -1;
+			goto exit;
+		}
+		printf("dump file index=%d success\n", i);
+	}
+	if (g_reboot_flag == 1){
+		printf("ramdump except reboot enabled\n");
+		if ((ret = mdp_send_command(DUMPFILE_END_REQ, 0)) < 0) {
+			printf("failed to send DUMPFILE_END_REQ\n");
+			ret = -1;
+			goto exit;
+		}
+		mdp_receive_ack(DUMPFILE_END_RSP);
+	}
+	ret = 0;
+exit:
+	if (g_modem_fd > 0)
+		close(g_modem_fd);
+	return ret;
+}
+
+void broadcast_ramdump_result(int success)
+{
+	char command[256];
+	snprintf(command, 256, "am broadcast -a zte.com.cn.intent_modemramdump_finished --ez extra_success %s", (success == 0 ? "true" : "false"));//Android·¢Ë͹㲥ָÁî
+	printf("%s %s\n", __FUNCTION__, command);
+	system(command);
+}
+
+static void  compress_and_rm_fold(char *pfold, char *time_str)
+{
+	char buffer[512] = {0};
+	int ret = 0;
+
+	//sunjy add 
+	//delete duplicate file which preffix is g_current_file_index;
+	snprintf(buffer, 512, "cd %s; busybox rm -rvf %s\n", pfold, "*.tgz");
+	printf("%s %s\n", __FUNCTION__, buffer);
+	system(buffer);
+
+	char preffix[256] = {0};
+	char str[256] = {0};
+	strcat(preffix, time_str);
+	strcpy(time_str, preffix);
+
+	printf("%s %s %s\n", __FUNCTION__, pfold, time_str);
+	snprintf(buffer, 512, "cd %s; busybox tar -zcf %s.tgz %s/*\n", pfold, time_str, time_str);
+	printf("%s %s\n", __FUNCTION__, buffer);
+	ret = system(buffer);
+	if(ret != 0){
+		printf("compress failed, delete the unfinished compressed file\n");
+		snprintf(buffer, 512, "cd %s; busybox rm -rf  %s.tgz \n", pfold, time_str);
+	}else {
+		printf("compress finished, delete the source fold\n");
+		snprintf(buffer, 512, "cd %s; busybox rm -rf %s\n", pfold, time_str);
+	// property_set("persist.service.ramdump.index", str); (ºóÐø´ò¿ª£©
+
+	// property_get("persist.service.ramdump.index", str, "6");  OPEN LATER
+	//printf("%s %s %s\n", __FUNCTION__, "persist.service.ramdump.index=", str);
+	}
+	printf("%s %s\n", __FUNCTION__, buffer);
+	system(buffer);
+}
+
+static int get_time_str(char *buf, size_t size)
+{
+	struct tm cur_tm;
+	time_t now = time(NULL);
+	if (NULL==buf || size<=0)
+		return -1;
+	localtime_r(&now, &cur_tm);
+	strftime(buf, size, "%Y_%m%d_%H%M%S", &cur_tm);
+	printf("%s %s\n", __FUNCTION__, buf);
+	return 0;
+}
+
+static int get_ramdump_fold_name(char *ramdump_path, size_t size, char *prefix, char *time_buffer)
+{
+	if (ramdump_path == NULL || size <= 0 || time_buffer == NULL)
+		return -1;
+	//sunjy add
+	//modify path,like "sdcard0/GoTaLog/Ramdump/index.yyyymmdd_hhmmss"
+	//char logTime[30] = {0};
+	//property_get(CPLOG_PATH, ramdump_path, ZTE_LOG_PATH);
+
+	strcat(ramdump_path, prefix);
+	strcat(ramdump_path, "/");
+	strcat(ramdump_path, time_buffer);
+
+	//snprintf(ramdump_path, size, "%s/%s", prefix, time_buffer);
+	printf("%s %s\n", __FUNCTION__, ramdump_path);
+	return 0;
+}
+
+static int ramdump_export(char *dump_path)
+{
+	int ret = -1;
+	int i;
+	char dev_tty[256] = {0};
+
+	for (i = 0; i <= 255; i++) {
+		snprintf(dev_tty, 256, "/dev/ttyUSB%d", i);
+		if (access(dev_tty, F_OK) < 0){
+			continue;
+		}
+		printf("try to get the ramdump data from %s\n", dev_tty);
+		ret = do_modem_ramdump(dev_tty, dump_path);
+		if (ret >= 0) {
+			printf("get the ramdump data from %s success\n", dev_tty);
+			//compress_and_rm_fold(DEFAULT_RAMDUMP_FOLD, time_str);
+			break;
+		} else if (ret == -1) {
+			printf("try to repeat do_modem_ramdump begin\n");
+			ret = do_modem_ramdump(dev_tty, dump_path);
+			if (ret >= 0) {
+				printf("get the ramdump data from %s success\n", dev_tty);
+				//compress_and_rm_fold(DEFAULT_RAMDUMP_FOLD, time_str);
+			break;
+			}else{
+				printf("get the ramdump data from %s failed\n", dev_tty);
+			}
+		}
+	}
+	return ret;
+}
+
+static int ramdump_mainloop(int moniter_time, char *dump_path)
+{
+	int ret = -1;
+	char dev_tty[256] = {0};
+
+	while(1)
+	{
+		if ((ret == -1) && (moniter_time >= 0))
+			sleep(moniter_time);
+		else
+			break;
+		ret = dev_get_device();
+	}
+	if (g_usb_dev < 0)
+		return -1;
+
+	snprintf(dev_tty, 256, "/dev/ttyUSB%d", g_usb_dev);
+	ret = do_modem_ramdump(dev_tty, dump_path);
+	if (ret >= 0) {
+		printf("get the ramdump data from %s success\n", dev_tty);
+	} else if (ret == -1) {
+		printf("try to repeat do_modem_ramdump begin\n");
+		ret = do_modem_ramdump(dev_tty, dump_path);
+		if (ret >= 0) {
+			printf("get the ramdump data from %s success\n", dev_tty);
+		}else{
+			printf("get the ramdump data from %s failed\n", dev_tty);
+		}
+	}
+	return ret;
+}
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+int main(int argc, char* argv[])
+{
+	int ret = -1;
+	int opt = 0;
+	int dump_path_flag = 0;
+	char dump_path[256] = {0};
+	char time_str[64] = {0};
+
+	// property_set("ctl.stop", "ztemodemlog");
+	//sleep(1);
+	if(get_time_str(time_str, 64) < 0){
+		printf("Can't get the time str\n");
+		return -1;
+	}
+
+	if (argc == 1){
+		get_ramdump_fold_name(dump_path, 256, DEFAULT_RAMDUMP_FOLD, time_str);
+		dump_path_flag = 1;
+		ret = ramdump_export(dump_path);
+		return ret;
+	}
+	ret = -1;
+	while((opt = getopt(argc, argv, ":p:rt:m")) != -1){
+		switch(opt){
+			case 'p':
+			{
+				ret = get_ramdump_fold_name(dump_path, 256, optarg, time_str);
+				dump_path_flag = 1;
+				if (ret < 0) {
+					printf("Can't get the ramdump fold path\n");
+					return -1;
+				}
+				break;
+			}
+			case 'r':
+			{
+				g_reboot_flag = 1;
+				break;
+			}
+			case 't':
+			{
+				g_moniter_time = atoi(optarg);
+			}
+			case 'm':
+			{
+				printf("begin to monitor ramdump!\n");
+				if (dump_path_flag == 0){
+					get_ramdump_fold_name(dump_path, 256, DEFAULT_RAMDUMP_FOLD, time_str);
+					dump_path_flag = 1;
+				}
+				ret = ramdump_mainloop(g_moniter_time, dump_path);
+				return ret;
+			}
+			case '?':
+				printf("invailed arguments!\n");
+				return -1;
+		}
+	}
+	if (dump_path_flag == 0){
+		get_ramdump_fold_name(dump_path, 256, DEFAULT_RAMDUMP_FOLD, time_str);
+		dump_path_flag = 1;
+	}
+	ret = ramdump_export(dump_path);
+	return ret;
+}
+