zte's code,first commit

Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/ap/app/zte_log_agent/log_agent_sdcard.c b/ap/app/zte_log_agent/log_agent_sdcard.c
new file mode 100755
index 0000000..16245e0
--- /dev/null
+++ b/ap/app/zte_log_agent/log_agent_sdcard.c
@@ -0,0 +1,653 @@
+/**

+ * 

+ * @file      log_agent_sdcard.c

+ * @brief     

+ *            This file is part of ZCAT.

+ *            zcatÓ¦Óòãlog_agent´¦Àíͨ¹ýsd¿¨µÄÊý¾ÝÁ÷

+ *            

+ * @details   

+ * @author    Tools Team.

+ * @email     

+ * @copyright Copyright (C) 2013 Sanechips Technology Co., Ltd.

+ * @warning   

+ * @date      2019/02/02

+ * @version   1.2

+ * @pre       

+ * @post      

+ *            

+ * @par       

+ * Change History :

+ * ---------------------------------------------------------------------------

+ * date        version  author         description

+ * ---------------------------------------------------------------------------

+ * 2017/07/17  1.0      hou.bing       Create file

+ * 2019/01/24  1.1      jiang.fenglin  1.Ìí¼Óusblog¶ÁÐ´Ëø

+ *                                     2.Ìí¼ÓÏß³ÌÃû³Æ

+ * 2019/02/02  1.2      jiang.fenglin  ÐÞ¸Ä×¢ÊÍ·½Ê½Îªdoxygen

+ * 2019/07/08  1.3      jiang.fenglin  Ôö¼ÓAPFS/CPFSģʽ

+ * ---------------------------------------------------------------------------

+ * 

+ * 

+ */

+

+#include <string.h>

+#include <pthread.h>

+#include <sys/prctl.h>

+#include <sys/statfs.h>

+#include "log_agent.h"

+#include "cfg_api.h"

+

+#if 0

+#define DEFAULT_LOG_ROOT "/sdcard"

+#define DEFAULT_LOG_ROOT_PARENT "/ZTELog"

+#define CONFIG_STORAGE_FILE_PATH "/data/misc/rild/log_storage.cfg"

+#endif

+

+#define USB_DEV_SDCARD_PATH      "/dev/mmcblk0p1"

+#define USB_DEV_SDCARD_PATH_BACK "/dev/mmcblk0"

+

+#define ZCAT_SDCARD_MOUNT_PATH   "/tmp/udisk"

+

+#define ZCAT_SDCARD_RULE_PATH    "/tmp/udisk/log.rule"

+#define ZCAT_SDCARD_LOG_PATH     "/tmp/udisk/zcat_log"

+

+#define ZCAT_FS_RULE_PATH        "/var/zcat/log.rule"

+#define ZCAT_FS_PATH             "/var/zcat"

+

+

+static T_LOG_SDCARD_PARA g_log_sdcard_para = { {0} };

+pthread_t rule_heartbeat_thread = 0;

+

+extern int deal_with_encoded_data(unsigned char *buffer,int buf_len);

+

+typedef struct

+{

+    char head1[16];

+    int heartbeat_pos;

+    int heartbeat_len;

+    int rule_pos;

+    int rule_len;

+    int ap_rule_pos;

+    int ap_rule_len;

+	int log_file_size;

+	int log_file_cnt;

+}rule_struct;

+

+char g_heartbeat_buff[35] = {

+    0x01,0xaa,0xaa,0xaa,0x01,0x55,0x73,0x01,

+    0x14,0x00,0x00,0x00,0x06,0x01,0xbb,0xbb,

+    0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

+    0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,

+    0xe6,0x7a,0x7e

+};

+

+/* É豸¾ä±ú */

+extern BOOL bSDSet;

+extern int cplog_fd;

+

+

+/**

+ * @brief ÅжÏĿ¼ÊÇ·ñ´æÔÚ£¬Èç¹û²»´æÔÚÔò´´½¨Ò»¸öеÄĿ¼

+ * @param[in] dir_path Ŀ¼·¾¶

+ * @return 0 on success, -1 error.

+ * @note

+ * @see 

+ */

+int test_dir_exist(char* dir_path)

+{

+    DIR *p_dir = NULL;

+    

+    if ((p_dir = opendir(dir_path)) == NULL)

+    {

+        printf("[zcat] opendir failed, mkdir %s\n", dir_path);

+        if (mkdir(dir_path, 0777) != 0)

+        {

+            printf("[zcat] mkdir %s error, error info: %s\n", dir_path, strerror(errno));

+            return -1;

+        }

+    }

+    else

+    {

+        closedir(p_dir);

+        p_dir = NULL;

+    }

+    return 0;

+}

+

+/**

+ * @brief ³õʼ»¯sd¿¨´ælogµÄÅäÖòÎÊý

+ * @return void

+ * @note

+ * @see 

+ */

+static void init_sdcard_para()

+{

+    g_log_sdcard_para.max_file_size = 1024 * 1024 * 100;

+    //g_log_sdcard_para.max_file_num = 8;

+    g_log_sdcard_para.log_overwrite = 1;

+    g_log_sdcard_para.compress_log_files = 1;

+    g_log_sdcard_para.file_counts = 0;

+    g_log_sdcard_para.output_fd = -1;

+	g_log_sdcard_para.free_space_limit = 1024 * 1024 * 1;

+

+	memset(g_log_sdcard_para.rule_path, 0, sizeof(g_log_sdcard_para.rule_path));

+	strcpy(g_log_sdcard_para.rule_path, ZCAT_SDCARD_RULE_PATH);

+}

+

+/**

+ * @brief ³õʼ»¯sd¿¨normalģʽ²ÎÊý

+ * @return void

+ * @note

+ * @see 

+ */

+static int init_sdcard_flash_mode()

+{

+	memset(g_log_sdcard_para.log_dir, 0, sizeof(g_log_sdcard_para.log_dir));

+    strcpy(g_log_sdcard_para.log_dir, ZCAT_SDCARD_LOG_PATH);

+

+    if(test_dir_exist(g_log_sdcard_para.log_dir) < 0)//´´½¨ÈÕÖ¾Îļþ¼Ð

+    {

+        printf("[zcat] test %s dir exist failed. \n", g_log_sdcard_para.log_dir);

+        return -1;

+    }

+    return 0;

+}

+

+/**

+ * @brief ³õʼ»¯sd¿¨uÅÌģʽ²ÎÊý

+ * @return void

+ * @note

+ * @see 

+ */

+static int init_sdcard_u_mode()

+{

+	memset(g_log_sdcard_para.log_dir, 0, sizeof(g_log_sdcard_para.log_dir));

+    strcpy(g_log_sdcard_para.log_dir, ZCAT_SDCARD_LOG_PATH);

+    if(test_dir_exist(ZCAT_SDCARD_LOG_PATH) < 0)//ÅжÏËùÓÐÈÕ־Ŀ¼ÊÇ·ñ´æÔÚ

+    {

+        printf("[zcat] test_dir_exist failed:%s. \n", ZCAT_SDCARD_LOG_PATH);

+        return -1;

+    }

+    /*if(test_dir_exist(MODEM_LOG_PATH) < 0)//ÅжÏcpÈÕ־Ŀ¼ÊÇ·ñ´æÔÚ

+    {

+        printf("test_dir_exist failed:%s. \n", MODEM_LOG_PATH);

+        return -1;

+    }*/

+    return 0;

+}

+

+int zCat_MountSd()

+{    

+    char cmd[100] = { 0 };

+    

+    if(test_dir_exist(ZCAT_SDCARD_MOUNT_PATH) < 0) // ´´½¨¹ÒÔØµÄÁÙʱÎļþ¼Ð

+    {

+        printf("[zcat] create %s fail.\n", ZCAT_SDCARD_MOUNT_PATH);

+        return -1;

+    }

+

+    printf("[zcat] init sd output dir successs.\n");

+

+    memset(cmd, 0, sizeof(cmd));

+    sprintf(cmd, "mount -t vfat %s %s", USB_DEV_SDCARD_PATH, ZCAT_SDCARD_MOUNT_PATH); 

+    if(0 != zxic_system(cmd))

+    {

+        printf("[zcat] cmd %s fail!\n", cmd);

+

+        memset(cmd, 0, sizeof(cmd));

+        sprintf(cmd, "mount -t vfat %s %s", USB_DEV_SDCARD_PATH_BACK, ZCAT_SDCARD_MOUNT_PATH); 

+        if(0 != system(cmd))

+        {

+            printf("[zcat] cmd %s fail, mount error!\n", cmd);

+            return -1;

+        }

+    }

+    

+    return 0;

+}

+

+/**

+ * @brief ɾ³ýĿ¼ÏÂÔçÆÚ´´½¨µÄÎļþ\n

+ *        ¸ù¾ÝÎļþÃûÅжϴ´½¨Ê±¼ä£¬É¾³ý×îÏÈ´´½¨µÄÄǸöÎļþ

+ * @param[in] dir_path ÎÄĿ¼·¾¶

+ * @return void

+ * @note

+ * @see 

+ */

+static void delete_oldest_file(char* dir_path)

+{

+    DIR *p_dir = NULL;

+    struct dirent *p_entry = NULL;

+    char oldest_file[64] = "99999999999999";    //ÈÕÆÚµÄ×î´óÖµ

+    char file_name[MAX_STRING_LENGTH] = {0};

+    p_dir = opendir(dir_path);

+

+    if(p_dir)

+    {

+	    while ((p_entry = readdir(p_dir)) != NULL)

+	    {

+	        if (strncmp(p_entry->d_name, ".", 1) == 0)

+	            continue;

+

+	        if (strcmp(p_entry->d_name, oldest_file) < 0)

+	        {

+	            strncpy(oldest_file, p_entry->d_name, 64 - 1);

+	        }

+	    }

+

+	    snprintf(file_name, MAX_STRING_LENGTH, "%s/%s", dir_path, oldest_file);

+	    if(remove(file_name) != 0)

+	    {

+	        printf("[zcat] remove %s fail!errno=%d(%s)\n",file_name,errno,strerror(errno));

+	    }

+	    closedir(p_dir);

+    }

+}

+

+

+/**

+ * @brief ÔÚdir_pathĿ¼Ï´ò¿ªlogÊä³öÎļþ²¢·µ»ØÎļþ¾ä±ú,\n

+ *        ÒÔµ±Ç°Ê±¼äΪÎļþÃû£¬´´½¨logÊä³öÎļþ¡£logÎļþ×î´óÊýÁ¿ÓÉLOG_FILE_MAX_NO¾ö¶¨£¬

+ *        Èôµ±Ç°ÎļþÊýÒÑ´ïÉÏÏÞ£¬É¾³ý×îÏÈ´´½¨µÄÎļþ,ÔÙÒÔµ±Ç°Ê±¼äΪÎļþÃû´´½¨Îļþ

+ * @param[in] log_sdcard_para ÈÕÖ¾´æT¿¨²ÎÊý

+ * @return ´ò¿ªµÄlogÎļþÃèÊö·û

+ * @note

+ * @see 

+ */

+static int open_log_file(T_LOG_SDCARD_PARA* log_sdcard_para)

+{

+    int fd = -1;

+    char file_name[MAX_STRING_LENGTH] = {0};

+    struct tm *cur_time;

+    time_t now;

+

+    now = time(NULL);

+    cur_time = localtime(&now);

+

+	if(cur_time != NULL)

+		snprintf(file_name, MAX_STRING_LENGTH, "%s/%d_%02d%02d_%02d%02d%02d%s", log_sdcard_para->log_dir, cur_time->tm_year + 1900,

+             cur_time->tm_mon + 1, cur_time->tm_mday, cur_time->tm_hour, cur_time->tm_min,

+             cur_time->tm_sec, ".log");

+

+    if (log_sdcard_para->log_overwrite)

+    {

+        log_sdcard_para->file_counts++;

+

+		struct statfs diskInfo;

+		statfs(g_log_sdcard_para.log_dir, &diskInfo);

+

+		if (diskInfo.f_bfree * diskInfo.f_bsize < log_sdcard_para->free_space_limit)

+        //if (log_sdcard_para->file_counts > log_sdcard_para->max_file_num)

+        {

+            delete_oldest_file(log_sdcard_para->log_dir);

+            log_sdcard_para->file_counts--;

+        }

+    }

+

+    fd = open(file_name, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IWGRP | S_IRGRP | S_IWOTH | S_IROTH);

+

+    if (fd >= 0)

+    {

+        fchmod(fd, S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP | S_IROTH |S_IWOTH);

+    }

+    strncpy(log_sdcard_para->log_name, file_name, MAX_STRING_LENGTH-1);

+

+    return fd;

+}

+

+/**

+ * @brief ³õʼ»¯logµÄĿ¼

+ * @param[in] n/a

+ * @return 0 on success, errno otherwise

+ * @note

+ * @see 

+ */

+int init_fs_log_dir()

+{

+	struct statfs diskInfo;

+

+	(void)(diskInfo);

+	

+    g_log_sdcard_para.max_file_size = 1024 * 1024 * 10;

+    //g_log_sdcard_para.max_file_num = 5;

+    g_log_sdcard_para.log_overwrite = 1;

+    g_log_sdcard_para.compress_log_files = 1;

+    g_log_sdcard_para.file_counts = 0;

+    g_log_sdcard_para.output_fd = -1;

+	g_log_sdcard_para.free_space_limit = 1024 * 1024 * 1;

+

+	memset(g_log_sdcard_para.rule_path, 0, sizeof(g_log_sdcard_para.rule_path));

+	strcpy(g_log_sdcard_para.rule_path, ZCAT_FS_RULE_PATH);

+	

+	memset(g_log_sdcard_para.log_dir, 0, sizeof(g_log_sdcard_para.log_dir));

+    strcpy(g_log_sdcard_para.log_dir, ZCAT_FS_PATH);

+

+    if(test_dir_exist(g_log_sdcard_para.log_dir) < 0)//´´½¨ÈÕÖ¾Îļþ¼Ð

+    {

+        printf("[zcat] test %s dir exist failed. \n", g_log_sdcard_para.log_dir);

+        return -1;

+    }

+

+    g_log_sdcard_para.output_fd = open_log_file(&g_log_sdcard_para);//´ò¿ªÈÕÖ¾Îļþ

+    if (g_log_sdcard_para.output_fd == -1)

+    {

+        printf("[zcat] failed to open log file!\n");

+        return -1;

+    }

+    return 0;

+}

+

+/**

+ * @brief ³õʼ»¯sd¿¨´ælogµÄĿ¼

+ * @param[in] mode normalģʽ/uÅÌģʽ

+ * @return 0 on success, errno otherwise

+ * @note

+ * @see 

+ */

+int init_sdcard_log_dir(E_FLASH_MODE mode)

+{   

+    init_sdcard_para();

+    

+    if(mode == FLASH_MODE_U)

+    {       

+        if(init_sdcard_u_mode() < 0)

+        {

+            printf("[zcat] init_sdcard_u_mode failed!\n");

+            return -1;

+        }

+    }

+    else

+    {

+        if(init_sdcard_flash_mode() < 0)

+        {

+            printf("[zcat] init_sdcard_flash_mode failed!\n");

+            return -1;

+        }

+    }

+

+    g_log_sdcard_para.output_fd = open_log_file(&g_log_sdcard_para);//´ò¿ªÈÕÖ¾Îļþ

+    if (g_log_sdcard_para.output_fd == -1)

+    {

+        printf("[zcat] failed to open log file!\n");

+        return -1;

+    }

+    return 0;

+}

+

+/**

+ * @brief дlogµ½SD¿¨.\n

+ * @param[in] fd ÉÏÒ»´ÎдÈësd¿¨ÖеÄzlfÎļþÃèÊö·û

+ * @param[in] buf ´ýдÈëµÄÊý¾ÝÖ¸Õë

+ * @param[in] len ´ýдÈëµÄÊý¾ÝÖ¸³¤¶È

+ * @param[in] log_sdcard_para sd¿¨²ÎÊý

+ * @return ʵ¼ÊдÈëµÄ³¤¶È

+ * @note

+ * @see 

+ */

+static int output_log_to_sdcard(int fd, unsigned char *buf, int len, T_LOG_SDCARD_PARA* log_sdcard_para)

+{

+    int output_fd = fd;

+    int write_len = 0;

+

+    //static int file_size = 0;

+    log_sdcard_para->file_size += len;

+

+    // Èç¹ûÎļþ´óС´ïµ½×î´óÎļþ³ß´ç£¬Ôòн¨Ò»¸öÎļþ

+    if (log_sdcard_para->file_size > log_sdcard_para->max_file_size)

+    {

+        close(fd);

+

+        if (log_sdcard_para->compress_log_files)

+        {

+            //compress_log_files(g_log_dir);

+        }

+

+        output_fd = open_log_file(log_sdcard_para);

+        if (output_fd == -1)

+        {

+            return -1;

+        }

+        log_sdcard_para->output_fd = output_fd;

+        log_sdcard_para->file_size = len;

+    }

+

+    write_len = write(output_fd, buf, len);

+    if(write_len != len) // Èç¹ûT¿¨Ð´Âú£¬Ôòɾ³ý֮ǰµÄlogÎļþ

+    {

+        delete_oldest_file(log_sdcard_para->log_dir);

+        log_sdcard_para->file_counts--;

+        write_len = write(output_fd, buf, len);

+        if(write_len != len)

+        {

+            return -1;

+        }

+    }

+

+    return write_len;

+}

+

+/**

+ * @brief bufferÄÚÈÝдÈëµ½T¿¨

+ * @param[in] buffer ´ýдÈëÊý¾ÝÖ¸Õë

+ * @param[in] buffer_len ´ýдÈëÊý¾Ý³¤¶È

+ * @return ʵ¼ÊдÈëµÄ³¤¶È

+ * @note

+ * @see 

+ */

+int send_message_to_sdcard(unsigned char* buf, int len)

+{

+    return output_log_to_sdcard(g_log_sdcard_para.output_fd, buf, len, &g_log_sdcard_para);

+}

+

+/**

+ * @brief ·¢Ë͹æÔòÎļþµ½cp.\n

+ * @param[in] fd ¹æÔòÎļþÃèÊö·û

+ * @param[in] offset ÎļþÆ«ÒÆ

+ * @param[in] length ·¢ËÍÊý¾Ý³¤¶È

+ * @return 0 on success, -1 otherwise

+ * @note

+ * @see 

+ */

+static int send_rules_to_cp(int fd, int offset, int length)

+{

+    char buf[1024] = {0};

+    int left_len = 0;

+    int next_buf_len = 0;

+    int read_len = 0;

+    

+    if(lseek(fd, offset, SEEK_SET) == -1)

+    {

+        printf("[zcat] rules file lseek to pos %d failed (%s)\n", offset, strerror(errno));

+        return -1; 

+    }

+    

+    left_len = length;

+    next_buf_len = sizeof(buf) < left_len ? sizeof(buf) : left_len;

+    while((read_len = read(fd, buf, next_buf_len)) > 0)

+    {

+        int write_len = write(cplog_fd, buf, read_len);

+        if (write_len != read_len)

+        {

+            printf("[zcat] send_rule error, write_len = %d, len = %d.\n", write_len, read_len);

+            return -1;

+        }

+        left_len -= read_len;

+        next_buf_len = sizeof(buf) < left_len ? sizeof(buf) : left_len;

+    }

+    return 0;

+}

+

+

+/**

+ * @brief ·¢Ë͹æÔòÎļþµ½ap, app devºÍkernel dev.\n

+ * @param[in] fd ¹æÔòÎļþÃèÊö·û

+ * @param[in] offset ÎļþÆ«ÒÆ

+ * @param[in] length ·¢ËÍÊý¾Ý³¤¶È

+ * @return 0 on success, -1 otherwise

+ * @note

+ * @see 

+ */

+static int send_rules_to_ap(int fd, int offset, int length)

+{

+    unsigned char buf[1024] = {0};

+    int left_len = 0;

+    int next_buf_len = 0;

+    int read_len = 0;

+    

+    if(lseek(fd, offset, SEEK_SET) == -1)

+    {

+        printf("[zcat] rules file lseek to pos %d failed (%s)\n", offset, strerror(errno));

+        return -1; 

+    }

+    

+    left_len = length;

+    next_buf_len = sizeof(buf) < left_len ? sizeof(buf) : left_len;

+    while((read_len = read(fd, buf, next_buf_len)) > 0)

+    {

+        deal_with_encoded_data(buf, read_len);

+        next_buf_len = sizeof(buf) < left_len ? sizeof(buf) : left_len;

+    }

+    return 0;

+}

+

+/**

+ * @brief ¼ì¹æÔòÎļþºÏ·¨ÐÔ£¬¶ÁȡժҪÐÅÏ¢.\n

+ * @param[in] fd ¹æÔòÎļþÃèÊö·û

+ * @param[out] rule_info ¹æÔòÎļþ¸ÅÒªÐÅÏ¢

+ * @return ¹æÔòÎļþµÄ´óС

+ * @note

+ * @see 

+ */

+static int get_rule(int fd, rule_struct *rule_info)

+{

+    int len = 0;

+    

+    len = read(fd, rule_info, sizeof(rule_struct));

+    if(len <= 0)

+    {

+        printf("[zcat] rule file len = %d\n", len);

+        return len;

+    }

+    printf("[zcat] rule_info\n\theartbeat_pos : %d\n\theartbeat_len : %d\n\trule_pos      : %d\n\trule_len      : %d\n",

+        rule_info->heartbeat_pos,

+        rule_info->heartbeat_len,

+        rule_info->rule_pos,

+        rule_info->rule_len

+        );

+

+    if(rule_info->heartbeat_len > sizeof(g_heartbeat_buff))

+    {

+        printf("[zcat] check_rule, heartbeat voerload %d error.\n", sizeof(g_heartbeat_buff));

+        return -1;

+    }

+

+    // ¶ÁÈ¡¹æÔòÎļþÖеÄÐÄÌø°üÊý¾Ý£¬Ì滻ĬÈÏÐÄÌøÊý¾Ý

+    if(lseek(fd, rule_info->heartbeat_pos, SEEK_SET) == -1)

+    {

+        printf("[zcat] check_rule, lseek to heartbeat_pos error.\n");

+        return -1;

+    }

+    if(read(fd, g_heartbeat_buff, rule_info->heartbeat_len) <= 0)

+    {

+        printf("[zcat] check_rule, read heartbeat data error.\n");

+        return -1;

+    }

+    

+    return len;

+}

+

+/**

+ * @brief ¹æÔòºÍÐÄÌø·¢ËÍỊ̈߳¬\n

+ *        ¶ÁÈ¡sd¿¨ÖеĹæÔòÎļþ·¢Ë͸øpc£¬ÖÜÆÚÐԵķ¢ËÍÐÄÌø.

+ * @param[in] arg sd¿¨ÎļþÃèÊö·û

+ * @return void

+ * @note

+ * @see 

+ */

+static void rule_heartbeat_entry(void *arg)

+{

+    BOOL bSendRule = FALSE;

+    int rule_file_fd = 0;

+    int rule_len = 0;

+    rule_struct rule_info = { {0} };

+    char* heartbeat_buf = g_heartbeat_buff;

+    int heartbeat_len = sizeof(g_heartbeat_buff);

+

+    prctl(PR_SET_NAME, "heartbeat");

+    

+    while(TRUE)

+    {

+        int write_len = write(cplog_fd, heartbeat_buf, heartbeat_len);

+        if (write_len != heartbeat_len)

+        {

+            printf("[zcat] send heartbeat failed! %d, %d, %d\n", cplog_fd, heartbeat_len, write_len);

+        }

+        

+        sleep(2);

+        if(bSDSet == TRUE && bSendRule == FALSE)

+        {

+             rule_file_fd = open(g_log_sdcard_para.rule_path, O_RDONLY, S_IRUSR);

+             if (rule_file_fd < 0)

+             {

+                printf("[zcat] failed to open rule file %s.\n", g_log_sdcard_para.rule_path);

+                return;

+             }

+

+             // ¼ì²é¹æÔòÎļþºÏ·¨ÐÔ

+             rule_len = get_rule(rule_file_fd, &rule_info);

+             if(rule_len <= 0)

+             {

+				close(rule_file_fd);

+				return;

+             }

+             printf("[zcat] check rule success,len is %d\n", rule_len);

+

+             // ·¢ËÍcp¹æÔò

+             send_rules_to_cp(rule_file_fd, rule_info.rule_pos, rule_info.rule_len);

+             printf("[zcat] send rules to cp %d bytes,position %d\n",

+                rule_info.rule_len,

+                rule_info.rule_pos);

+             // ·¢ËÍap¹æÔò

+             send_rules_to_cp(rule_file_fd, rule_info.ap_rule_pos, rule_info.ap_rule_len);

+             printf("[zcat] send rules to cp %d bytes,position %d\n", 

+                rule_info.ap_rule_len,

+                rule_info.ap_rule_pos);

+             

+             close(rule_file_fd);

+             bSendRule = TRUE;

+        }

+    }

+}

+

+#if 0

+/**

+ * @brief »ñÈ¡sdcardģʽ

+ * @param[in] void

+ * @return sdcardģʽ

+ * @note

+ * @see 

+ */

+static E_FLASH_MODE get_flash_mode()

+{

+    E_FLASH_MODE flash_mode = FLASH_MODE_NOMAL;

+

+    return flash_mode;

+}

+#endif

+

+/**

+ * @brief ³õʼ»¯sdcardģʽ£¬´´½¨¹æÔòºÍÐÄÌø·¢ËÍÏß³Ì.

+ * @param[in] void

+ * @return 0 on success, errno otherwise

+ * @note

+ * @see 

+ */

+int init_sdcard_mode()

+{

+    //E_FLASH_MODE flash_mode = FLASH_MODE_NOMAL;

+    

+    //flash_mode = get_flash_mode();

+    pthread_create(&rule_heartbeat_thread, NULL, (void*)rule_heartbeat_entry, NULL);

+    

+    return 0;

+}