From b179e2ae78d5f48586b7f510682ba074536db8ea Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Wed, 12 Aug 2015 15:56:14 +0900 Subject: modify ug library search path in ug module load Change-Id: If319f25895b56fb1749a22fdb225ad87a628483d Signed-off-by: Jiwoong Im --- src/module.c | 163 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 103 insertions(+), 60 deletions(-) mode change 100644 => 100755 src/module.c (limited to 'src/module.c') diff --git a/src/module.c b/src/module.c old mode 100644 new mode 100755 index 5fd92eb..c61f720 --- a/src/module.c +++ b/src/module.c @@ -29,6 +29,7 @@ #include #include +#include #include "ug-module.h" #include "ug-dbg.h" @@ -52,10 +53,9 @@ static int file_exist(const char *filename) return 0; } -static char *__ug_module_get_addr(const char *ug_so) +static char *__ug_module_get_addr(const char *ug_name) { FILE *file; - int ret; char buf[PATH_MAX] = {0,}; char mem[PATH_MAX] = {0,}; @@ -63,7 +63,7 @@ static char *__ug_module_get_addr(const char *ug_so) char *saveptr = NULL; int cnt = 0; - if(ug_so == NULL) + if (ug_name == NULL) goto func_out; snprintf(buf, sizeof(buf), "/proc/%d/maps", getpid()); @@ -78,14 +78,14 @@ static char *__ug_module_get_addr(const char *ug_so) while(fgets(buf, PATH_MAX, file) != NULL) { - if(strstr(buf, ug_so)) { + if (strstr(buf, ug_name)) { token_param = strtok_r(buf," ", &saveptr); - if((token_param == NULL) || (strlen(token_param) > MEM_ADDR_TOT_LEN)) { + if ((token_param == NULL) || (strlen(token_param) > MEM_ADDR_TOT_LEN)) { _ERR("proc token param(%s) error", token_param); goto close_out; } - if(cnt > 0) { + if (cnt > 0) { memcpy((void *)(mem+MEM_ADDR_LEN+1), (const void *)(token_param+MEM_ADDR_LEN+1), MEM_ADDR_LEN); } else { @@ -93,7 +93,7 @@ static char *__ug_module_get_addr(const char *ug_so) cnt++; } } else { - if(cnt > 0) + if (cnt > 0) goto close_out; } @@ -106,54 +106,109 @@ close_out: file = NULL; func_out: - if(strlen(mem) > 0) + if (strlen(mem) > 0) return strdup(mem); else return NULL; } +static int __get_ug_info(const char* name, char** ug_file_path) +{ + char ug_file[PATH_MAX] = {0,}; + char pkg_name[PATH_MAX] = {0,}; + int ret = -1; + char *pkg_id = NULL; + + snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", + tzplatform_getenv(TZ_SYS_RO_UG), name); + if (file_exist(ug_file)) { + LOGD("ug_file(%s) check ok(%d)", ug_file, errno); + goto out_func; + } else { + LOGD("ug_file(%s) check fail(%d)", ug_file, errno); + } + snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", + tzplatform_getenv(TZ_SYS_RW_UG), name); + if (file_exist(ug_file)) { + LOGD("ug_file(%s) check ok(%d)", ug_file, errno); + goto out_func; + } else { + LOGD("ug_file(%s) check fail(%d)", ug_file, errno); + } + + /* Get pkg name by appid */ + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(name, &handle); + + if (ret != PMINFO_R_OK) { + SECURE_LOGD("fail to get app info using ug name(%s)", name); + goto err_func; + } + ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkg_id); + if (ret != PMINFO_R_OK) { + _DBG("fail to get pkgid from appinfo handle"); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + goto err_func; + } else { + SECURE_LOGD("pkg id: %s\n", pkg_id); + snprintf(pkg_name, PATH_MAX, "%s", pkg_id); + } + + pkgmgrinfo_appinfo_destroy_appinfo(handle); + + if (strlen(pkg_name)) { + /* FOTA UPDATE CORE APP(RPM) */ + snprintf(ug_file, PATH_MAX, "%s/%s/lib/ug/lib%s.so", + tzplatform_getenv(TZ_SYS_RO_APP), pkg_name, name); + if (file_exist(ug_file)) { + LOGD("ug_file(%s) check ok(%d)", ug_file, errno); + goto out_func; + } else { + LOGD("ug_file(%s) check fail(%d)", ug_file, errno); + } + /* Downloadable CORE APP(TPK) */ + snprintf(ug_file, PATH_MAX, "%s/%s/lib/ug/lib%s.so", + tzplatform_getenv(TZ_USER_APP), pkg_name, name); + if (file_exist(ug_file)) { + LOGD("ug_file(%s) check ok(%d)", ug_file, errno); + goto out_func; + } else { + LOGD("ug_file(%s) check fail(%d)", ug_file, errno); + } + LOGD("ug_file(%s) does not exist(%d)", ug_file, errno); + } + +out_func: + ret = 0; + if ((strlen(ug_file) > 0) && (ug_file_path)) { + *ug_file_path = strdup(ug_file); + } + return ret; + +err_func: + + return -1; +} + struct ug_module *ug_module_load(const char *name) { void *handle; struct ug_module *module; - char ug_file[PATH_MAX]; - char *pkg_name = NULL; - int (*module_init) (struct ug_module_ops *ops); + char *ug_file = NULL; + + if (__get_ug_info(name, &ug_file) < 0) { + _ERR("error in getting ug file path"); + return NULL; + } module = calloc(1, sizeof(struct ug_module)); if (!module) { errno = ENOMEM; + free(ug_file); return NULL; } - app_manager_get_app_id(getpid(), &pkg_name); - - do { - if (pkg_name) { - snprintf(ug_file, PATH_MAX, "%s/%s/lib/libug-%s.so", tzplatform_getenv(TZ_SYS_RO_APP), pkg_name, name); - if (file_exist(ug_file)) - break; - snprintf(ug_file, PATH_MAX, "%s/%s/lib/libug-%s.so", tzplatform_getenv(TZ_SYS_RO_APP), pkg_name, name); - if (file_exist(ug_file)) - break; - } - snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", tzplatform_getenv(TZ_SYS_RO_UG), name); - if (file_exist(ug_file)) - break; - snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", tzplatform_getenv(TZ_SYS_RW_UG), name); - if (file_exist(ug_file)) - break; - snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", tzplatform_getenv(TZ_USER_UG), name); - if (file_exist(ug_file)) - break; - } while (0); - - if(pkg_name) { - free(pkg_name); - pkg_name = NULL; - } - handle = dlopen(ug_file, RTLD_LAZY); if (!handle) { _ERR("dlopen failed: %s", dlerror()); @@ -172,8 +227,9 @@ struct ug_module *ug_module_load(const char *name) module->handle = handle; module->module_name = strdup(name); - module->addr = __ug_module_get_addr(ug_file); + module->addr = __ug_module_get_addr(name); + free(ug_file); return module; module_dlclose: @@ -181,6 +237,7 @@ struct ug_module *ug_module_load(const char *name) module_free: free(module); + free(ug_file); return NULL; } @@ -205,10 +262,10 @@ int ug_module_unload(struct ug_module *module) module->handle = NULL; } - if(module->module_name) + if (module->module_name) free(module->module_name); - if(module->addr) + if (module->addr) free(module->addr); free(module); @@ -217,26 +274,12 @@ int ug_module_unload(struct ug_module *module) int ug_exist(const char* name) { - char ug_file[PATH_MAX] = {0,}; - int ret = 0; + int ret = 1; - do { - snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", tzplatform_getenv(TZ_SYS_RO_UG), name); - if (file_exist(ug_file)) { - ret = 1; - break; - } - snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", tzplatform_getenv(TZ_SYS_RW_UG), name); - if (file_exist(ug_file)) { - ret = 1; - break; - } - snprintf(ug_file, PATH_MAX, "%s/lib/libug-%s.so", tzplatform_getenv(TZ_USER_UG), name); - if (file_exist(ug_file)) { - ret = 1; - break; - } - } while (0); + if (__get_ug_info(name, NULL) < 0) { + _ERR("error in getting ug file path"); + ret = 0; + } return ret; } -- cgit v1.2.3