Fix mbtk from v1265 GSW

Change-Id: I5d8d395616f284bc74c8b9448cfa347164b5a668
diff --git a/mbtk/libgsw_lib/libgsw_ota.c b/mbtk/libgsw_lib/libgsw_ota.c
new file mode 100755
index 0000000..93d1a6a
--- /dev/null
+++ b/mbtk/libgsw_lib/libgsw_ota.c
@@ -0,0 +1,552 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/stat.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+#include <errno.h>

+#include <stdbool.h>

+

+#include "gsw_ota.h"

+

+

+

+#define LYNQ_OTA_INPROCESS 3

+#define LYNQ_OTA_SUCCESS   4

+#define LYNQ_OTA_FAILED   5

+

+#ifndef LOG_ERR_LEVEL
+#define LOG_ERR_LEVEL  3      /* error conditions */
+#endif
+#ifndef LOG_WARN_LEVEL
+#define LOG_WARN_LEVEL 4   /* warning conditions */
+#endif
+#ifndef LOG_INFO_LEVEL
+#define LOG_INFO_LEVEL 6      /* informational */
+#endif
+#ifndef LOG_DEBUG_LEVEL
+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
+#endif
+#ifndef LOG_VERBOSE_LEVEL
+#define LOG_VERBOSE_LEVEL 8
+#endif

+

+

+#define LIB_PATH "/lib/libmbtk_lib.so"

+

+

+#define StatFunc(x,y) stat(x,y)

+

+#define LOGV(fmt, args ...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGI(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGD(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGW(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \
+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)
+
+#define LOGE(fmt, args...) \
+    do{ \
+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
+        char line_1001[10] = {0}; \
+        sprintf(line_1001, "%d", __LINE__); \
+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
+            if(*ptr_1001 == '/') \
+                 break; \
+            ptr_1001--; \
+        } \
+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+

+typedef int  (*mbtk_fota_get_active_absys_type)(void);

+typedef int  (*mbtk_fota_fw_write)(char* fname, int segment_size);

+typedef int  (*mbtk_fota_fw_write_by_url)(char* url, int segment_size,

+                            int conn_timeout, int download_timeout);

+

+typedef int(*fota_callback)(int state, int percent);

+typedef int  (*mbtk_fota_init)(fota_callback cb);

+typedef int  (*mbtk_fota_status)(void);

+

+typedef void (*mbtk_log)(int level, const char *format,...);

+

+static int segment_size =0;

+static int Process_flag = 0;

+char  addr_buf[256] = {0};

+static void *handle = NULL;

+static mbtk_log fun_ptr_log = NULL;

+

+static int s_ota_flag = -1;

+

+int fota_cb(int status, int percent)

+{

+    Process_flag = percent;

+    return 0;

+}

+

+static int funstat(  char *filename)

+{
+    int ret = 0;
+    struct stat tmep_s;
+
+    memset(&tmep_s, 0, sizeof(stat));
+    ret = StatFunc(filename, &tmep_s);
+    
+    if (ret)
+    {
+        LOGE("stat %s failed! error_code: %s", filename ,strerror(errno));
+        return -1;
+    }
+
+    if (tmep_s.st_size > 0)
+    {
+        segment_size = tmep_s.st_size;
+    }
+
+    return 0;
+}

+

+int32_t init_handle()

+{

+    if(handle == NULL)

+    {

+        handle = dlopen(LIB_PATH, RTLD_NOW );

+        if(handle == NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+        if(fun_ptr_log == NULL)

+        {

+            fun_ptr_log = (mbtk_log)dlsym(handle, "mbtk_log");

+            if(fun_ptr_log ==  NULL)

+            {

+                return GSW_HAL_FAIL;

+            }

+        }

+       

+    }

+    

+

+    

+    return GSW_HAL_SUCCESS;

+}

+

+void deinit_handle()

+{

+    dlclose(handle);

+    handle = NULL;

+    fun_ptr_log = NULL;

+    

+}

+

+/**

+* @brief Start install modem software

+* @param  [in] char* file_path

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_start_autobackup(char* file_path)

+{

+

+    if(file_path == NULL)

+    {

+        LOGE("invalid file_path \n");

+        return GSW_HAL_FAIL;

+    }

+    

+    

+    mbtk_fota_fw_write func_ptr_update = NULL;

+    mbtk_fota_init func_ptr_init= NULL;

+    mbtk_fota_fw_write_by_url func_ptr_update_url = NULL;

+    

+    

+        

+    int ret = -1;

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+    

+    func_ptr_update_url = (mbtk_fota_fw_write_by_url)dlsym(handle, "mbtk_fota_fw_write_by_url");

+    if(func_ptr_update_url == NULL)

+    {

+        LOGE("Error: %s", dlerror());

+        return GSW_HAL_FAIL;

+    }

+

+    

+    // Get the function pointer 

+    func_ptr_update = (mbtk_fota_fw_write)dlsym(handle, "mbtk_fota_fw_write");

+    if (func_ptr_update == NULL)

+     {

+        LOGE("Error: %s", dlerror());

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+    

+    func_ptr_init = (mbtk_fota_init)dlsym(handle, "mbtk_fota_init");

+    if(func_ptr_init == NULL)

+     {

+        LOGE("Error: %s", dlerror());

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+    

+

+    if(s_ota_flag == -1)

+    {

+        ret = func_ptr_init(fota_cb);

+        if(ret < 0)

+        {

+            LOGE("Error: mbtk_fota_init failed");

+        

+            deinit_handle();

+            return GSW_HAL_FAIL;

+        }

+        else

+        {

+            s_ota_flag = 0;

+        }

+    }

+

+    if(strncmp(file_path, "http", 4) == 0)

+    {

+        segment_size = 62914560;

+        ret = func_ptr_update_url(file_path, segment_size,10, 600);

+    }

+    else

+    {

+        if(strstr(file_path,"updata.bin") == NULL)

+        {

+            LOGE("Bad file path ");

+            deinit_handle();

+            return GSW_HAL_FAIL;

+        }

+        else

+        {

+            if(access(file_path,F_OK) !=0)

+            {

+                LOGE("update  file no exist");

+                deinit_handle();

+                return GSW_HAL_FAIL;

+            }

+        }

+            

+        ret = funstat(file_path);

+        if (ret)
+        {
+            LOGE("get segment_size fail");

+            deinit_handle();

+            return GSW_HAL_FAIL;  

+        }

+        ret = func_ptr_update(file_path, segment_size);

+        if(ret < 0)

+        {

+            LOGE("Error: mbtk_fota_fw_write failed\n");

+            deinit_handle();

+            return GSW_HAL_FAIL;

+        }

+     }

+    return GSW_HAL_SUCCESS;

+

+}

+

+/**

+* @brief check the modem update condition

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval TRUE/FALSE

+*/

+bool gsw_update_modem_check_condition(void)

+{

+    char command[32] = {0};

+    char buffer[64] = {0};

+    const char *process_ota = "{otad}";

+

+    snprintf(command,sizeof(command), "ps | grep %s | grep -v grep", process_ota);

+    FILE *fp = popen(command, "r");

+    if (fp == NULL) 

+    {

+        return false;

+    }

+    

+    if(fgets(buffer, sizeof(buffer), fp)!= NULL)

+    {

+        pclose(fp);

+        return true;

+    }

+    pclose(fp);

+    return false;

+

+}

+

+/**

+* @brief get update modem result

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval E_GSW_OTA_RET

+*/

+E_GSW_OTA_RET gsw_update_modem_result_query(void)

+{   

+   

+    mbtk_fota_status func_ptr_get_result = NULL;

+    int ret = -1;

+    

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+    

+    // Get the function pointer 

+    func_ptr_get_result = (mbtk_fota_status)dlsym(handle, "mbtk_fota_status");

+    if (func_ptr_get_result == NULL)

+     {

+        LOGE("Error: %s\n", dlerror());

+        return GSW_HAL_FAIL;

+    }

+    ret = func_ptr_get_result();

+    if(ret < 0 && ret !=-1)

+    {

+        LOGE("Error: mbtk_fota_status failed\n");

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+

+    deinit_handle();

+    

+    if(ret == LYNQ_OTA_INPROCESS)

+    {

+        return GSW_OTA_INPROCESS;

+

+    }

+    else if(ret == LYNQ_OTA_SUCCESS)

+    {

+        return GSW_OTA_SUCCESS;

+    }

+    else if(ret == -1)

+    {

+        return GSW_OTA_NO_TASK;

+    }

+    

+    return GSW_OTA_FAILURE;

+    

+    

+}

+

+/**

+* @brief Start install modem software

+* @param  [in] char* file_path

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_start_nobackup(char* file_path)

+{

+    

+    return GSW_HAL_SUCCESS;

+}

+

+

+/**

+* @brief get current system

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+E_GSW_OTA_SYSTEM gsw_update_modem_get_system(void)

+{

+    int ret = -1;

+   

+    mbtk_fota_get_active_absys_type func_ptr;

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+

+    // Get the function pointer 

+    func_ptr = (mbtk_fota_get_active_absys_type)dlsym(handle, "mbtk_fota_get_active_absys_type");

+    if (func_ptr == NULL)

+     {

+        LOGE("Error: %s", dlerror());

+        return GSW_HAL_FAIL;

+    }

+    ret = func_ptr();

+    if(ret < 0)

+    {

+        LOGE("Error: mbtk_fota_get_active_absys_type failed");

+        deinit_handle();

+        return GSW_HAL_FAIL;

+

+    }

+    

+    deinit_handle();

+    

+    return ret;

+

+}

+

+/**

+* @brief cancel update

+* @param  [in] NULL

+* @param  [out] NULL

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_cancel(void)

+{

+    

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief get modem update info

+* @param  [in] NULL

+* @param  [out] gsw_update_info_s 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_get_info(gsw_update_info_s *update_info)

+{

+    int ret = -1;

+        

+    mbtk_fota_status     func_ptr_get_info = NULL;

+    

+    ret = init_handle();

+    if(ret < 0)

+    {

+        LOGE("init_handle fail");

+        return GSW_HAL_FAIL;

+    }

+    

+    // Get the function pointer 

+    func_ptr_get_info = (mbtk_fota_status)dlsym(handle, "mbtk_fota_status");

+    if (func_ptr_get_info == NULL)

+     {

+        LOGE("Error: %s\n", dlerror());

+        return GSW_HAL_FAIL;

+    }

+    ret = func_ptr_get_info();

+    if(ret < 0 &&  ret != -1)

+    {

+        LOGE("Error: mbtk_fota_status failed\n");

+        deinit_handle();

+        return GSW_HAL_FAIL;

+    }

+

+    //升级成功之后,未重启,不可重复升级

+    if(ret == LYNQ_OTA_INPROCESS)

+    {

+        update_info->exit_code = GSW_UPDATE_NOGOING;

+        update_info->percentage = Process_flag;

+        update_info->update_state = GSW_UPDATE_INPROGRESS;

+    }

+    if(ret == LYNQ_OTA_SUCCESS)

+    {

+        update_info->exit_code = GSW_UPDATE_NOERROR;

+        update_info->percentage = Process_flag;

+        update_info->update_state = GSW_UPDATE_WAITEDONE;

+    }

+

+    

+    if(ret == LYNQ_OTA_FAILED || ret == -1)

+    {

+        update_info->exit_code = GSW_UPDATE_GETOLDSOFTWAREFAILED;

+        update_info->percentage = Process_flag;

+        update_info->update_state = GSW_UPDATE_FAILED;

+    }

+    

+    deinit_handle();

+    return GSW_HAL_SUCCESS;

+

+}

+

+

+/**

+* @brief get modem system status

+* @param  [in] NULL

+* @param  [out] gsw_system_status_s 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_get_status(gsw_system_status_s *system_status)

+{

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+* @brief A/B system sync

+* @param  [in] NULL

+* @param  [out] NULL 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_sync(void)

+{

+    return GSW_HAL_SUCCESS;

+

+}

+

+/**

+* @brief A/B system switch

+* @param  [in] NULL

+* @param  [out] NULL 

+* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+*/

+int32_t gsw_update_modem_switch(void)

+{

+    return GSW_HAL_SUCCESS;

+}