[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/devtools/mrdump/mrdump_tool_source/mrdump_common.c b/src/devtools/mrdump/mrdump_tool_source/mrdump_common.c
new file mode 100644
index 0000000..39c50af
--- /dev/null
+++ b/src/devtools/mrdump/mrdump_tool_source/mrdump_common.c
@@ -0,0 +1,205 @@
+/* uint64_t ...*/
+#include <inttypes.h>
+#include <stdbool.h>
+
+/* struct stat, open */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+/* fsync(), close() */
+#include <unistd.h>
+
+/* strerror */
+#include <string.h>
+/* errno */
+#include <errno.h>
+
+/* statfs() and statvfs() */
+#include <sys/statfs.h>
+#include <sys/statvfs.h>
+#include <sys/vfs.h>
+
+/* ioctl, BLKGETSIZE64 */
+#include <linux/fs.h>
+#include <sys/ioctl.h>
+
+#ifdef __ANDROID__
+/* Property */
+#include <cutils/properties.h>
+#include <sys/system_properties.h>
+#elif defined(__YOCTO_OS__)
+#include <stdio.h>
+#endif
+
+/* mrdump related */
+#include "mrdump_log.h"
+#include "mrdump_common.h"
+#include "mrdump_support_ext4.h"
+#include "mrdump_support_f2fs.h"
+#include "mrdump_status_private.h"
+
+void mrdump_close(int fd)
+{
+    fsync(fd);
+    close(fd);
+}
+
+int mrdump_file_is_exist(const char *path)
+{
+    struct stat s;
+    if (!path)
+        return 0;
+    if (stat(path, &s) != 0)
+        return 0;
+    return 1;
+}
+
+int mrdump_get_data_os(void)
+{
+    if (mount_as_ext4(MRDUMP_EXT4_MOUNT_POINT))
+        return MRDUMP_DATA_FS_EXT4;
+
+    if (mount_as_f2fs(MRDUMP_EXT4_MOUNT_POINT))
+        return MRDUMP_DATA_FS_F2FS;
+
+    MD_LOGI("%s: unknown os\n", __func__);
+    return MRDUMP_DATA_FS_NONE;
+}
+
+uint64_t mrdump_get_partition_free_size(const char *mountp)
+{
+    struct statvfs vfs;
+    uint64_t psize;
+
+    if(statvfs(mountp, &vfs) == 0) {
+        psize = (uint64_t) vfs.f_frsize * (uint64_t) vfs.f_bfree;
+        MD_LOGD("%s: size of %s: %" PRId64 " bytes.\n", __func__, mountp, psize);
+        return psize;
+    }
+
+    MD_LOGE("%s: statvfs of %s got failed(%d), %s\n", __func__, mountp, errno, strerror(errno));
+    return 0;
+}
+
+uint64_t mrdump_get_partition_size(char *fullpath)
+{
+    int fd = open(fullpath, O_RDONLY);
+    if (0 > fd) {
+        MD_LOGE("%s: open fullpath failed. (%s)\n", __func__, fullpath);
+        return 0;
+    }
+
+    uint64_t psize;
+    int ret = ioctl(fd, BLKGETSIZE64, &psize);
+    if (0 > ret) {
+        MD_LOGE("%s: ioctl BLKGETSIZE64 failed. (%s)\n", __func__, fullpath);
+        mrdump_close(fd);
+        return 0;
+    }
+
+    mrdump_close(fd);
+
+    return psize;
+}
+
+static char *mrdump_get_device_node_from_fstab(const char *fstab, const char *mountp)
+{
+#ifdef __ANDROID_
+    int ret;
+    FILE *fp;
+    char c, myline[1024];
+    char *delim="\x09\x20";
+    char *DeviceNode, *MountPoint;
+
+    DeviceNode = NULL;
+    fp = fopen(fstab, "r");
+    if(fp == NULL)
+        return NULL;
+
+    while(!feof(fp)) {
+
+        // getline
+        ret = fscanf(fp, "%[^\n]", myline);
+
+        // strtok strings
+        if(ret > 0) {
+            if(myline[0] == '/') {
+                DeviceNode = strtok(myline, delim);
+                MountPoint = strtok(NULL, delim);
+                if(MountPoint != NULL) {
+                    if(!strcmp(MountPoint, mountp)) {
+                        fclose(fp);
+                        return strdup(DeviceNode);
+                    }
+                }
+            }
+        }
+
+        /* clear newline character */
+        ret = fscanf(fp, "%c", &c);
+        if (ret != 1) {
+            MD_LOGE("%s: not EOL.", __func__);
+            fclose(fp);
+            return NULL;
+        }
+    }
+    fclose(fp);
+    return NULL;
+#elif defined(__YOCTO_OS__)
+#endif
+}
+
+#ifdef __ANDROID_
+static const char *fstab_path_prefix[] = {
+    "/vendor/etc/fstab",
+    "/fstab",
+    NULL
+};
+#elif defined(__YOCTO_OS__)
+static const char expdb_dev[] = "/dev/disk/by-partlabel/expdb";
+static const char preallocate_dev[] = "/dev/disk/by-partlabel/log";
+#endif
+
+char *mrdump_get_device_node(const char *mountp)
+{
+#ifdef __ANDROID_
+    int i;
+    char *DeviceNode = NULL;
+    char fstab_filename[PROPERTY_VALUE_MAX];
+
+    /* get hardware parts */
+    char propbuf[PROPERTY_VALUE_MAX];
+    if(property_get("ro.hardware", propbuf, NULL) == 0)
+        property_get("ro.board.platform", propbuf, "");
+
+    for(i = 0; fstab_path_prefix[i] != NULL; i++) {
+        snprintf(fstab_filename, sizeof(fstab_filename), "%s.%s", fstab_path_prefix[i], propbuf);
+        if(mrdump_file_is_exist(fstab_filename))
+            DeviceNode =  mrdump_get_device_node_from_fstab(fstab_filename, mountp);
+        if(DeviceNode)
+            return DeviceNode;
+    }
+
+    /* search for path: /fstab */
+    DeviceNode =  mrdump_get_device_node_from_fstab("/fstab", mountp);
+    char fstab_filename[PATH_MAX];
+
+    for (i = 0; fstab_path_prefix[i] != NULL; i++) {
+        snprintf(fstab_filename, sizeof(fstab_filename), "%s", fstab_path_prefix[i]);
+        if(mrdump_file_is_exist(fstab_filename))
+            DeviceNode =  mrdump_get_device_node_from_fstab(fstab_filename, mountp);
+        if(DeviceNode)
+            return DeviceNode;
+    }
+    return DeviceNode;
+#elif defined(__YOCTO_OS__)
+    if (!strncmp(mountp, MRDUMP_EXPDB_NAME, sizeof(MRDUMP_EXPDB_NAME)))
+	return strdup(expdb_dev);
+
+    if (!strncmp(mountp, MRDUMP_EXT4_MOUNT_POINT, sizeof(MRDUMP_EXT4_MOUNT_POINT)))
+        return strdup(preallocate_dev);
+
+    return NULL;
+#endif
+}