From b141b0c3cb2a01aed2f7d4bda17a6ba22ed3689f Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:56:38 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- CMakeLists.txt | 22 ++ LICENSE.APLv2 | 202 ++++++++++++++++ NOTICE | 3 + osp-exec-loader/CMakeLists.txt | 19 ++ osp-exec-loader/exec_loader.c | 1 + osp-loader.manifest | 5 + osp-service-app-loader/CMakeLists.txt | 15 ++ osp-service-app-loader/serviceapp_loader.c | 283 ++++++++++++++++++++++ osp-system-service-loader/CMakeLists.txt | 17 ++ osp-system-service-loader/systemservice_loader.c | 217 +++++++++++++++++ osp-ui-app-loader/CMakeLists.txt | 17 ++ osp-ui-app-loader/uiapp_loader.c | 295 +++++++++++++++++++++++ packaging/osp-loader.spec | 59 +++++ 13 files changed, 1155 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE.APLv2 create mode 100644 NOTICE create mode 100644 osp-exec-loader/CMakeLists.txt create mode 120000 osp-exec-loader/exec_loader.c create mode 100644 osp-loader.manifest create mode 100644 osp-service-app-loader/CMakeLists.txt create mode 100644 osp-service-app-loader/serviceapp_loader.c create mode 100644 osp-system-service-loader/CMakeLists.txt create mode 100644 osp-system-service-loader/systemservice_loader.c create mode 100644 osp-ui-app-loader/CMakeLists.txt create mode 100644 osp-ui-app-loader/uiapp_loader.c create mode 100644 packaging/osp-loader.spec diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..1de6d17 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,22 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +SET(CMAKE_EXECUTABLE_SUFFIX "") + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED + dlog + appinfo + libprivilege-control +) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_C_FLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") + +ADD_SUBDIRECTORY(osp-ui-app-loader) +ADD_SUBDIRECTORY(osp-service-app-loader) +ADD_SUBDIRECTORY(osp-system-service-loader) +ADD_SUBDIRECTORY(osp-exec-loader) + diff --git a/LICENSE.APLv2 b/LICENSE.APLv2 new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE.APLv2 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..0e0f016 --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Apache License, Version 2. +Please, see the LICENSE.APLv2 file for Apache License terms and conditions. diff --git a/osp-exec-loader/CMakeLists.txt b/osp-exec-loader/CMakeLists.txt new file mode 100644 index 0000000..13a0278 --- /dev/null +++ b/osp-exec-loader/CMakeLists.txt @@ -0,0 +1,19 @@ +SET (this_target osp-exec-loader) + +SET (${this_target}_SOURCE_FILES + exec_loader.c + ) + +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +SET(CMAKE_C_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS}") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") +SET(CMAKE_CXX_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS}") + +TARGET_LINK_LIBRARIES(${this_target} "-Wl,--no-undefined -Wl,--as-needed -Wl,-Ttext-segment=0x02000000") +TARGET_LINK_LIBRARIES(${this_target} "-ldl") +TARGET_LINK_LIBRARIES(${this_target} ${pkgs_LDFLAGS}) + +INSTALL(TARGETS ${this_target} DESTINATION ${LIB_INSTALL_DIR}/osp) + + diff --git a/osp-exec-loader/exec_loader.c b/osp-exec-loader/exec_loader.c new file mode 120000 index 0000000..edec52f --- /dev/null +++ b/osp-exec-loader/exec_loader.c @@ -0,0 +1 @@ +../osp-ui-app-loader/uiapp_loader.c \ No newline at end of file diff --git a/osp-loader.manifest b/osp-loader.manifest new file mode 100644 index 0000000..ae3e6f7 --- /dev/null +++ b/osp-loader.manifest @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/osp-service-app-loader/CMakeLists.txt b/osp-service-app-loader/CMakeLists.txt new file mode 100644 index 0000000..7618615 --- /dev/null +++ b/osp-service-app-loader/CMakeLists.txt @@ -0,0 +1,15 @@ +SET (this_target osp-service-app-loader) + +SET (${this_target}_SOURCE_FILES + serviceapp_loader.c + ) + +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +SET(CMAKE_C_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS} -fPIE") + +TARGET_LINK_LIBRARIES(${this_target} "-Wl,--no-undefined -Wl,--as-needed -pie") +TARGET_LINK_LIBRARIES(${this_target} "-ldl") +TARGET_LINK_LIBRARIES(${this_target} ${pkgs_LDFLAGS}) + +INSTALL(TARGETS ${this_target} DESTINATION ${LIB_INSTALL_DIR}/osp) diff --git a/osp-service-app-loader/serviceapp_loader.c b/osp-service-app-loader/serviceapp_loader.c new file mode 100644 index 0000000..f811216 --- /dev/null +++ b/osp-service-app-loader/serviceapp_loader.c @@ -0,0 +1,283 @@ +// +// Open Service Platform +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** +* @file serviceapp_loader.c +* @brief This is the implementation for the osp-service-app-loader. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#undef LOG_TAG +#define LOG_TAG "LOADER" + +#define MAX_PACKAGEID 10 +#define MAX_APP_EXECUTABLE_NAME 230 +#define MAX_APPID (MAX_PACKAGEID + MAX_APP_EXECUTABLE_NAME + 1) + + +#if 0 +static void +print_args(int argc, char* argv[]) +{ + const char* p = NULL; + int i = 0; + for (; i < argc; i++) + { + p = argv[i]; + LOGI("%dth arg : [%s]", i, p); + } +} +#endif + +static void +adjust_privilege(const char* appid) +{ + set_privilege(appid); +} + +extern int capset(cap_user_header_t hdrp, const cap_user_data_t datap); + +static int +adjust_capability(void) +{ + cap_user_header_t head = 0; + cap_user_data_t data = 0; + + head = (cap_user_header_t) malloc(sizeof(*head)); + if (head == NULL) + { + fprintf(stderr, "Memory allocation failure.\n"); + return -1; + } + + head->version = _LINUX_CAPABILITY_VERSION; + head->pid = getpid(); + + data = (cap_user_data_t) calloc(sizeof(*data), _LINUX_CAPABILITY_U32S); + if (data == NULL) + { + fprintf(stderr, "Memory allocation failure.\n"); + + free(head); + return -1; + } + + data[CAP_TO_INDEX(CAP_NET_RAW)].effective |= CAP_TO_MASK(CAP_NET_RAW); + data[CAP_TO_INDEX(CAP_NET_RAW)].permitted |= CAP_TO_MASK(CAP_NET_RAW); + + if (capset(head, data) < 0) + { + fprintf(stderr, "Capability setting error\n"); + + free(data); + free(head); + return -1; + } + + free(data); + free(head); + + return 0; +} + +static int +osp_do_pre_exe(const char* app_id, const char* bin_path) +{ + int ret = 0; + void* handle = NULL; + char* errormsg = 0; + int (*do_pre_exec_fn)(const char*, const char*) = NULL; + + handle = dlopen("libosp-env-config.so", RTLD_LAZY | RTLD_LOCAL); + if (!handle) + { + LOGE("Failed to dlopen osp-env-config.so (%s)", dlerror()); + return -1; + } + LOGI("Tizen::App > dlopen() ok"); + + do_pre_exec_fn = (int (*)(const char*, const char*)) dlsym(handle, "do_pre_exec"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to dlsym() (%s)", errormsg); + dlclose(handle); + return -1; + } + LOGI("dlsym() ok"); + + ret = do_pre_exec_fn(app_id, bin_path); + if (ret < 0) + { + LOGE("Failed to do_pre_exe() (%d)", ret); + } + LOGI("do_pre_exec() ok"); + + dlclose(handle); + + return 0; +} + +static int +get_packageid_executable_name_from_path(const char path[], char appid[], char executable_name[]) +{ + // path is "/opt/apps/[appid]/bin/[executable_name]" + + const char* p = strrchr(path, '/'); + if (p == NULL) + { + LOGI("Improper path %s", path); + return -1; + } + + const int path_len = strlen(path); + const int exec_len = strlen(p); + if (exec_len <= 0 || exec_len > PATH_MAX || path_len <= 0 || path_len > PATH_MAX) + { + LOGI("Improper path %s", path); + return -1; + } + + strncpy(executable_name, p + 1, exec_len); + +#ifdef _SECURE_LOG + LOGI("Exec is %s", executable_name); +#endif + + if (path_len < /* '/' */ 1 + 10 + strlen("/bin/") + exec_len) + { + LOGI("Improper path %s", path); + return -1; + } + + strncpy(appid, p - strlen("bin/") - 10, 10); + + LOGI("appId is %s", appid); + + return 1; +} + + +int +main(int argc, char* argv[]) +{ + void* real_handle = NULL; + char* errormsg = 0; + const char* pid = NULL; + + LOGI("Initializing : argc %d, argv 0x%x.", argc, argv); + //print_args(argc, argv); + + if (appinfo_is_initialized() == 0) + { + // not initialized + char appid[MAX_APPID]; + char packageid[MAX_PACKAGEID + 1]; + char executable_name[MAX_APP_EXECUTABLE_NAME]; + + memset(appid, 0, sizeof(appid)); + memset(packageid, 0, sizeof(packageid)); + memset(executable_name, 0, sizeof(executable_name)); + + // convert package path to package name + get_packageid_executable_name_from_path(argv[0], packageid, executable_name); + snprintf(appid, MAX_APPID, "%s.%s", packageid, executable_name); + + // initialize appid + appinfo_init(appid, 0); + + LOGI("Non-preloading initialization done."); + } + + pid = appinfo_get_appid(); + +#ifdef _SECURE_LOG + LOGI("app is %s", pid); +#endif + + if (getuid() == 0) + { + // self caging + osp_do_pre_exe(pid, argv[0]); + + // adjust privilege + adjust_privilege(pid); + } + + + adjust_capability(); + + appinfo_set_argv(argc, argv); + + // actual loading + char buffer[1024]; + + snprintf(buffer, 1024, "%s.exe", argv[0]); + + + real_handle = dlopen(buffer, RTLD_LAZY); + if (!real_handle) + { + LOGE("Failed to open %s : %s.", buffer, dlerror()); + return -1; + } + + void (*pAppInfoInit)() = NULL; + pAppInfoInit = (void (*)()) dlsym(real_handle, "AppInfo_Update"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to find InitAppInfo() : %s.", errormsg); + dlclose(real_handle); + fprintf(stderr, "executable does not have proper osp library dependency.\n"); + return -1; + } + + int (*pRealMain)(int, char* []) = NULL; + pRealMain = (int (*)(int, char*[])) dlsym(real_handle, "OspMain"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to find OspMain() : %s.", errormsg); + dlclose(real_handle); + return -1; + } + + // actual initialization + (*pAppInfoInit)(); + (*pRealMain)(argc, argv); + + LOGI("Osp application terminates."); + + //dlclose(real_handle); + LOGI("Osp cleanup finished for %s.", argv[0]); + + return 0; +} + diff --git a/osp-system-service-loader/CMakeLists.txt b/osp-system-service-loader/CMakeLists.txt new file mode 100644 index 0000000..54d4744 --- /dev/null +++ b/osp-system-service-loader/CMakeLists.txt @@ -0,0 +1,17 @@ +SET (this_target osp-system-service-loader) + +SET (${this_target}_SOURCE_FILES + systemservice_loader.c + ) + +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +SET(CMAKE_C_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS} -fPIE") + +TARGET_LINK_LIBRARIES(${this_target} "-Wl,--no-undefined -Wl,--as-needed -pie") +TARGET_LINK_LIBRARIES(${this_target} "-ldl") +TARGET_LINK_LIBRARIES(${this_target} ${pkgs_LDFLAGS}) + +INSTALL(TARGETS ${this_target} DESTINATION ${LIB_INSTALL_DIR}/osp) + + diff --git a/osp-system-service-loader/systemservice_loader.c b/osp-system-service-loader/systemservice_loader.c new file mode 100644 index 0000000..c39d36b --- /dev/null +++ b/osp-system-service-loader/systemservice_loader.c @@ -0,0 +1,217 @@ +// +// Open Service Platform +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file systemservice_loader.c + * @brief This is the implementation for the osp-system-service-loader. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#undef LOG_TAG +#define LOG_TAG "LOADER" + +#define MAX_PACKAGEID 10 +#define MAX_APP_EXECUTABLE_NAME 230 +#define MAX_APPID (MAX_PACKAGEID + MAX_APP_EXECUTABLE_NAME + 1) + + +#if 0 +static void +print_args(int argc, char* argv[]) +{ + const char* p = NULL; + int i = 0; + for (; i < argc; i++) + { + p = argv[i]; + LOGI("%dth arg : [%s]", i, p); + } +} +#endif + +static int +osp_do_pre_exe(const char* bin_path) +{ + int ret = 0; + void* handle = NULL; + char* errormsg = 0; + int (*do_pre_exec_fn)(const char*, const char*) = NULL; + + handle = dlopen("libosp-env-config.so", RTLD_LAZY | RTLD_LOCAL); + if (!handle) + { + LOGE("Failed to dlopen libosp-env-config.so (%s)", dlerror()); + return -1; + } + LOGI("dlopen() ok"); + + do_pre_exec_fn = (int (*)(const char*, const char*)) dlsym(handle, "do_pre_exec"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to dlsym() (%s)", errormsg); + dlclose(handle); + return -1; + } + LOGI("dlsym() ok"); + + ret = do_pre_exec_fn(NULL, bin_path); + if (ret < 0) + { + LOGE("Failed to do_pre_exe() (%d)", ret); + } + LOGI("do_pre_exec() ok"); + + dlclose(handle); + + return 0; +} + +static int +get_packageid_executable_name_from_path(const char path[], char appid[], char executable_name[]) +{ + // path is ".../[appid]/bin/[executable_name]" + + // Calculate the header + const char* p = strrchr(path, '/'); + if (p == NULL) + { + LOGI("Improper path %s", path); + return -1; + } + + const int path_len = strlen(path); + const int exec_len = strlen(p); + if (exec_len <= 0 || exec_len > PATH_MAX || path_len <= 0 || path_len > PATH_MAX) + { + LOGI("Improper path %s", path); + return -1; + } + + strncpy(executable_name, p + 1, exec_len); + +#ifdef _SECURE_LOG + LOGI("Exec is %s", executable_name); +#endif + + if (path_len < /* '/' */ 1 + 10 + strlen("/bin/") + exec_len) + { + LOGI("Improper path %s", path); + return -1; + } + + strncpy(appid, p - strlen("bin/") - 10, 10); + + LOGI("PackageId is %s", appid); + + return 1; +} + + +int +main(int argc, char* argv[]) +{ + void* real_handle = NULL; + char* errormsg = 0; + char packageid[MAX_PACKAGEID + 1]; + char executable_name[MAX_APP_EXECUTABLE_NAME]; + char appid[MAX_APPID]; + + int (*pRealMain)(int, char* []) = NULL; + + memset(packageid, 0, sizeof(packageid)); + memset(executable_name, 0, sizeof(executable_name)); + memset(appid, 0, sizeof(appid)); + + LOGI("Initializing : argc %d, argv 0x%x.", argc, argv); + //print_args(argc, argv); + + // convert package path to packageId + get_packageid_executable_name_from_path(argv[0], packageid, executable_name); + snprintf(appid, MAX_APPID, "%s.%s", packageid, executable_name); + +#ifdef _SECURE_LOG + LOGI("app is %s", appid); +#endif + + if (getuid() == 0) + { + // self caging + osp_do_pre_exe(argv[0]); + + // do not adjust privilege : root for system services + } + + + // initialize appid + appinfo_init(appid, 0); + appinfo_set_argv(argc, argv); + + // actual loading + char buffer[1024]; + + snprintf(buffer, 1024, "%s.exe", argv[0]); + + + real_handle = dlopen(buffer, RTLD_LAZY); + if (!real_handle) + { + LOGE("Failed to open %s : %s.", buffer, dlerror()); + return -1; + } + + void (*pAppInfoInit)() = NULL; + pAppInfoInit = (void (*)()) dlsym(real_handle, "AppInfo_Update"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to find InitAppInfo() : %s.", errormsg); + dlclose(real_handle); + fprintf(stderr, "executable does not have proper osp library dependency.\n"); + return -1; + } + + pRealMain = (int (*)(int, char*[])) dlsym(real_handle, "OspMain"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to find OspMain() : %s.", errormsg); + dlclose(real_handle); + return -1; + } + + // actual initialization + (*pAppInfoInit)(); + (*pRealMain)(argc, argv); + + LOGI("Osp application terminates."); + + //dlclose(real_handle); + LOGI("Osp cleanup finished for %s.", argv[0]); + + return 0; +} + diff --git a/osp-ui-app-loader/CMakeLists.txt b/osp-ui-app-loader/CMakeLists.txt new file mode 100644 index 0000000..c111f52 --- /dev/null +++ b/osp-ui-app-loader/CMakeLists.txt @@ -0,0 +1,17 @@ +SET (this_target osp-ui-app-loader) + +SET (${this_target}_SOURCE_FILES + uiapp_loader.c + ) + +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +SET(CMAKE_C_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS} -fPIE") + +TARGET_LINK_LIBRARIES(${this_target} "-Wl,--no-undefined -Wl,--as-needed -pie") +TARGET_LINK_LIBRARIES(${this_target} "-ldl") +TARGET_LINK_LIBRARIES(${this_target} ${pkgs_LDFLAGS}) + +INSTALL(TARGETS ${this_target} DESTINATION ${LIB_INSTALL_DIR}/osp) + + diff --git a/osp-ui-app-loader/uiapp_loader.c b/osp-ui-app-loader/uiapp_loader.c new file mode 100644 index 0000000..85bda97 --- /dev/null +++ b/osp-ui-app-loader/uiapp_loader.c @@ -0,0 +1,295 @@ +// +// Open Service Platform +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** +* @file uiapp_loader.c +* @brief This is the implementation for the osp-ui-app-loader. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#undef LOG_TAG +#define LOG_TAG "LOADER" + +#define MAX_PACKAGEID 10 +#define MAX_APP_EXECUTABLE_NAME 230 +#define MAX_APPID (MAX_PACKAGEID + MAX_APP_EXECUTABLE_NAME + 1) + + +static const char APPFW_SONAME[] = "libosp-appfw.so.1"; + + +#if 0 +static void +print_args(int argc, char* argv[]) +{ + const char* p = NULL; + int i = 0; + for (; i < argc; i++) + { + p = argv[i]; + LOGD("%dth arg : [%s]", i, p); + } +} +#endif + +static void +adjust_privilege(const char* appid) +{ + set_privilege(appid); +} + +extern int capset(cap_user_header_t hdrp, const cap_user_data_t datap); + +static int +adjust_capability(void) +{ + cap_user_header_t head = 0; + cap_user_data_t data = 0; + + head = (cap_user_header_t) malloc(sizeof(*head)); + if (head == NULL) + { + fprintf(stderr, "Memory allocation failure.\n"); + return -1; + } + + head->version = _LINUX_CAPABILITY_VERSION; + head->pid = getpid(); + + data = (cap_user_data_t) calloc(sizeof(*data), _LINUX_CAPABILITY_U32S); + if (data == NULL) + { + fprintf(stderr, "Memory allocation failure.\n"); + + free(head); + return -1; + } + + data[CAP_TO_INDEX(CAP_NET_RAW)].effective |= CAP_TO_MASK(CAP_NET_RAW); + data[CAP_TO_INDEX(CAP_NET_RAW)].permitted |= CAP_TO_MASK(CAP_NET_RAW); + + if (capset(head, data) < 0) + { + fprintf(stderr, "Capability setting error\n"); + + free(data); + free(head); + return -1; + } + + free(data); + free(head); + + return 0; +} + +static int +osp_do_pre_exe(const char* app_id, const char* bin_path) +{ + int ret = 0; + void* handle = NULL; + char* errormsg = 0; + int (*do_pre_exec_fn)(const char*, const char*) = NULL; + + handle = dlopen("libosp-env-config.so", RTLD_LAZY | RTLD_LOCAL); + if (!handle) + { + LOGE("Failed to dlopen osp-env-config.so (%s)", dlerror()); + return -1; + } + LOGD("dlopen() ok"); + + do_pre_exec_fn = (int (*)(const char*, const char*)) dlsym(handle, "do_pre_exec"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to dlsym() (%s)", errormsg); + dlclose(handle); + return -1; + } + LOGD("dlsym() ok"); + + ret = do_pre_exec_fn(app_id, bin_path); + if (ret < 0) + { + LOGE("Failed to do_pre_exe() (%d)", ret); + } + LOGD("do_pre_exec() ok"); + + dlclose(handle); + + return 0; +} + +static int +get_packageid_executable_name_from_path(const char path[], char packageid[], char executable_name[]) +{ + // path is ".../[packageid]/bin/[executable_name]" + + const char* p = strrchr(path, '/'); + if (p == NULL) + { + LOGI("Improper path %s", path); + return -1; + } + + const int path_len = strlen(path); + const int exec_len = strlen(p); + if (exec_len <= 0 || exec_len > PATH_MAX || path_len <= 0 || path_len > PATH_MAX) + { + LOGI("Improper path %s", path); + return -1; + } + + strncpy(executable_name, p + 1, exec_len); + +#ifdef _SECURE_LOG + LOGI("Exec is %s", executable_name); +#endif + + if (path_len < /* '/' */ 1 + 10 + strlen("/bin/") + exec_len) + { + LOGI("Improper path %s", path); + return -1; + } + + strncpy(packageid, p - strlen("bin/") - 10, 10); + + LOGI("PackageId is %s", packageid); + + return 1; +} + + +int +main(int argc, char* argv[]) +{ + void* handle = NULL; + char* errormsg = 0; + const char* pid = NULL; + + LOGI("Initializeing : argc %d, argv 0x%x.", argc, argv); + //print_args(argc, argv); + + if (appinfo_is_initialized() == 0) + { + // not initialized + char packageid[MAX_PACKAGEID + 1]; + char executable_name[MAX_APP_EXECUTABLE_NAME]; + char appid[MAX_APPID]; + + memset(packageid, 0, sizeof(packageid)); + memset(executable_name, 0, sizeof(executable_name)); + memset(appid, 0, sizeof(appid)); + + // convert package path to package name + get_packageid_executable_name_from_path(argv[0], packageid, executable_name); + snprintf(appid, MAX_APPID, "%s.%s", packageid, executable_name); + + // initialize appid + appinfo_init(appid, 0); + + LOGI("Non-preloading initialization done."); + } + + pid = appinfo_get_appid(); + +#ifdef _SECURE_LOG + LOGI("app is %s", pid); +#endif + + if (getuid() == 0) + { + // self caging + osp_do_pre_exe(pid, argv[0]); + + // adjust privilege + adjust_privilege(pid); + } + + + adjust_capability(); + + appinfo_set_argv(argc, argv); + + // actual loading + char buffer[1024]; + + snprintf(buffer, 1024, "%s.exe", argv[0]); + + + void* so_handle = dlopen(APPFW_SONAME, RTLD_LAZY); + if (!so_handle) + { + LOGE("Failed to open framework : %s.", dlerror()); + return -1; + } + + void (*pAppInfoInit)() = NULL; + pAppInfoInit = (void (*)()) dlsym(so_handle, "AppInfo_Update"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to find InitAppInfo() : %s.", errormsg); + fprintf(stderr, "Improper osp library entry : %s.\n", errormsg); + dlclose(so_handle); + return -1; + } + + handle = dlopen(buffer, RTLD_LAZY | RTLD_GLOBAL); + if (!handle) + { + LOGE("Failed to open %s : %s.", buffer, dlerror()); + dlclose(so_handle); + return -1; + } + + int (*pRealMain)(int, char* []) = NULL; + pRealMain = (int (*)(int, char*[])) dlsym(handle, "OspMain"); + errormsg = dlerror(); + if (errormsg != NULL) + { + LOGE("Failed to find OspMain() : %s.", errormsg); + dlclose(handle); + dlclose(so_handle); + return -1; + } + + // actual initialization + (*pAppInfoInit)(); + (*pRealMain)(argc, argv); + + LOGI("Osp application terminates."); + + dlclose(handle); + LOGI("Osp cleanup finished for %s.", argv[0]); + + return 0; +} + diff --git a/packaging/osp-loader.spec b/packaging/osp-loader.spec new file mode 100644 index 0000000..4c98a81 --- /dev/null +++ b/packaging/osp-loader.spec @@ -0,0 +1,59 @@ +Name: osp-loader +Summary: osp application loader +Version: 1.2.2.1 +Release: 2 +Group: TO_BE/FILLED_IN +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(appinfo) >= 0.1.0 +BuildRequires: pkgconfig(libprivilege-control) + +# runtime requires +Requires: osp-env-config + +%description +osp application loader + +%prep +%setup -q + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` + +%ifarch %{ix86} + ARCH=x86 + CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_X86_" + %if 0%{?simulator} + CXXFLAGS="$CXXFLAGS -D_OSP_EMUL_" + %endif +%else + ARCH=arm + CXXFLAGS="-O2 -g -pipe -Wall -fno-exceptions -Wformat -Wformat-security -Wl,--as-needed -fmessage-length=0 -march=armv7-a -mtune=cortex-a8 -mlittle-endian -mfpu=neon -mfloat-abi=softfp -D__SOFTFP__ -mthumb -Wa,-mimplicit-it=thumb -funwind-tables -D_OSP_DEBUG_ -D_OSP_ARMEL_" +%endif + +%if 0%{?tizen_build_binary_release_type_eng} + CXXFLAGS="$CXXFLAGS -D_SECURE_LOG" +%endif + +%cmake . + +# Call make instruction with smp support +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}/usr/share/license +cp %{_builddir}/%{name}-%{version}/LICENSE.APLv2 %{buildroot}/usr/share/license/%{name} + +%make_install + +mkdir -p %{buildroot}/opt/usr/apps + +%files +%manifest osp-loader.manifest +/usr/share/license/%{name} +%{_libdir}/osp/* +/opt/usr/apps + -- 2.7.4