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

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/fs_check/fs_check.c b/ap/app/fs_check/fs_check.c
new file mode 100755
index 0000000..d6106ec
--- /dev/null
+++ b/ap/app/fs_check/fs_check.c
@@ -0,0 +1,147 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <assert.h>

+#include <string.h>

+#include "fs_check.h"

+#include "pub_debug_info.h"

+

+extern int mount_fs_partition(struct mtd_fs *p_fs);

+extern int mtd_erase_partition(const char* partition_name);

+extern int mtd_write_partition(const char* partition_name, const char* image_file);

+extern int unmount_fs_partition(struct mtd_fs *p_fs);

+extern int check_userdata_is_normal();

+extern char *g_path_prefix;

+

+static struct mtd_fs fs_array[] = {

+#ifdef USE_UBIFS

+#ifdef CONFIG_SYSTEM_CAP

+	{

+		.patition_name="capuserdata",

+		.mtd_index=-1,

+		.mount_point="/mnt/userdata",

+		.image_file="/etc_ro/ap_capuserdata.img",

+		.fs_type="ubifs",

+		.mount_opt="",

+		.sh_cmd=NULL

+	},

+#else

+	{

+		.patition_name="userdata",

+		.mtd_index=-1,

+		.mount_point="/mnt/userdata",

+		.image_file="/etc_ro/ap_userdata.img",

+		.fs_type="ubifs",

+		.mount_opt="",

+		.sh_cmd=NULL

+	},

+#endif

+#else

+#ifdef CONFIG_SYSTEM_CAP

+	{

+		.patition_name="capuserdata",

+		.mtd_index=-1,

+		.mount_point="/mnt/userdata",

+		.image_file="/etc_ro/ap_capuserdata.img",

+		.fs_type="jffs2",

+		.mount_opt="",

+		.sh_cmd=NULL

+	},

+#else

+	{

+		.patition_name="userdata",

+		.mtd_index=-1,

+		.mount_point="/mnt/userdata",

+		.image_file="/etc_ro/ap_userdata.img",

+		.fs_type="jffs2",

+		.mount_opt="",

+		.sh_cmd=NULL

+	},

+#endif

+#endif

+#ifndef CONFIG_SYSTEM_CAP

+	{

+		.patition_name="nvrofs",

+		.mtd_index=-1,

+		.mount_point="/mnt/nvrofs",

+		.image_file=NULL,

+		.fs_type="jffs2",

+		.mount_opt="-o ro",

+		.sh_cmd=NULL

+	}

+#endif

+};

+

+int main(int argc, char *argv[]) {

+

+	int i;

+	int ret;

+	int result;

+	int fs_cnt = sizeof(fs_array)/sizeof(fs_array[0]);

+	

+	//recovery版本文件系统挂载

+	if (0 == strcmp(argv[1], "recovery"))

+	{

+		g_path_prefix = "/recovery";

+		for(i = 0; i < fs_cnt; i++) {

+			printf("fs_check mount_fs_partition begin\n"); 

+			sc_debug_info_record(MODULE_ID_AP_FS_CHECK, "fs_check mount_fs_partition begin\n");

+			ret = mount_fs_partition(&fs_array[i]);

+			printf("fs_check mount_fs_partition mount result %d\n",ret);

+			sc_debug_info_record(MODULE_ID_AP_FS_CHECK, "fs_check mount_fs_partition mount result %d\n", ret);

+		}

+		return 0;

+	}

+

+	//normal版本文件系统挂载

+	for(i = 0; i < fs_cnt; i++) {

+		printf("fs_check mount_fs_partition begin\n"); 

+		ret = mount_fs_partition(&fs_array[i]);

+		if(ret)

+		{

+			unmount_fs_partition(&fs_array[i]);

+			mtd_erase_partition(fs_array[i].patition_name);

+			printf("fs_check mtd_erase %s\n", fs_array[i].patition_name);

+			sc_debug_info_record(MODULE_ID_AP_FS_CHECK, "fs_check mtd_erase %s\n", fs_array[i].patition_name);

+			ret = mtd_write_partition(fs_array[i].patition_name, fs_array[i].image_file);

+			printf("fs_check mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);

+			sc_debug_info_record(MODULE_ID_AP_FS_CHECK, "fs_check mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);

+			ret = mount_fs_partition(&fs_array[i]);

+			if(ret)

+				assert(0);

+		}

+#ifndef CONFIG_SYSTEM_CAP

+		else

+		{

+			//挂载成功后检查文件是否被破坏,如果破坏则恢复

+			if ((0 == strcmp(fs_array[i].patition_name, "userdata")))

+			{

+				result = check_userdata_is_normal();

+			}

+			else

+			{

+				result = 0;

+			}

+			if(result)

+			{

+				unmount_fs_partition(&fs_array[i]);

+				//printf("fs_check mount %s fail\n", fs_array[i].patition_name);

+				mtd_erase_partition(fs_array[i].patition_name);

+				printf("fs_check mtd_erase %s\n", fs_array[i].patition_name);

+				sc_debug_info_record(MODULE_ID_AP_FS_CHECK, "fs_check mtd_erase %s\n", fs_array[i].patition_name);

+				ret = mtd_write_partition(fs_array[i].patition_name, fs_array[i].image_file);

+				printf("fs_check mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);

+				sc_debug_info_record(MODULE_ID_AP_FS_CHECK, "fs_check mtd_write %s ret = %d\n", fs_array[i].patition_name, ret);

+				ret = mount_fs_partition(&fs_array[i]);

+				if(ret)

+					assert(0);

+			}

+		}

+#endif

+		printf("fs_check mount %s success!\n", fs_array[i].patition_name);

+		sc_debug_info_record(MODULE_ID_AP_FS_CHECK, "fs_check mount %s success!\n", fs_array[i].patition_name);

+	}

+

+	return 0;

+}

+

+