From 214554b69cbf4b42c8a003eb51b6efc0332edc67 Mon Sep 17 00:00:00 2001 From: Aleksander Zdyb Date: Wed, 29 Jan 2014 15:20:04 +0100 Subject: [PATCH 01/16] Rewrite Makefile as CMakeLists.txt FunctionFS transport can be enabled by passing -DUSE_FUNCTION_FS to cmake. Unit tests building can be enabled by passing -DBUILD_UNIT_TESTS to cmake Signed-off-by: Aleksander Zdyb Change-Id: Ia4f394ab301a74b83e5846ba19931f0637f0d241 --- CMakeLists.txt | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 55 ---------------------------- packaging/sdbd.spec | 2 ++ test/CMakeLists.txt | 40 +++++++++++++++++++++ 4 files changed, 143 insertions(+), 55 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 Makefile create mode 100644 test/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c112d31 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,101 @@ +# Copyright (c) 2014 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. + + +cmake_minimum_required (VERSION 2.8.3) +project (sdbd) + +option(USE_FUNCTION_FS "Use FunctionFS" NO) +option(BUILD_UNIT_TESTS "Build unit tests" NO) + +set(sdbd_SRCS + src/sdb.c + src/fdevent.c + src/transport.c + src/transport_local.c + src/transport_usb.c + src/sockets.c + src/services.c + src/file_sync_service.c + src/utils.c + src/socket_inaddr_any_server.c + src/socket_local_client.c + src/socket_local_server.c + src/socket_loopback_client.c + src/socket_loopback_server.c + src/socket_network_client.c + src/properties.c + src/sdktools.c + src/strutils.c + src/libsmack.c + src/init.c + src/fileutils.c + src/commandline_sdbd.c +) + +include_directories(src) + +if(USE_FUNCTION_FS) + list(APPEND sdbd_SRCS src/usb_funcfs_client.c) +else() + list(APPEND sdbd_SRCS src/usb_linux_client.c) +endif() + +add_executable(sdbd ${sdbd_SRCS}) + +set_property( + TARGET sdbd + PROPERTY COMPILE_DEFINITIONS + SDB_HOST=0 + _DROP_PRIVILEGE + _FILE_OFFSET_BITS=64 +) + +set_property( + TARGET sdbd + APPEND PROPERTY COMPILE_DEFINITIONS + _XOPEN_SOURCE + _GNU_SOURCE + HAVE_FORKEXEC +) + +if(USE_FUNCTION_FS) + set_property( + TARGET sdbd + APPEND PROPERTY COMPILE_DEFINITIONS + USB_FUNCFS + ) +endif() + +include(FindPkgConfig) + +# Get capi-system-info +pkg_check_modules(CAPI_SYSTEM_INFO REQUIRED capi-system-info) +include_directories(${CAPI_SYSTEM_INFO_INCLUDE_DIRS}) + +# Get pthreads +find_package(Threads REQUIRED) + +# Add libraries (-l...) +target_link_libraries (sdbd ${CMAKE_THREAD_LIBS_INIT} ${CAPI_SYSTEM_INFO_LDFLAGS}) + +install(TARGETS sdbd DESTINATION /usr/sbin) +install(FILES script/sdbd DESTINATION /etc/init.d) + + +# Optionally build unit tests binary -- could be helpful during further development +if(BUILD_UNIT_TESTS) + enable_testing() + add_subdirectory(test) +endif() diff --git a/Makefile b/Makefile deleted file mode 100644 index 6fef698..0000000 --- a/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# -# -# Makefile for sdbd -# - -SDBD_SRC_FILES := \ - src/sdb.c \ - src/fdevent.c \ - src/transport.c \ - src/transport_local.c \ - src/transport_usb.c \ - src/sockets.c \ - src/services.c \ - src/file_sync_service.c \ - src/usb_linux_client.c \ - src/utils.c \ - src/socket_inaddr_any_server.c \ - src/socket_local_client.c \ - src/socket_local_server.c \ - src/socket_loopback_client.c \ - src/socket_loopback_server.c \ - src/socket_network_client.c \ - src/properties.c \ - src/sdktools.c \ - src/strutils.c \ - src/libsmack.c \ - src/init.c \ - src/fileutils.c \ - src/commandline_sdbd.c - -SDBD_CFLAGS := -O2 -g -DSDB_HOST=0 -Wall -Wno-unused-parameter -SDBD_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -SDBD_CFLAGS += -DHAVE_FORKEXEC -fPIE -D_DROP_PRIVILEGE -D_FILE_OFFSET_BITS=64 -SDBD_LFLAGS := -lcapi-system-info -IFLAGS := -Iinclude -Isrc -I/usr/include/system -OBJDIR := bin -INSTALLDIR := usr/sbin -INITSCRIPTDIR := etc/init.d - -MODULE := sdbd - -all : $(MODULE) - -sdbd : $(SDBD_SRC_FILES) - mkdir -p $(OBJDIR) - $(CC) -pthread -o $(OBJDIR)/$(MODULE) $(SDBD_CFLAGS) $(IFLAGS) $(SDBD_SRC_FILES) $(SDBD_LFLAGS) - -install : - mkdir -p $(DESTDIR)/$(INSTALLDIR) - install $(OBJDIR)/$(MODULE) $(DESTDIR)/$(INSTALLDIR)/$(MODULE) - mkdir -p $(DESTDIR)/$(INITSCRIPTDIR) - install script/sdbd $(DESTDIR)/$(INITSCRIPTDIR)/sdbd - -clean : - rm -rf $(OBJDIR)/* diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index c6a8de4..d565618 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -11,6 +11,7 @@ Source1002: sdbd_emulator.service Source1003: %{name}.manifest BuildRequires: capi-system-info-devel >= 0.2.0 +BuildRequires: cmake >= 2.8.3 Requires: sys-assert Requires: dbus @@ -23,6 +24,7 @@ Description: SDB daemon. cp %{SOURCE1003} . %build +%cmake make %{?jobs:-j%jobs} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..ddc80ad --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,40 @@ +# Copyright (c) 2014 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. + + +cmake_minimum_required (VERSION 2.8.3) +project (sdbd_tests) + +include(FindPkgConfig) +pkg_check_modules(CHECK check>=0.9.8 REQUIRED) + +enable_testing() + +add_executable(sdbd_tests ../src/commandline_sdbd.c test_commandline_sdbd.c) + +set_property( + TARGET sdbd_tests + APPEND PROPERTY COMPILE_DEFINITIONS + _XOPEN_SOURCE + _GNU_SOURCE +) + +include_directories(../src) + +include_directories(${CHECK_INCLUDE_DIRS}) +target_link_libraries (sdbd_tests ${CHECK_LDFLAGS}) + +add_test(InternalUnitTests sdbd_tests) +set_tests_properties(InternalUnitTests PROPERTIES + PASS_REGULAR_EXPRESSION "100%: Checks: [0-9]+, Failures: 0, Errors: 0") -- 2.7.4 From f43ef3885270ab68a339fdee8754e3b3d24cdc27 Mon Sep 17 00:00:00 2001 From: Mikko Ylinen Date: Wed, 5 Feb 2014 06:39:28 +0200 Subject: [PATCH 02/16] Remove sys-assert dependency sys-assert controls how core dumps are handled in the system. It provides a system/image wide capability. Product images might choose not to install it or they might prefer an alternative core dump service (e.g., systemd coredump). Therefore, individual packages should not explicitly depend on sys-assert. Change-Id: Icd83879a9f676464c2fae4f06676c7e8fabd53e6 Signed-off-by: Mikko Ylinen --- packaging/sdbd.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index d565618..46de0bf 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -12,7 +12,6 @@ Source1003: %{name}.manifest BuildRequires: capi-system-info-devel >= 0.2.0 BuildRequires: cmake >= 2.8.3 -Requires: sys-assert Requires: dbus %description -- 2.7.4 From b4d305e5e1cefa42d3300f7601493bce58f9c107 Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Thu, 20 Feb 2014 22:03:15 +0900 Subject: [PATCH 03/16] Version up to 3.0.1 to add the following changes: - Remove sys-assert dependency - Rewrite Makefile as CMakeLists.txt - Initial support for FunctionFS - Parse commandline of sdbd and make use of values provided Signed-off-by: yoonki.park Change-Id: Iafa2e549047b6b49e34ba785a210e8912e4f4ffc --- packaging/sdbd.changes | 2 ++ packaging/sdbd.spec | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packaging/sdbd.changes b/packaging/sdbd.changes index fc078af..b923b27 100644 --- a/packaging/sdbd.changes +++ b/packaging/sdbd.changes @@ -1,3 +1,5 @@ +* Thu Feb 20 2014 Yoonki Park +- Version up to 3.0.1 * Thu Oct 31 2013 Junfeng Dong submit/tizen/20131011.084016@81e3d5b - Fix some runtime issue in 3.0 diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 46de0bf..2ae0f51 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -1,6 +1,6 @@ Name: sdbd Summary: SDB daemon -Version: 3.0.0 +Version: 3.0.1 Release: 0 License: Apache-2.0 Summary: SDB daemon -- 2.7.4 From ebdc294f10aa206edc8ed3fd4192cdaaef0b0952 Mon Sep 17 00:00:00 2001 From: Aleksander Zdyb Date: Fri, 7 Mar 2014 12:52:17 +0100 Subject: [PATCH 04/16] Add --usage/--help commandline options Change-Id: I22581e04b24bbad6ee587fc93b91a89506fc4f8b Signed-off-by: Aleksander Zdyb --- src/commandline_sdbd.c | 27 ++++++++++++++ src/commandline_sdbd.h | 17 +++++++++ src/sdb.c | 21 ++++++++++- test/test_commandline_sdbd.c | 87 ++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 142 insertions(+), 10 deletions(-) diff --git a/src/commandline_sdbd.c b/src/commandline_sdbd.c index ccf75f2..f1c3f55 100644 --- a/src/commandline_sdbd.c +++ b/src/commandline_sdbd.c @@ -47,6 +47,8 @@ int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[ { ARG_SENSORS, required_argument, NULL, ARG_S_SENSORS }, { ARG_SDB, required_argument, NULL, ARG_S_SDB }, { ARG_SDBD_LISTEN_PORT, required_argument, NULL, ARG_S_SDBD_LISTEN_PORT }, + { ARG_HELP, no_argument, NULL, ARG_S_HELP }, + { ARG_USAGE, no_argument, NULL, ARG_S_USAGE }, { NULL, 0, NULL, 0 } }; @@ -83,6 +85,10 @@ int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[ return SDBD_COMMANDLINE_FAILURE; } break; + case ARG_S_HELP: + return SDBD_COMMANDLINE_HELP; + case ARG_S_USAGE: + return SDBD_COMMANDLINE_USAGE; case 1: return SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT; case '?': @@ -140,3 +146,24 @@ void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args) { memset(sdbd_args, 0, sizeof(SdbdCommandlineArgs)); } + + +void print_sdbd_usage_message(FILE *stream) { + const char *format = "Usage sdbd [OPTION]...\n" + "\t-%c, --%s=HOST:PORT\temulator's name and forward port\n" + "\t-%c, --%s=HOST:PORT\thostname or IP and port of sdb listening on host\n" + "\t-%c, --%s=HOST:PORT \thostname or IP and port of sensors daemon\n" + "\t-%c, --%s=PORT \tport on which sdbd shall be listening on\n" + "\t-%c, --%s \tprint help message\n" + "\t-%c, --%s \tprint this usage message\n" + ; + + fprintf(stream, format, + ARG_S_EMULATOR_VM_NAME, ARG_EMULATOR_VM_NAME, + ARG_S_SDB, ARG_SDB, + ARG_S_SENSORS, ARG_SENSORS, + ARG_S_SDBD_LISTEN_PORT, ARG_SDBD_LISTEN_PORT, + ARG_S_HELP, ARG_HELP, + ARG_S_USAGE, ARG_USAGE + ); +} diff --git a/src/commandline_sdbd.h b/src/commandline_sdbd.h index 9b070ad..598b478 100644 --- a/src/commandline_sdbd.h +++ b/src/commandline_sdbd.h @@ -29,9 +29,17 @@ #define ARG_SENSORS "sensors" #define ARG_S_SENSORS 's' +#define ARG_HELP "help" +#define ARG_S_HELP 'h' + +#define ARG_USAGE "usage" +#define ARG_S_USAGE 'u' + #define SDBD_COMMANDLINE_SUCCESS 0 ///< Success #define SDBD_COMMANDLINE_FAILURE -1 ///< Generic failure #define SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT -2 ///< Unknown option +#define SDBD_COMMANDLINE_HELP 1 ///< Help request +#define SDBD_COMMANDLINE_USAGE 2 ///< Usage message request /*! * @struct HostPort @@ -53,6 +61,7 @@ typedef struct { int sdbd_port; ///< Port to listen on in tcp mode } SdbdCommandlineArgs; +#include /*! * @fn int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[]) @@ -95,4 +104,12 @@ void apply_sdbd_commandline_defaults(SdbdCommandlineArgs *sdbd_args); */ void clear_sdbd_commandline_args(SdbdCommandlineArgs *sdbd_args); +/*! + * @fn void print_usage_message(FILE *stream) + * @brief Prints usage message to specified \stream + * + * @param stream Stream to print to + */ +void print_sdbd_usage_message(FILE *stream); + #endif /* COMMANDLINE_SDBD_H */ diff --git a/src/sdb.c b/src/sdb.c index 42383d0..d61cdc0 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1603,6 +1603,25 @@ int main(int argc, char **argv) recovery_mode = 1; } #endif + + apply_sdbd_commandline_defaults(&sdbd_commandline_args); + int parse_ret = parse_sdbd_commandline(&sdbd_commandline_args, argc, argv); + + // TODO: Add detailed error messages + // TODO: Add individual messages for help and usage + if(parse_ret != SDBD_COMMANDLINE_SUCCESS) { + if (parse_ret == SDBD_COMMANDLINE_HELP + || parse_ret == SDBD_COMMANDLINE_USAGE) { + // User requested help or usage + print_sdbd_usage_message(stdout); + return EXIT_SUCCESS; + } + + // Print usage message because of invalid options + print_sdbd_usage_message(stderr); + return EXIT_FAILURE; + } + #if !SDB_HOST if (daemonize() < 0) fatal("daemonize() failed: %.200s", strerror(errno)); @@ -1613,8 +1632,6 @@ int main(int argc, char **argv) //sdbd will never die on emulator! signal(SIGTERM, handle_sig_term); /* tizen specific */ - apply_sdbd_commandline_defaults(&sdbd_commandline_args); - parse_sdbd_commandline(&sdbd_commandline_args, argc, argv); return sdb_main(0, DEFAULT_SDB_PORT); #endif } diff --git a/test/test_commandline_sdbd.c b/test/test_commandline_sdbd.c index 8d332f5..4dd67e8 100644 --- a/test/test_commandline_sdbd.c +++ b/test/test_commandline_sdbd.c @@ -64,6 +64,10 @@ print_nullable((hp)->host), (hp)->port, print_nullable(h), (p))) +#define array_size(a) \ + (sizeof(a) / sizeof((a)[0])) + + void setup(void) { } @@ -73,8 +77,8 @@ void teardown(void) { } -START_TEST(test_ok) { - char *argv[] = { +START_TEST(test_all_opts) { + char *test_argv[] = { "./test", "--emulator=tizen:101", "--listen-port=101", @@ -85,7 +89,7 @@ START_TEST(test_ok) { SdbdCommandlineArgs sdbd_args = {0}; apply_sdbd_commandline_defaults(&sdbd_args); - int parse_res = parse_sdbd_commandline(&sdbd_args, 5, argv); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); if (parse_res != SDBD_COMMANDLINE_SUCCESS) { ck_abort_msg("parsing commandline failed"); @@ -101,13 +105,13 @@ START_TEST(test_ok) { START_TEST(test_empty) { - char *argv[] = { + char *test_argv[] = { "./test" }; SdbdCommandlineArgs sdbd_args = {0}; - int parse_res = parse_sdbd_commandline(&sdbd_args, 1, argv); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); if (parse_res != SDBD_COMMANDLINE_SUCCESS) { ck_abort_msg("parsing commandline failed"); @@ -125,7 +129,7 @@ START_TEST(test_empty) { START_TEST(test_unknown) { - char *argv[] = { + char *test_argv[] = { "./test", "--emulator=tizen:26101", "--unknown=true" @@ -133,7 +137,7 @@ START_TEST(test_unknown) { SdbdCommandlineArgs sdbd_args = {0}; - int parse_res = parse_sdbd_commandline(&sdbd_args, 3, argv); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); if (parse_res != SDBD_COMMANDLINE_FAILURE_UNKNOWN_OPT) { ck_abort_msg("parsing commandline failed"); @@ -181,17 +185,84 @@ START_TEST(test_default_args) { } END_TEST +START_TEST(test_usage_message) { + FILE *stream; + char *buffer = NULL; + size_t buf_len = 0; + + stream = open_memstream(&buffer, &buf_len); + print_sdbd_usage_message(stream); + fclose(stream); + + // Just check if all options are mentioned in usage message + ck_assert(strstr(buffer, "--"ARG_EMULATOR_VM_NAME) != NULL); + ck_assert(strstr(buffer, "--"ARG_SDBD_LISTEN_PORT) != NULL); + ck_assert(strstr(buffer, "--"ARG_SDB) != NULL); + ck_assert(strstr(buffer, "--"ARG_SENSORS) != NULL); + ck_assert(strstr(buffer, "--"ARG_HELP) != NULL); + ck_assert(strstr(buffer, "--"ARG_USAGE) != NULL); + + free(buffer); +} END_TEST + +START_TEST(test_usage) { + char *test_argv[] = { + "./test", + "--usage" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_USAGE); + +} END_TEST + + +START_TEST(test_help) { + char *test_argv[] = { + "./test", + "--help" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_HELP); + +} END_TEST + + +START_TEST(test_help_other_opt) { + char *test_argv[] = { + "./test", + "--listen-port=1234", + "--help" + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + ck_assert_int_eq(parse_res, SDBD_COMMANDLINE_HELP); + +} END_TEST + + Suite *sdbd_commandline_suite (void) { Suite *s = suite_create ("sdbd commandline"); TCase *tc_core = tcase_create ("Core"); tcase_add_checked_fixture(tc_core, setup, teardown); - tcase_add_test (tc_core, test_ok); + tcase_add_test (tc_core, test_all_opts); tcase_add_test (tc_core, test_empty); tcase_add_test (tc_core, test_unknown); tcase_add_test (tc_core, test_clear_args); tcase_add_test (tc_core, test_double_clear); tcase_add_test (tc_core, test_default_args); + tcase_add_test (tc_core, test_usage_message); + tcase_add_test (tc_core, test_usage); + tcase_add_test (tc_core, test_help); + tcase_add_test (tc_core, test_help_other_opt); suite_add_tcase (s, tc_core); return s; -- 2.7.4 From 6dd84c71258d3414e53a37ac791f92e455611050 Mon Sep 17 00:00:00 2001 From: "Sabera Djelti (sdi2)" Date: Tue, 25 Feb 2014 15:17:24 +0100 Subject: [PATCH 05/16] Remove hardcoded path for multiuser support Change-Id: I40fbc04ea408f7e044ada515b6c0b17c6ad2ee41 Bug-Tizen: PTREL-725 Signed-off-by: Sabera Djelti (sdi2) --- CMakeLists.txt | 2 +- packaging/sdbd.spec | 6 ++++-- script/sdk_launch | 9 +++++---- src/commandline.c | 3 ++- src/file_sync_service.c | 15 +++++++++++++++ src/file_sync_service.h | 2 +- src/sdb.c | 17 ++++++++++------- src/sdb.h | 5 +++-- src/sdktools.c | 15 +++++++++++++++ src/sdktools.h | 11 +++++++---- src/services.c | 4 ++-- 11 files changed, 65 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c112d31..1928023 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,7 @@ endif() include(FindPkgConfig) # Get capi-system-info -pkg_check_modules(CAPI_SYSTEM_INFO REQUIRED capi-system-info) +pkg_check_modules(CAPI_SYSTEM_INFO REQUIRED capi-system-info libtzplatform-config) include_directories(${CAPI_SYSTEM_INFO_INCLUDE_DIRS}) # Get pthreads diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 2ae0f51..d193ec5 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -12,8 +12,10 @@ Source1003: %{name}.manifest BuildRequires: capi-system-info-devel >= 0.2.0 BuildRequires: cmake >= 2.8.3 +BuildRequires: pkgconfig(libtzplatform-config) Requires: dbus - +Requires: debug-launchpad +Requires(post): /usr/bin/debug_launchpad_preloading_preinitializing_daemon %description Description: SDB daemon. @@ -48,7 +50,7 @@ install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %defattr(-,root,root,-) %{_prefix}/sbin/sdbd %{_prefix}/sbin/sdk_launch -%{_sysconfdir}/init.d/sdbd +%attr(0755, root, root) %{_sysconfdir}/init.d/sdbd %{_libdir}/systemd/system/sdbd.service %if 0%{?simulator} %{_libdir}/systemd/system/emulator.target.wants/sdbd.service diff --git a/script/sdk_launch b/script/sdk_launch index 2166781..0c01f1b 100755 --- a/script/sdk_launch +++ b/script/sdk_launch @@ -4,9 +4,10 @@ # Kangho Kim , Yoonki Park # # Description: front hand of app launcher +source /etc/tizen-platform.conf -APP_PATH_PREFIX=/opt/apps -SDK_TOOLS_PATH=/home/developer/sdk_tools +APP_PATH_PREFIX=${TZ_SYS_RW_APP} +SDK_TOOLS_PATH=${TZ_SDK_TOOLS} print_usage() { @@ -115,7 +116,7 @@ then if [ "" != "$attach_id" ] #debug attach then - cmd="$COV_TEST_PREFIX /home/developer/sdk_tools/gdbserver/gdbserver :$port --attach $attach_id" + cmd="$COV_TEST_PREFIX ${TZ_SDK_TOOLS}/gdbserver/gdbserver :$port --attach $attach_id" #debug else if [ "" != "$result_mode" ] @@ -125,7 +126,7 @@ then result_mode="DEBUG" fi cmd="/usr/bin/launch_app $pkgid.$exe __AUL_SDK__ $result_mode __DLP_DEBUG_ARG__ :$port $launch_app_mode" -# cmd="$COV_TEST_PREFIX /home/developer/sdk_tools/gdbserver/gdbserver :$port /opt/apps/$pkgid/bin/$exe" +# cmd="$COV_TEST_PREFIX ${TZ_SDK_TOOLS}/gdbserver/gdbserver :$port ${TZ_SYS_RW_APP}/$pkgid/bin/$exe" fi else if [ "$mode" = "run" ] diff --git a/src/commandline.c b/src/commandline.c index 7b6f7a9..cbc6164 100644 --- a/src/commandline.c +++ b/src/commandline.c @@ -36,6 +36,7 @@ #include "sdb.h" #include "sdb_client.h" #include "file_sync_service.h" +#include static int do_cmd(transport_type ttype, char* serial, char *cmd, ...); @@ -1465,7 +1466,7 @@ int sdb_command2(const char* cmd) { int install_app_sdb(const char *srcpath) { D("Install start\n"); - const char * APP_DEST = "/opt/apps/PKGS/%s"; + const char * APP_DEST = tzplatform_mkpath(TZ_SYS_RW_APP,"PKGS/%s"); const char* filename = sdb_dirstop(srcpath); char destination[PATH_MAX]; diff --git a/src/file_sync_service.c b/src/file_sync_service.c index 1c953cd..64a482d 100644 --- a/src/file_sync_service.c +++ b/src/file_sync_service.c @@ -28,6 +28,7 @@ #include #include "sysdeps.h" #include "smack.h" +#include #define TRACE_TAG TRACE_SYNC #include "sdb.h" @@ -36,6 +37,9 @@ #define SYNC_TIMEOUT 15 +#define APP_INSTALL_PATH_PREFIX1 tzplatform_getenv(TZ_SYS_RW_APP) +#define APP_INSTALL_PATH_PREFIX2 tzplatform_getenv(TZ_USER_APP) + struct sync_permit_rule { const char *name; @@ -56,6 +60,13 @@ struct sync_permit_rule sdk_sync_permit_rule[] = { */ #define DIR_PERMISSION 0777 +void init_sdk_sync_permit_rule_regx(void) +{ + asprintf(&sdk_sync_permit_rule[0].regx, "^((/tmp)|(%s)|(%s))/[a-zA-Z0-9]{10}/data/[a-zA-Z0-9_\\-]{1,50}\\.xml$", APP_INSTALL_PATH_PREFIX1, APP_INSTALL_PATH_PREFIX2); + asprintf(&sdk_sync_permit_rule[1].regx, "^((/tmp)|(%s)|(%s))/[a-zA-Z0-9]{10}/data/+(.)*\\.gcda$", APP_INSTALL_PATH_PREFIX1, APP_INSTALL_PATH_PREFIX2); + asprintf(&sdk_sync_permit_rule[2].regx, "da", "^(/tmp/da/)*+[a-zA-Z0-9_\\-\\.]{1,50}\\.png$"); + +} static void set_syncfile_smack_label(char *src) { char *label_transmuted = NULL; @@ -486,6 +497,7 @@ static int verify_sync_rule(const char* path) { char buf[PATH_MAX]; int i=0; + init_sdk_sync_permit_rule_regx(); for (i=0; sdk_sync_permit_rule[i].regx != NULL; i++) { ret = regcomp(®ex, sdk_sync_permit_rule[i].regx, REG_EXTENDED); if(ret){ @@ -505,6 +517,9 @@ static int verify_sync_rule(const char* path) { } } regfree(®ex); + for (i = 0; i <= 3; i++){ + free(sdk_sync_permit_rule[i].regx); + } return 0; } diff --git a/src/file_sync_service.h b/src/file_sync_service.h index 68059da..61b462a 100644 --- a/src/file_sync_service.h +++ b/src/file_sync_service.h @@ -75,7 +75,7 @@ typedef union { } status; } syncmsg; - +void init_sdk_sync_permit_rule_regx(void); void file_sync_service(int fd, void *cookie); void file_sync_subproc(int fd, void *cookie); int do_sync_ls(const char *path); diff --git a/src/sdb.c b/src/sdb.c index d61cdc0..9029619 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -27,7 +27,7 @@ #include #include #include - +#include #include "sysdeps.h" #include "sdb.h" @@ -49,7 +49,8 @@ SDB_MUTEX_DEFINE( D_lock ); #endif int HOST = 0; - +#define HOME_DEV_PATH tzplatform_getenv(TZ_SDK_HOME) +#define DEV_NAME tzplatform_getenv(TZ_SDK_USER_NAME) #if !SDB_HOST SdbdCommandlineArgs sdbd_commandline_args; #endif @@ -1110,19 +1111,21 @@ int set_developer_privileges() { return -1; } - if (chdir("/home/developer") < 0) { - D("sdbd: unable to change working directory to /home/developer\n"); + if (chdir(HOME_DEV_PATH) < 0) { + D("sdbd: unable to change working directory to %s\n", HOME_DEV_PATH); } else { if (chdir("/") < 0) { D("sdbd: unable to change working directory to /\n"); } } // TODO: use pam later - putenv("HOME=/home/developer"); + char * env = "HOME="; + strcat(env, HOME_DEV_PATH); + putenv(env); return 1; } -#define ONDEMAND_ROOT_PATH "/home/developer" +#define ONDEMAND_ROOT_PATH tzplatform_getenv(TZ_SDK_HOME) static void execute_required_process() { @@ -1166,7 +1169,7 @@ static void init_sdk_requirements() { } if (st.st_uid != SID_DEVELOPER || st.st_gid != SID_DEVELOPER) { char cmd[128]; - snprintf(cmd, sizeof(cmd), "chown developer:developer %s -R", ONDEMAND_ROOT_PATH); + snprintf(cmd, sizeof(cmd), "chown %s:%s %s -R", DEV_NAME, DEV_NAME, ONDEMAND_ROOT_PATH); if (system(cmd) < 0) { D("failed to change ownership to developer to %s\n", ONDEMAND_ROOT_PATH); } diff --git a/src/sdb.h b/src/sdb.h index 8075d60..ccee503 100644 --- a/src/sdb.h +++ b/src/sdb.h @@ -25,6 +25,7 @@ #if !SDB_HOST #include "commandline_sdbd.h" #endif +#include #define MAX_PAYLOAD 4096 @@ -331,8 +332,8 @@ int rootshell_mode;// 0: developer, 1: root #define SID_ROOT 0 /* traditional unix root user */ #define SID_TTY 5 /* group for /dev/ptmx */ -#define SID_APP 5000 /* application */ -#define SID_DEVELOPER 5100 /* developer with SDK */ +#define SID_APP tzplatform_getuid(TZ_USER_NAME) /* application */ +#define SID_DEVELOPER tzplatform_getuid(TZ_SDK_USER_NAME) /* developer with SDK */ #define SID_APP_LOGGING 6509 #define SID_SYS_LOGGING 6527 #define SID_INPUT 1004 diff --git a/src/sdktools.c b/src/sdktools.c index c288831..e9b3ba6 100644 --- a/src/sdktools.c +++ b/src/sdktools.c @@ -36,6 +36,17 @@ struct arg_permit_rule sdk_arg_permit_rule[] = { /* end */ {NULL, NULL, 0} }; +void init_sdk_arg_permit_rule_pattern(void) +{ + asprintf(&sdk_arg_permit_rule[0].pattern, "^GCOV_PREFIX=((%s)|(%s))/[a-zA-Z0-9]{10}/data$", APP_INSTALL_PATH_PREFIX1, APP_INSTALL_PATH_PREFIX2); + asprintf(&sdk_arg_permit_rule[1].pattern, "GCOV_PREFIX_STRIP=0"); + asprintf(&sdk_arg_permit_rule[2].pattern, "LD_LIBRARY_PATH=%s/gtest/usr/lib:$LD_LIBRARY_PATH", DEV_INSTALL_PATH_PREFIX, APP_INSTALL_PATH_PREFIX2); + asprintf(&sdk_arg_permit_rule[3].pattern, "TIZEN_LAUNCH_MODE=debug"); + asprintf(&sdk_arg_permit_rule[4].pattern, "LD_PRELOAD=/usr/lib/da_probe_osp.so", DEV_INSTALL_PATH_PREFIX, APP_INSTALL_PATH_PREFIX2); + asprintf(&sdk_arg_permit_rule[5].pattern, "^\\-\\-gtest_output=xml:((%s)|(%s))/[a-zA-Z0-9]{10}/data/[a-zA-Z0-9_\\-]{1,30}\\.xml$", APP_INSTALL_PATH_PREFIX1, APP_INSTALL_PATH_PREFIX2); +} + + int verify_commands(const char *arg1) { if (arg1 != NULL) { if (verify_root_commands(arg1)) { @@ -170,6 +181,7 @@ int regcmp(const char* pattern, const char* str) { int env_verify(const char* arg) { int i; + init_sdk_arg_permit_rule_pattern(); for (i=0; sdk_arg_permit_rule[i].name != NULL; i++) { if (sdk_arg_permit_rule[i].expression == 0) { if (!strcmp(sdk_arg_permit_rule[i].pattern, arg)) { @@ -184,6 +196,9 @@ int env_verify(const char* arg) { } } D("failed to set %s\n", arg); + for (i = 0; i <= 6; i++){ + free(sdk_arg_permit_rule[i].pattern); + } return 0; } diff --git a/src/sdktools.h b/src/sdktools.h index 58f1208..de805af 100644 --- a/src/sdktools.h +++ b/src/sdktools.h @@ -4,6 +4,7 @@ #ifdef __cplusplus extern "C" { #endif +#include struct sudo_command { @@ -23,10 +24,11 @@ struct arg_permit_rule }; #define SDK_LAUNCH_PATH "/usr/sbin/sdk_launch" -#define APP_INSTALL_PATH_PREFIX1 "/opt/apps" -#define APP_INSTALL_PATH_PREFIX2 "/opt/usr/apps" -#define GDBSERVER_PATH "/home/developer/sdk_tools/gdbserver/gdbserver" -#define GDBSERVER_PLATFORM_PATH "/home/developer/sdk_tools/gdbserver-platform/gdbserver" +#define APP_INSTALL_PATH_PREFIX1 tzplatform_getenv(TZ_SYS_RW_APP) +#define APP_INSTALL_PATH_PREFIX2 tzplatform_getenv(TZ_USER_APP) +#define DEV_INSTALL_PATH_PREFIX tzplatform_getenv(TZ_SDK_TOOLS) +#define GDBSERVER_PATH tzplatform_mkpath(TZ_SDK_TOOLS,"gdbserver/gdbserver") +#define GDBSERVER_PLATFORM_PATH tzplatform_mkpath(TZ_SDK_TOOLS,"gdbserver-platform/gdbserver") #define SMACK_LEBEL_SUBJECT_PATH "/proc/self/attr/current" #define SMACK_SYNC_FILE_LABEL "*" #define APP_GROUPS_MAX 100 @@ -35,6 +37,7 @@ struct arg_permit_rule #define SDBD_LABEL_NAME "sdbd" #define SDK_HOME_LABEL_NAME "sdbd::home" +void init_sdk_arg_permit_rule_pattern(void); int verify_commands(const char *arg1); int verify_root_commands(const char *arg1); int verify_app_path(const char* path); diff --git a/src/services.c b/src/services.c index 4af9982..b5d8eab 100644 --- a/src/services.c +++ b/src/services.c @@ -40,7 +40,7 @@ #include "strutils.h" #include - +#include typedef struct stinfo stinfo; struct stinfo { @@ -238,7 +238,7 @@ void reboot_service(int fd, void *arg) #if !SDB_HOST #define EVENT_SIZE ( sizeof (struct inotify_event) ) #define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) ) -#define CS_PATH "/opt/usr/share/crash/report" +#define CS_PATH tzplatform_mkpath(TZ_USER_SHARE,"crash/report") void inoti_service(int fd, void *arg) { -- 2.7.4 From c72dc476ff38e68878de683287b888c596b2cc3f Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Thu, 27 Mar 2014 10:41:29 +0900 Subject: [PATCH 06/16] Refined pkg dependency - Removed a dependency on debug-launchpad Change-Id: I2df5fe55cda075d49217b29151c76dc0781cf4bf Signed-off-by: yoonki.park --- packaging/sdbd.spec | 2 -- src/sdb.c | 25 ------------------------- 2 files changed, 27 deletions(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index d193ec5..93b4687 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -14,8 +14,6 @@ BuildRequires: capi-system-info-devel >= 0.2.0 BuildRequires: cmake >= 2.8.3 BuildRequires: pkgconfig(libtzplatform-config) Requires: dbus -Requires: debug-launchpad -Requires(post): /usr/bin/debug_launchpad_preloading_preinitializing_daemon %description Description: SDB daemon. diff --git a/src/sdb.c b/src/sdb.c index 9029619..90f4cfa 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1127,30 +1127,6 @@ int set_developer_privileges() { } #define ONDEMAND_ROOT_PATH tzplatform_getenv(TZ_SDK_HOME) -static void execute_required_process() { - - FILE *pre_proc_file = popen("pidof debug_launchpad_preloading_preinitializing_daemon", "r"); - - if(pre_proc_file == NULL) { - D("fail to get the pidof debug_launchpad_preloading_preinitializing_daemon"); - return; - } - - int result = 0; - while(!feof(pre_proc_file)) { - int pid = 0; - result += fscanf(pre_proc_file, "%d", &pid); - if(pid > 0) { - kill(pid, SIGKILL); - } - } - D("Kill %d debug launchpad daemon", result); - - pclose(pre_proc_file); - - system("/usr/bin/debug_launchpad_preloading_preinitializing_daemon &"); -} - static void init_sdk_requirements() { struct stat st; @@ -1175,7 +1151,6 @@ static void init_sdk_requirements() { } } - execute_required_process(); } #endif /* !SDB_HOST */ -- 2.7.4 From dd36453cd662f8c092e41df373fc87fe6ac80e67 Mon Sep 17 00:00:00 2001 From: Krzysztof Opasiak Date: Mon, 24 Mar 2014 13:41:23 +0100 Subject: [PATCH 07/16] Allow sdb to listen on both usb and TCP. Fix semantic of --listen option to allow run sdb with TCP backend on real device. Add systemd target to allow run sdb with tcp backend, Change-Id: I3499ee1e90539961629ad6a5a763b99c2fb7bb6b Signed-off-by: Krzysztof Opasiak --- packaging/sdbd.spec | 4 ++++ packaging/sdbd_tcp.service | 10 ++++++++++ src/commandline_sdbd.c | 9 ++++++++- src/sdb.c | 11 ++++++----- test/test_commandline_sdbd.c | 40 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 packaging/sdbd_tcp.service diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 93b4687..a3f00d1 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -9,6 +9,7 @@ Source0: %{name}-%{version}.tar.gz Source1001: sdbd_device.service Source1002: sdbd_emulator.service Source1003: %{name}.manifest +Source1004: sdbd_tcp.service BuildRequires: capi-system-info-devel >= 0.2.0 BuildRequires: cmake >= 2.8.3 @@ -37,6 +38,7 @@ mkdir -p %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants ln -s %{_libdir}/systemd/system/sdbd.service %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants/ %else install -m 0644 %SOURCE1001 %{buildroot}%{_libdir}/systemd/system/sdbd.service +install -m 0644 %SOURCE1004 %{buildroot}%{_libdir}/systemd/system/sdbd_tcp.service %endif mkdir -p %{buildroot}%{_prefix}/sbin @@ -52,6 +54,8 @@ install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %{_libdir}/systemd/system/sdbd.service %if 0%{?simulator} %{_libdir}/systemd/system/emulator.target.wants/sdbd.service +%else +%{_libdir}/systemd/system/sdbd_tcp.service %endif %changelog diff --git a/packaging/sdbd_tcp.service b/packaging/sdbd_tcp.service new file mode 100644 index 0000000..3818b6d --- /dev/null +++ b/packaging/sdbd_tcp.service @@ -0,0 +1,10 @@ +[Unit] +Description=sdbd +After=default.target + +[Service] +Type=forking +Environment=DISPLAY=:0 +PIDFile=/tmp/.sdbd.pid +RemainAfterExit=yes +ExecStart=/usr/sbin/sdbd --listen=26101 diff --git a/src/commandline_sdbd.c b/src/commandline_sdbd.c index f1c3f55..ec16a0d 100644 --- a/src/commandline_sdbd.c +++ b/src/commandline_sdbd.c @@ -63,6 +63,12 @@ int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[ if (split_retval != SDBD_COMMANDLINE_SUCCESS) { return split_retval; } + /* if we are on emulator we listen using local transport + * so we should set port to default value but this can + * be overwritten by command line options */ + if (sdbd_args->sdbd_port < 0) { + sdbd_args->sdbd_port = DEFAULT_SDB_LOCAL_TRANSPORT_PORT; + } break; case ARG_S_SENSORS: split_retval = split_host_port(optarg, @@ -109,7 +115,8 @@ void apply_sdbd_commandline_defaults(SdbdCommandlineArgs *sdbd_args) { sdbd_args->sdb.host = strdup(QEMU_FORWARD_IP); sdbd_args->sdb.port = DEFAULT_SDB_PORT; - sdbd_args->sdbd_port = DEFAULT_SDB_LOCAL_TRANSPORT_PORT; + // by default don't listen on local transport + sdbd_args->sdbd_port = -1; } diff --git a/src/sdb.c b/src/sdb.c index 90f4cfa..0ab561a 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1232,11 +1232,12 @@ int sdb_main(int is_daemon, int server_port) if (!is_emulator()) { // listen on USB usb_init(); - // listen on tcp - //local_init(DEFAULT_SDB_LOCAL_TRANSPORT_PORT); - } else { - // listen on default port - local_init(DEFAULT_SDB_LOCAL_TRANSPORT_PORT); + } + + /* by default don't listen on local transport but + * listen if suitable command line argument has been provided */ + if (sdbd_commandline_args.sdbd_port >= 0) { + local_init(sdbd_commandline_args.sdbd_port); } #if 0 /* tizen specific */ diff --git a/test/test_commandline_sdbd.c b/test/test_commandline_sdbd.c index 4dd67e8..dc02345 100644 --- a/test/test_commandline_sdbd.c +++ b/test/test_commandline_sdbd.c @@ -103,6 +103,44 @@ START_TEST(test_all_opts) { } END_TEST +START_TEST(test_emul_default_tcp_port) { + char *test_argv[] = { + "./test", + "--emulator=tizen:101", + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + apply_sdbd_commandline_defaults(&sdbd_args); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + + if (parse_res != SDBD_COMMANDLINE_SUCCESS) { + ck_abort_msg("parsing commandline failed"); + return; + } + + ck_assert_hostport_eq(&sdbd_args.emulator, "tizen", 101); + ck_assert_int_eq(sdbd_args.sdbd_port, DEFAULT_SDB_LOCAL_TRANSPORT_PORT); +} END_TEST + +START_TEST(test_tcp_port) { + char *test_argv[] = { + "./test", + "--listen-port=101", + }; + + SdbdCommandlineArgs sdbd_args = {0}; + + apply_sdbd_commandline_defaults(&sdbd_args); + int parse_res = parse_sdbd_commandline(&sdbd_args, array_size(test_argv), test_argv); + + if (parse_res != SDBD_COMMANDLINE_SUCCESS) { + ck_abort_msg("parsing commandline failed"); + return; + } + + ck_assert_int_eq(sdbd_args.sdbd_port, 101); +} END_TEST START_TEST(test_empty) { char *test_argv[] = { @@ -181,7 +219,7 @@ START_TEST(test_default_args) { ck_assert_hostport_eq(&sdbd_args.emulator, NULL, 0); ck_assert_hostport_eq(&sdbd_args.sensors, QEMU_FORWARD_IP, DEFAULT_SENSORS_LOCAL_TRANSPORT_PORT); ck_assert_hostport_eq(&sdbd_args.sdb, QEMU_FORWARD_IP, DEFAULT_SDB_PORT); - ck_assert_int_eq(sdbd_args.sdbd_port, DEFAULT_SDB_LOCAL_TRANSPORT_PORT); + ck_assert_int_eq(sdbd_args.sdbd_port, -1); } END_TEST -- 2.7.4 From 1df144ee502e2413e07324507318c31212ea4365 Mon Sep 17 00:00:00 2001 From: Max Yu Date: Fri, 11 Apr 2014 03:59:13 -0700 Subject: [PATCH 08/16] Revert "Fix sdbd segfault" This reverts commit ff9d790217ab53b0dd4afaa1d8f316fb30f335fe. Change-Id: Ib4c25cc3d549a1c5e19e154a5e84a5f178516860 --- src/sdb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sdb.c b/src/sdb.c index 2715341..0ab561a 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1119,8 +1119,7 @@ int set_developer_privileges() { } } // TODO: use pam later - char * env = malloc (strlen("HOME=") + strlen(HOME_DEV_PATH) +1); - strcpy(env, "HOME="); + char * env = "HOME="; strcat(env, HOME_DEV_PATH); putenv(env); -- 2.7.4 From ff9d790217ab53b0dd4afaa1d8f316fb30f335fe Mon Sep 17 00:00:00 2001 From: "Xiaoyang Yu (max)" Date: Fri, 11 Apr 2014 22:41:12 +0800 Subject: [PATCH 09/16] Fix sdbd segfault Fix TIVI-3031 SDBD process segment fault Change-Id: I13e581b52827be8bba8f867ccb958dec6295d6e6 Signed-off-by: Xiaoyang Yu (max) --- src/sdb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sdb.c b/src/sdb.c index 0ab561a..2715341 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1119,7 +1119,8 @@ int set_developer_privileges() { } } // TODO: use pam later - char * env = "HOME="; + char * env = malloc (strlen("HOME=") + strlen(HOME_DEV_PATH) +1); + strcpy(env, "HOME="); strcat(env, HOME_DEV_PATH); putenv(env); -- 2.7.4 From d8c15b2e241ed0462c6ddf58d1651581221b0c60 Mon Sep 17 00:00:00 2001 From: "Xiaoyang Yu (max)" Date: Fri, 11 Apr 2014 23:25:17 +0800 Subject: [PATCH 10/16] Exit if malloc failed Exit if failed to malloc for env string Change-Id: Ib9fb676520cb05ff98ebc671f548ad15fcaa07e1 Signed-off-by: Xiaoyang Yu (max) --- src/sdb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sdb.c b/src/sdb.c index 2715341..0ba7d38 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1120,6 +1120,7 @@ int set_developer_privileges() { } // TODO: use pam later char * env = malloc (strlen("HOME=") + strlen(HOME_DEV_PATH) +1); + if(env == 0) fatal("failed to allocate for env string"); strcpy(env, "HOME="); strcat(env, HOME_DEV_PATH); putenv(env); -- 2.7.4 From 594015adc24b17c60a854d9cf7505b302bdeee7c Mon Sep 17 00:00:00 2001 From: Max Yu Date: Fri, 11 Apr 2014 04:00:21 -0700 Subject: [PATCH 11/16] Revert "Exit if malloc failed" This reverts commit d8c15b2e241ed0462c6ddf58d1651581221b0c60. Change-Id: I5610f6245fa3451e269cfd14aaac5da30f317575 --- src/sdb.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sdb.c b/src/sdb.c index 0ba7d38..2715341 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1120,7 +1120,6 @@ int set_developer_privileges() { } // TODO: use pam later char * env = malloc (strlen("HOME=") + strlen(HOME_DEV_PATH) +1); - if(env == 0) fatal("failed to allocate for env string"); strcpy(env, "HOME="); strcat(env, HOME_DEV_PATH); putenv(env); -- 2.7.4 From 13f859844cd72ea3a895d348b0e5843f13bf7338 Mon Sep 17 00:00:00 2001 From: "Xiaoyang Yu (max)" Date: Sat, 12 Apr 2014 04:01:05 +0800 Subject: [PATCH 12/16] Fix SDBD segfault issue Fix TIVI-3031 SDBD process segment fault Change-Id: Ie65d929b23f78d72dbd48ce958c4c75ec2ef7f87 Signed-off-by: Xiaoyang Yu (max) --- src/sdb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sdb.c b/src/sdb.c index 0ab561a..1018430 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1119,9 +1119,12 @@ int set_developer_privileges() { } } // TODO: use pam later - char * env = "HOME="; + char * env = malloc(strlen("HOME=") + strlen(HOME_DEV_PATH) + 1); + if(env == 0) fatal("failed to allocate for env string"); + strcpy(env, "HOME="); strcat(env, HOME_DEV_PATH); putenv(env); + free(env); return 1; } -- 2.7.4 From c47096763dc498e6381a5edaf1cf255d6ba4fb94 Mon Sep 17 00:00:00 2001 From: "Xiaoyang Yu (max)" Date: Thu, 12 Jun 2014 19:17:33 +0800 Subject: [PATCH 13/16] Change reference to macro 'simulator' to 'emulator' in spec Now Project Configuration in OBS use macro 'emulator' instead of 'simulator', so we need to change reference in spec file accordingly Change-Id: Id25308859aea8713a477a92b5f163eff3dae8304 Signed-off-by: Xiaoyang Yu (max) --- packaging/sdbd.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index a3f00d1..410ebec 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -32,7 +32,7 @@ make %{?jobs:-j%jobs} %make_install mkdir -p %{buildroot}%{_libdir}/systemd/system -%if 0%{?simulator} +%if 0%{?emulator} install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service mkdir -p %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants ln -s %{_libdir}/systemd/system/sdbd.service %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants/ @@ -52,7 +52,7 @@ install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %{_prefix}/sbin/sdk_launch %attr(0755, root, root) %{_sysconfdir}/init.d/sdbd %{_libdir}/systemd/system/sdbd.service -%if 0%{?simulator} +%if 0%{?emulator} %{_libdir}/systemd/system/emulator.target.wants/sdbd.service %else %{_libdir}/systemd/system/sdbd_tcp.service -- 2.7.4 From 10b8282c3559f5331a1d85ae5b0b9b7f6a2f7faf Mon Sep 17 00:00:00 2001 From: Dongxing Liu Date: Wed, 18 Jun 2014 10:49:43 +0800 Subject: [PATCH 14/16] Change reference to macro 'emulator' to 'with emulator' in spec Now Project Configuration in OBS uses macro 'with emulator', so we need to change reference in spec file accordingly. Change-Id: Icd8622c5cdea7e76784787fa67e57c5cb93095c2 Signed-off-by: Dongxing Liu --- packaging/sdbd.spec | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 410ebec..dc2c194 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -1,3 +1,5 @@ +%bcond_with emulator + Name: sdbd Summary: SDB daemon Version: 3.0.1 @@ -32,7 +34,7 @@ make %{?jobs:-j%jobs} %make_install mkdir -p %{buildroot}%{_libdir}/systemd/system -%if 0%{?emulator} +%if %{with emulator} install -m 0644 %SOURCE1002 %{buildroot}%{_libdir}/systemd/system/sdbd.service mkdir -p %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants ln -s %{_libdir}/systemd/system/sdbd.service %{buildroot}/%{_libdir}/systemd/system/emulator.target.wants/ @@ -52,7 +54,7 @@ install -m 755 script/sdk_launch %{buildroot}%{_prefix}/sbin/ %{_prefix}/sbin/sdk_launch %attr(0755, root, root) %{_sysconfdir}/init.d/sdbd %{_libdir}/systemd/system/sdbd.service -%if 0%{?emulator} +%if %{with emulator} %{_libdir}/systemd/system/emulator.target.wants/sdbd.service %else %{_libdir}/systemd/system/sdbd_tcp.service -- 2.7.4 From 84905e75233699b895ed60d00f34e9b13f53a59d Mon Sep 17 00:00:00 2001 From: Alice Liu Date: Wed, 20 Aug 2014 16:27:03 +0800 Subject: [PATCH 15/16] Change sdbd running with User Smack label. According the Smack rules in Tizen 3, sdbd should be running with User Smack label. This will fix the issue that Xwalk cannot access the applicaiton package pushed by SDB. Change-Id: I25624ef73413825d8ffd2c5d36e5aff3385a9f37 Signed-off-by: Alice Liu --- packaging/sdbd_emulator.service | 1 + packaging/sdbd_tcp.service | 1 + 2 files changed, 2 insertions(+) diff --git a/packaging/sdbd_emulator.service b/packaging/sdbd_emulator.service index 3bcbcf1..78b5fc7 100644 --- a/packaging/sdbd_emulator.service +++ b/packaging/sdbd_emulator.service @@ -7,6 +7,7 @@ Type=forking Environment=DISPLAY=:0 PIDFile=/tmp/.sdbd.pid RemainAfterExit=yes +SmackExecLabel=User ExecStart=/bin/sh -c "/usr/sbin/sdbd `/usr/bin/awk '{match($0, /sdb_port=([0-9]+)/,port_match); match($0, /vm_name=([^, ]*)/,vm_match); print \"--emulator=\" vm_match[1] \":\" port_match[1] \" --connect-to=10.0.2.2:26099\" \" --sensors=10.0.2.2:\"port_match[1]+3 \" --listen-port=\"port_match[1]+1 }' /proc/cmdline`" [Install] diff --git a/packaging/sdbd_tcp.service b/packaging/sdbd_tcp.service index 3818b6d..6872e01 100644 --- a/packaging/sdbd_tcp.service +++ b/packaging/sdbd_tcp.service @@ -7,4 +7,5 @@ Type=forking Environment=DISPLAY=:0 PIDFile=/tmp/.sdbd.pid RemainAfterExit=yes +SmackExecLabel=User ExecStart=/usr/sbin/sdbd --listen=26101 -- 2.7.4 From 010012492968df7067f76a777fa7cf26474a2077 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Thu, 4 Sep 2014 14:27:24 +0200 Subject: [PATCH 16/16] Support both functionfs and sdb gadget MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Automatically detect the kernel interface to use for communication with host. Change-Id: I51834991063d9bbb686598490ddc7a0b607fc282 Signed-off-by: Łukasz Stelmach --- CMakeLists.txt | 8 +-- src/sdb.c | 28 ++++++++++- src/sdb.h | 27 ++++++++++ src/usb_funcfs_client.c | 129 +++++++++++++++++++++++++----------------------- src/usb_linux_client.c | 22 +++++---- 5 files changed, 134 insertions(+), 80 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1928023..681a995 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,16 +42,12 @@ set(sdbd_SRCS src/init.c src/fileutils.c src/commandline_sdbd.c + src/usb_linux_client.c + src/usb_funcfs_client.c ) include_directories(src) -if(USE_FUNCTION_FS) - list(APPEND sdbd_SRCS src/usb_funcfs_client.c) -else() - list(APPEND sdbd_SRCS src/usb_linux_client.c) -endif() - add_executable(sdbd ${sdbd_SRCS}) set_property( diff --git a/src/sdb.c b/src/sdb.c index 1018430..3fbe423 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -1,4 +1,5 @@ -/* +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- + * * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); @@ -55,6 +56,13 @@ int HOST = 0; SdbdCommandlineArgs sdbd_commandline_args; #endif +void (*usb_init)() = NULL; +void (*usb_cleanup)() = NULL; +int (*usb_write)(usb_handle *h, const void *data, int len) = NULL; +int (*usb_read)(usb_handle *h, void *data, int len) = NULL; +int (*usb_close)(usb_handle *h) = NULL; +void (*usb_kick)(usb_handle *h) = NULL; + int is_emulator(void) { #if SDB_HOST return 0; @@ -1233,6 +1241,24 @@ int sdb_main(int is_daemon, int server_port) } if (!is_emulator()) { + /* choose the usb gadget backend */ + if (access(USB_NODE_FILE, F_OK) == 0) { + /* legacy kernel-based sdb gadget */ + usb_init = &linux_usb_init; + usb_cleanup = &linux_usb_cleanup; + usb_write = &linux_usb_write; + usb_read = &linux_usb_read; + usb_close = &linux_usb_close; + usb_kick = &linux_usb_kick; + } else { + /* functionfs based gadget */ + usb_init = &ffs_usb_init; + usb_cleanup = &ffs_usb_cleanup; + usb_write = &ffs_usb_write; + usb_read = &ffs_usb_read; + usb_close = &ffs_usb_close; + usb_kick = &ffs_usb_kick; + } // listen on USB usb_init(); } diff --git a/src/sdb.h b/src/sdb.h index ccee503..8f7b5f9 100644 --- a/src/sdb.h +++ b/src/sdb.h @@ -462,12 +462,39 @@ int local_connect(int port, const char *device_name); int local_connect_arbitrary_ports(int console_port, int sdb_port, const char *device_name); /* usb host/client interface */ +#if SDB_HOST void usb_init(); void usb_cleanup(); int usb_write(usb_handle *h, const void *data, int len); int usb_read(usb_handle *h, void *data, int len); int usb_close(usb_handle *h); void usb_kick(usb_handle *h); +#else + +extern void (*usb_init)(); +extern void (*usb_cleanup)(); +extern int (*usb_write)(usb_handle *h, const void *data, int len); +extern int (*usb_read)(usb_handle *h, void *data, int len); +extern int (*usb_close)(usb_handle *h); +extern void (*usb_kick)(usb_handle *h); + +/* functionfs backend */ +void ffs_usb_init(); +void ffs_usb_cleanup(); +int ffs_usb_write(usb_handle *h, const void *data, int len); +int ffs_usb_read(usb_handle *h, void *data, int len); +int ffs_usb_close(usb_handle *h); +void ffs_usb_kick(usb_handle *h); + +/* kernel sdb gadget backend */ +void linux_usb_init(); +void linux_usb_cleanup(); +int linux_usb_write(usb_handle *h, const void *data, int len); +int linux_usb_read(usb_handle *h, void *data, int len); +int linux_usb_close(usb_handle *h); +void linux_usb_kick(usb_handle *h); + +#endif /* used for USB device detection */ #if SDB_HOST diff --git a/src/usb_funcfs_client.c b/src/usb_funcfs_client.c index 0a2ff7e..af9fd2b 100644 --- a/src/usb_funcfs_client.c +++ b/src/usb_funcfs_client.c @@ -218,13 +218,6 @@ error: sdb_mutex_unlock(&h->control_lock); } - -void usb_cleanup() -{ - /* nothing to do here */ -} - - static void *usb_open_thread(void *x) { struct usb_handle *usb = (struct usb_handle *)x; @@ -405,29 +398,6 @@ static int bulk_write(int bulkin_fd, const void *buf, size_t length) /* - * Writes data to bulk_in descriptor - * - * In fact, data is forwarded to bulk_write. - * - * @returns 0 on success and -1 on failure (errno is set) - */ -int usb_write(usb_handle *h, const void *data, int len) -{ - int n; - - D("about to write (fd=%d, len=%d)\n", h->bulk_in, len); - n = bulk_write(h->bulk_in, data, len); - if(n != len) { - D("ERROR: fd = %d, n = %d, errno = %d (%s)\n", - h->bulk_in, n, errno, strerror(errno)); - return -1; - } - D("[ done fd=%d ]\n", h->bulk_in); - return 0; -} - - -/* * Reads data from bulkout_fd * * Blocks until length data is read or error occurs. @@ -458,34 +428,10 @@ static int bulk_read(int bulkout_fd, void *buf, size_t length) return count; } - -/* - * Reads data from bulk_out descriptor - * - * In fact, reading task is forwarded to bulk_read. - * - * @returns 0 on success and -1 on failure (errno is set) - */ -int usb_read(usb_handle *h, void *data, int len) -{ - int n; - - D("%d: about to read (fd=%d, len=%d)\n", getpid(), h->bulk_out, len); - n = bulk_read(h->bulk_out, data, len); - if(n != len) { - D("ERROR: fd = %d, n = %d, errno = %d (%s)\n", - h->bulk_out, n, errno, strerror(errno)); - return -1; - } - D("[ done fd=%d ]\n", h->bulk_out); - return 0; -} - - /* * Checks if EP0 exists on filesystem */ -int ep0_exists() +static int ep0_exists() { struct stat statb; return stat(ep0_path, &statb) == 0; @@ -513,9 +459,14 @@ static int autoconfig(struct usb_handle *h) /* + * Public host/client interface + */ + + +/* * Creates and starts USB threads */ -void usb_init() +void ffs_usb_init() { usb_handle *h; sdb_thread_t tid; @@ -550,7 +501,65 @@ void usb_init() } -void usb_kick(usb_handle *h) +void ffs_usb_cleanup() +{ + /* nothing to do here */ +} + + +/* + * Writes data to bulk_in descriptor + * + * In fact, data is forwarded to bulk_write. + * + * @returns 0 on success and -1 on failure (errno is set) + */ +int ffs_usb_write(usb_handle *h, const void *data, int len) +{ + int n; + + D("about to write (fd=%d, len=%d)\n", h->bulk_in, len); + n = bulk_write(h->bulk_in, data, len); + if(n != len) { + D("ERROR: fd = %d, n = %d, errno = %d (%s)\n", + h->bulk_in, n, errno, strerror(errno)); + return -1; + } + D("[ done fd=%d ]\n", h->bulk_in); + return 0; +} + + +/* + * Reads data from bulk_out descriptor + * + * In fact, reading task is forwarded to bulk_read. + * + * @returns 0 on success and -1 on failure (errno is set) + */ +int ffs_usb_read(usb_handle *h, void *data, int len) +{ + int n; + + D("%d: about to read (fd=%d, len=%d)\n", getpid(), h->bulk_out, len); + n = bulk_read(h->bulk_out, data, len); + if(n != len) { + D("ERROR: fd = %d, n = %d, errno = %d (%s)\n", + h->bulk_out, n, errno, strerror(errno)); + return -1; + } + D("[ done fd=%d ]\n", h->bulk_out); + return 0; +} + + +int ffs_usb_close(usb_handle *h) +{ + return 0; +} + + +void ffs_usb_kick(usb_handle *h) { int err; @@ -569,9 +578,3 @@ void usb_kick(usb_handle *h) sdb_cond_signal(&h->kick_notify); sdb_mutex_unlock(&h->kick_lock); } - - -int usb_close(usb_handle *h) -{ - return 0; -} diff --git a/src/usb_linux_client.c b/src/usb_linux_client.c index 96a3f75..fa813fc 100644 --- a/src/usb_linux_client.c +++ b/src/usb_linux_client.c @@ -37,11 +37,6 @@ struct usb_handle sdb_mutex_t lock; }; -void usb_cleanup() -{ - // nothing to do here -} - static void *usb_open_thread(void *x) { struct usb_handle *usb = (struct usb_handle *)x; @@ -82,7 +77,9 @@ static void *usb_open_thread(void *x) return 0; } -int usb_write(usb_handle *h, const void *data, int len) +// Public host/client interface + +int linux_usb_write(usb_handle *h, const void *data, int len) { int n; @@ -97,7 +94,7 @@ int usb_write(usb_handle *h, const void *data, int len) return 0; } -int usb_read(usb_handle *h, void *data, int len) +int linux_usb_read(usb_handle *h, void *data, int len) { int n; @@ -112,7 +109,7 @@ int usb_read(usb_handle *h, void *data, int len) return 0; } -void usb_init() +void linux_usb_init() { usb_handle *h; sdb_thread_t tid; @@ -142,7 +139,7 @@ void usb_init() } } -void usb_kick(usb_handle *h) +void linux_usb_kick(usb_handle *h) { D("usb_kick\n"); sdb_mutex_lock(&h->lock); @@ -154,8 +151,13 @@ void usb_kick(usb_handle *h) sdb_mutex_unlock(&h->lock); } -int usb_close(usb_handle *h) +int linux_usb_close(usb_handle *h) { // nothing to do here return 0; } + +void linux_usb_cleanup() +{ + // nothing to do here +} -- 2.7.4