You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2017/11/20 20:33:04 UTC
[07/46] celix git commit: CELIX-417: Initial refactoring for CMake
usage
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
deleted file mode 100644
index 19cf103..0000000
--- a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
+++ /dev/null
@@ -1,495 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-#include <CppUTest/TestHarness.h>
-#include <remote_constants.h>
-#include <constants.h>
-#include "CppUTest/CommandLineTestRunner.h"
-#include "../../../examples/calculator_service/public/include/calculator_service.h"
-
-extern "C" {
-
- #include <stdio.h>
- #include <stdint.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <unistd.h>
-
- #include "celix_launcher.h"
- #include "framework.h"
- #include "remote_service_admin.h"
- #include "calculator_service.h"
- #include "bundle.h"
-
- #define DISCOVERY_CFG_NAME "apache_celix_rsa_discovery_configured"
- #define RSA_HTTP_NAME "apache_celix_remote_service_admin_http"
- #define TOPOLOGY_MANAGER_NAME "apache_celix_rs_topology_manager"
- #define CALCULATOR_PROXY "apache_celix_remoting_calculator_proxy"
- #define CALCULATOR_ENDPOINT "apache_celix_remoting_calculator_endpoint"
-
-
- static framework_pt serverFramework = NULL;
- static bundle_context_pt serverContext = NULL;
-
- static framework_pt clientFramework = NULL;
- static bundle_context_pt clientContext = NULL;
-
- static void setupFm(void) {
- int rc = 0;
- bundle_pt bundle = NULL;
-
- //server
- rc = celixLauncher_launch("server.properties", &serverFramework);
- CHECK_EQUAL(CELIX_SUCCESS, rc);
-
- bundle = NULL;
- rc = framework_getFrameworkBundle(serverFramework, &bundle);
- CHECK_EQUAL(CELIX_SUCCESS, rc);
-
- rc = bundle_getContext(bundle, &serverContext);
- CHECK_EQUAL(CELIX_SUCCESS, rc);
-
- //client
- rc = celixLauncher_launch("client.properties", &clientFramework);
- CHECK_EQUAL(CELIX_SUCCESS, rc);
-
- bundle = NULL;
- rc = framework_getFrameworkBundle(clientFramework, &bundle);
- CHECK_EQUAL(CELIX_SUCCESS, rc);
-
- rc = bundle_getContext(bundle, &clientContext);
- CHECK_EQUAL(CELIX_SUCCESS, rc);
- }
-
- static void teardownFm(void) {
- celixLauncher_stop(serverFramework);
- celixLauncher_waitForShutdown(serverFramework);
- celixLauncher_destroy(serverFramework);
-
- celixLauncher_stop(clientFramework);
- celixLauncher_waitForShutdown(clientFramework);
- celixLauncher_destroy(clientFramework);
-
- serverContext = NULL;
- serverFramework = NULL;
- clientContext = NULL;
- clientFramework = NULL;
- }
-
- static void test1(void) {
- celix_status_t status;
- service_reference_pt ref = NULL;
- calculator_service_pt calcService = NULL;
- int retries = 4;
-
- while (ref == NULL && retries > 0) {
- printf("Waiting for service .. %d\n", retries);
- status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
- usleep(1000000);
- --retries;
- }
-
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK(ref != NULL);
-
- status = bundleContext_getService(clientContext, ref, (void **) &calcService);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK(calcService != NULL);
-
- double result = 0;
- status = calcService->add(calcService->calculator, 2.0, 5.0, &result);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK_EQUAL(7.0, result);
-
- bundleContext_ungetService(clientContext, ref, NULL);
- bundleContext_ungetServiceReference(clientContext, ref);
- }
-
-
- static celix_status_t getPermutations(array_list_pt bundleIds, int from, int to, array_list_pt permutations) {
- celix_status_t status = CELIX_SUCCESS;
- int i = 0;
-
- if (from == to) {
- long* permutation = (long*) calloc(to + 1, sizeof(*permutation));
-
- if (!permutation) {
- status = CELIX_ENOMEM;
- } else {
- for (; i <= to; i++) {
- permutation[i] = (long) arrayList_get(bundleIds, i);
- }
-
- arrayList_add(permutations, permutation);
- }
- } else {
- for (i = from; i <= to; i++) {
- long fromOrg = (long) arrayList_get(bundleIds, from);
- long iOrg = (long) arrayList_get(bundleIds, i);
-
- arrayList_set(bundleIds, from, (void*) iOrg);
- arrayList_set(bundleIds, i, (void*) fromOrg);
-
- status = getPermutations(bundleIds, from + 1, to, permutations);
-
- arrayList_set(bundleIds, from, (void*) fromOrg);
- arrayList_set(bundleIds, i, (void*) iOrg);
- }
- }
-
- return status;
- }
-
- static celix_status_t getSpecifiedBundles(bundle_context_pt context, array_list_pt bundleNames, array_list_pt retrievedBundles) {
- celix_status_t status;
- array_list_pt bundles = NULL;
-
- status = bundleContext_getBundles(context, &bundles);
-
- if (status == CELIX_SUCCESS) {
- unsigned int size = arrayList_size(bundles);
- unsigned int i;
-
- for (i = 0; i < size; i++) {
- module_pt module = NULL;
- const char *name = NULL;
-
- bundle_pt bundle = (bundle_pt) arrayList_get(bundles, i);
-
- status = bundle_getCurrentModule(bundle, &module);
-
- if (status == CELIX_SUCCESS) {
- status = module_getSymbolicName(module, &name);
- }
-
- if (status == CELIX_SUCCESS) {
-
- printf("FOUND %s\n", name);
-
- array_list_iterator_pt iter = arrayListIterator_create(bundleNames);
-
- while(arrayListIterator_hasNext(iter)) {
- char* bundleName = (char*) arrayListIterator_next(iter);
-
- if ((strcmp(name, bundleName) == 0)) {
-
- bundle_archive_pt bundleArchive = NULL;
- long bundleId = -1;
-
- status = bundle_getArchive(bundle, &bundleArchive);
-
- if (status == CELIX_SUCCESS) {
- status = bundleArchive_getId(bundleArchive, &bundleId);
- }
-
- if (status == CELIX_SUCCESS) {
- arrayList_add(retrievedBundles, (void*) bundleId);
- break;
- }
- }
- }
-
- arrayListIterator_destroy(iter);
-
- }
- }
-
- arrayList_destroy(bundles);
- }
-
- return status;
- }
-
- static celix_status_t stopStartPermutation(bundle_context_pt context, long* permutation, int size) {
- celix_status_t status = CELIX_SUCCESS;
- int y = 0;
-
- printf("Test stop/start permutation: ");
-
- for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
- bundle_pt bundle = NULL;
-
- status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
- if (status == CELIX_SUCCESS) {
- module_pt module = NULL;
- const char *name = NULL;
-
- status = bundle_getCurrentModule(bundle, &module);
-
- if (status == CELIX_SUCCESS) {
- status = module_getSymbolicName(module, &name);
- printf("%s (%ld) ", name, permutation[y]);
- }
- }
- }
- printf("\n");
-
- // stop all bundles
- if (status == CELIX_SUCCESS) {
- for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
- bundle_pt bundle = NULL;
-
- status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
- if (status == CELIX_SUCCESS) {
- printf("stop bundle: %ld\n", permutation[y]);
- status = bundle_stop(bundle);
- }
- }
- }
-
- // verify stop state
- if (status == CELIX_SUCCESS) {
- for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
- bundle_pt bundle = NULL;
-
- status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
- if (status == CELIX_SUCCESS) {
- bundle_state_e state;
- status = bundle_getState(bundle, &state);
-
- if (state != OSGI_FRAMEWORK_BUNDLE_RESOLVED) {
- printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_RESOLVED);
- status = CELIX_ILLEGAL_STATE;
- }
- }
- }
- }
-
- // start all bundles
- if (status == CELIX_SUCCESS) {
-
- for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
- bundle_pt bundle = NULL;
-
- status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
- if (status == CELIX_SUCCESS) {
- printf("start bundle: %ld\n", permutation[y]);
- status = bundle_start(bundle);
- }
- }
- }
-
- // verify started state
- if (status == CELIX_SUCCESS) {
- for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
- bundle_pt bundle = NULL;
-
- status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
- if (status == CELIX_SUCCESS) {
- bundle_state_e state;
- status = bundle_getState(bundle, &state);
-
- if (state != OSGI_FRAMEWORK_BUNDLE_ACTIVE) {
- printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_ACTIVE);
- status = CELIX_ILLEGAL_STATE;
- }
- }
- }
- }
-
- return status;
- }
-
- static void testImport(void) {
- celix_status_t status;
- array_list_pt bundleNames = NULL;
- array_list_pt bundlePermutations = NULL;
- array_list_pt rsaBundles = NULL;
- unsigned int i, size;
-
- arrayList_create(&bundleNames);
- arrayList_create(&bundlePermutations);
- arrayList_create(&rsaBundles);
-
- arrayList_add(bundleNames, (void*) DISCOVERY_CFG_NAME);
- arrayList_add(bundleNames, (void*) RSA_HTTP_NAME);
- arrayList_add(bundleNames, (void*) TOPOLOGY_MANAGER_NAME);
-
- status = getSpecifiedBundles(clientContext, bundleNames, rsaBundles);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK_EQUAL(arrayList_size(rsaBundles), arrayList_size(bundleNames));
-
- status = getPermutations(rsaBundles, 0, arrayList_size(rsaBundles) - 1, bundlePermutations);
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- size = arrayList_size(bundlePermutations);
-
- for (i = 0; i < size; ++i) {
- long* singlePermutation = (long*) arrayList_get(bundlePermutations, i);
-
- status = stopStartPermutation(clientContext, singlePermutation, arrayList_size(rsaBundles));
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- // check whether calc service is available
- test1();
-
- free(singlePermutation);
- }
-
- arrayList_destroy(bundlePermutations);
- arrayList_destroy(bundleNames);
- arrayList_destroy(rsaBundles);
- }
-
- static void testExport(void) {
- celix_status_t status;
- array_list_pt bundleNames = NULL;
- array_list_pt bundlePermutations = NULL;
- array_list_pt rsaBundles = NULL;
-
- unsigned int i, size;
-
- arrayList_create(&bundleNames);
- arrayList_create(&bundlePermutations);
- arrayList_create(&rsaBundles);
-
- arrayList_add(bundleNames, (void*) DISCOVERY_CFG_NAME);
- arrayList_add(bundleNames, (void*) RSA_HTTP_NAME);
- arrayList_add(bundleNames, (void*) TOPOLOGY_MANAGER_NAME);
-
- status = getSpecifiedBundles(serverContext, bundleNames, rsaBundles);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK_EQUAL(arrayList_size(rsaBundles), arrayList_size(bundleNames));
-
- status = getPermutations(rsaBundles, 0, arrayList_size(rsaBundles) - 1, bundlePermutations);
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- size = arrayList_size(bundlePermutations);
-
- for (i = 0; i < size; ++i) {
- long* singlePermutation = (long*) arrayList_get(bundlePermutations, i);
-
- status = stopStartPermutation(serverContext, singlePermutation, arrayList_size(rsaBundles));
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- /* we need to sleep here for a bit to ensure
- * that the client has flushed the old discovery
- * values
- */
- sleep(2);
-
- // check whether calc service is available
- test1();
-
- free(singlePermutation);
- }
-
- arrayList_destroy(bundlePermutations);
- arrayList_destroy(bundleNames);
- arrayList_destroy(rsaBundles);
- }
-
- static void testProxyRemoval(void) {
- celix_status_t status;
- bundle_pt bundle = NULL;
- array_list_pt bundleNames = NULL;
- array_list_pt proxyBundle = NULL;
- service_reference_pt ref = NULL;
-
- arrayList_create(&bundleNames);
- arrayList_create(&proxyBundle);
-
- arrayList_add(bundleNames, (void*) CALCULATOR_PROXY);
- status = getSpecifiedBundles(clientContext, bundleNames, proxyBundle);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK_EQUAL(arrayList_size(proxyBundle), arrayList_size(bundleNames));
-
- status = bundleContext_getBundleById(clientContext, (long) arrayList_get(proxyBundle, 0), &bundle);
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- status = bundle_stop(bundle);
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK(ref == NULL);
-
- arrayList_destroy(bundleNames);
- arrayList_destroy(proxyBundle);
- }
-
- /*
- static void testEndpointRemoval(void) {
- celix_status_t status;
- bundle_pt bundle = NULL;
- array_list_pt bundleNames = NULL;
- array_list_pt endpointBundle = NULL;
- service_reference_pt ref = NULL;
-
- arrayList_create(&bundleNames);
- arrayList_create(&endpointBundle);
-
- arrayList_add(bundleNames, (void*) CALCULATOR_ENDPOINT);
- status = getSpecifiedBundles(serverContext, bundleNames, endpointBundle);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK_EQUAL(arrayList_size(endpointBundle), arrayList_size(bundleNames));
-
- status = bundleContext_getBundleById(serverContext, (long) arrayList_get(endpointBundle, 0), &bundle);
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- status = bundle_stop(bundle);
- CHECK_EQUAL(CELIX_SUCCESS, status);
-
- status = bundleContext_getServiceReference(serverContext, (char *) CALCULATOR_SERVICE, &ref);
- CHECK_EQUAL(CELIX_SUCCESS, status);
- CHECK(ref == NULL);
-
- arrayList_destroy(bundleNames);
- arrayList_destroy(endpointBundle);
- }
- */
-}
-
-TEST_GROUP(RsaHttpClientServerTests) {
- void setup() {
- setupFm();
- }
-
- void teardown() {
- teardownFm();
- }
-};
-
-TEST(RsaHttpClientServerTests, Test1) {
- test1();
-}
-
-TEST(RsaHttpClientServerTests, TestImport) {
- testImport();
-}
-
-TEST(RsaHttpClientServerTests, TestExport) {
- testExport();
-}
-
-TEST(RsaHttpClientServerTests, TestProxyRemoval) {
- testProxyRemoval();
-}
-/*
-TEST(RsaHttpClientServerTests, TestEndpointRemoval) {
- // test is currenlty failing
- testEndpointRemoval();
-}
-*/
-
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/remote_service_admin_http/private/test/run_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/run_tests.cpp b/remote_services/remote_service_admin_http/private/test/run_tests.cpp
deleted file mode 100644
index fb6ca3a..0000000
--- a/remote_services/remote_service_admin_http/private/test/run_tests.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-#include <CppUTest/TestHarness.h>
-#include "CppUTest/CommandLineTestRunner.h"
-
-int main(int argc, char** argv) {
- return RUN_ALL_TESTS(argc, argv);
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/remote_service_admin_http/private/test/server.properties.in
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/server.properties.in b/remote_services/remote_service_admin_http/private/test/server.properties.in
deleted file mode 100644
index e7d48ab..0000000
--- a/remote_services/remote_service_admin_http/private/test/server.properties.in
+++ /dev/null
@@ -1,25 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-
-cosgi.auto.start.1=@rsa_bundle_file@ @calc_bundle_file@ @discovery_configured_bundle_file@ @topology_manager_bundle_file@
-LOGHELPER_ENABLE_STDOUT_FALLBACK=true
-ENDPOINTS=@server_endpoints@
-RSA_PORT=50882
-DISCOVERY_CFG_SERVER_PORT=50992
-org.osgi.framework.storage.clean=onFirstInit
-org.osgi.framework.storage=.cacheServer
-DISCOVERY_CFG_POLL_INTERVAL=1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/CMakeLists.txt b/remote_services/topology_manager/CMakeLists.txt
index 46a3bac..4bac4fd 100644
--- a/remote_services/topology_manager/CMakeLists.txt
+++ b/remote_services/topology_manager/CMakeLists.txt
@@ -29,8 +29,6 @@ if (RSA_TOPOLOGY_MANAGER)
private/src/scope
private/src/activator
- ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
-
private/include/topology_manager.h
public/include/tm_scope.h
VERSION 0.9.0
@@ -38,6 +36,7 @@ if (RSA_TOPOLOGY_MANAGER)
NAME
"Apache Celix RS Topology Manager"
)
+ target_link_libraries(topology_manager PRIVATE Celix::log_helper)
install_bundle(topology_manager)
@@ -50,6 +49,4 @@ if (RSA_TOPOLOGY_MANAGER)
include_directories(${CPPUTEST_EXT_INCLUDE_DIR})
add_subdirectory(tms_tst)
endif (ENABLE_TESTING)
-
- target_link_libraries(topology_manager celix_framework celix_utils)
endif (RSA_TOPOLOGY_MANAGER)
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/tms_tst/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/tms_tst/CMakeLists.txt b/remote_services/topology_manager/tms_tst/CMakeLists.txt
index 16ad011..dc671e4 100644
--- a/remote_services/topology_manager/tms_tst/CMakeLists.txt
+++ b/remote_services/topology_manager/tms_tst/CMakeLists.txt
@@ -39,7 +39,7 @@ add_executable(test_tm_scoped
${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c
)
-target_link_libraries(test_tm_scoped celix_framework celix_utils ${CPPUTEST_LIBRARY} ${JANSSON_LIBRARY})
+target_link_libraries(test_tm_scoped Celix::framework ${CPPUTEST_LIBRARY} ${JANSSON_LIBRARY} Celix::log_helper)
add_dependencies(test_tm_scoped remote_service_admin_dfi topology_manager calculator)
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt b/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
index 6e269f5..9e36e4c 100644
--- a/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
+++ b/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
@@ -32,4 +32,4 @@ bundle_files(topology_manager_test_bundle
DESTINATION .
)
-target_link_libraries(topology_manager_test_bundle ${CPPUTEST_LIBRARY} celix_framework celix_utils)
+target_link_libraries(topology_manager_test_bundle PRIVATE ${CPPUTEST_LIBRARY})
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt b/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
index a19efc7..b961de7 100644
--- a/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
+++ b/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
@@ -30,4 +30,4 @@ add_bundle(topology_manager_disc_mock_bundle
disc_mock_service.c
)
-target_link_libraries(topology_manager_disc_mock_bundle ${CPPUTEST_LIBRARY} celix_framework celix_utils)
+target_link_libraries(topology_manager_disc_mock_bundle PRIVATE ${CPPUTEST_LIBRARY} Celix::framework)
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_shell/CMakeLists.txt b/remote_shell/CMakeLists.txt
index 7c37d13..a7f5d36 100644
--- a/remote_shell/CMakeLists.txt
+++ b/remote_shell/CMakeLists.txt
@@ -22,25 +22,23 @@ if (REMOTE_SHELL)
VERSION "0.0.2"
NAME: "Apache Celix Remote Shell"
SOURCES
- private/src/activator
- private/src/connection_listener
- private/src/shell_mediator
- private/src/remote_shell
-
- ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
-
- private/include/remote_shell.h
- private/include/connection_listener.h
+ src/activator
+ src/connection_listener
+ src/shell_mediator
+ src/remote_shell
)
-
+
+ target_include_directories(remote_shell PRIVATE src)
+ target_link_libraries(remote_shell PRIVATE log_helper)
install_bundle(remote_shell)
-
- include_directories("private/include")
+
include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
- include_directories("${PROJECT_SOURCE_DIR}/shell/public/include")
include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
- target_link_libraries(remote_shell celix_framework)
+ target_link_libraries(remote_shell PRIVATE Celix::shell_api)
+
+ #Alias setup to match external usage
+ add_library(Celix::remote_shell ALIAS remote_shell)
- add_deploy("remote_shell_deploy" NAME "remote_shell" BUNDLES shell remote_shell shell_tui log_service)
+ add_deploy("remote_shell_deploy" NAME "remote_shell" BUNDLES Celix::shell Celix::remote_shell Celix::shell_tui log_service)
endif (REMOTE_SHELL)
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/include/connection_listener.h
----------------------------------------------------------------------
diff --git a/remote_shell/private/include/connection_listener.h b/remote_shell/private/include/connection_listener.h
deleted file mode 100644
index 392d6ec..0000000
--- a/remote_shell/private/include/connection_listener.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-/*
- * connection_listener.h
- *
- * \date Nov 4, 2012
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#ifndef connectionListener_H_
-#define connectionListener_H_
-
-#include <bundle_context.h>
-#include <celix_errno.h>
-
-#include "remote_shell.h"
-
-typedef struct connection_listener *connection_listener_pt;
-
-celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance);
-celix_status_t connectionListener_destroy(connection_listener_pt instance);
-celix_status_t connectionListener_start(connection_listener_pt instance);
-celix_status_t connectionListener_stop(connection_listener_pt instance);
-
-#endif /* connectionListener_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/include/remote_shell.h
----------------------------------------------------------------------
diff --git a/remote_shell/private/include/remote_shell.h b/remote_shell/private/include/remote_shell.h
deleted file mode 100644
index 55249a8..0000000
--- a/remote_shell/private/include/remote_shell.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-/*
- * remote_shell.h
- *
- * \date Nov 4, 2012
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#ifndef REMOTE_SHELL_H_
-#define REMOTE_SHELL_H_
-
-#include <bundle_context.h>
-#include <celix_errno.h>
-
-#include "shell_mediator.h"
-
-struct remote_shell {
- log_helper_pt* loghelper;
- shell_mediator_pt mediator;
- celix_thread_mutex_t mutex;
- int maximumConnections;
-
- array_list_pt connections;
-};
-typedef struct remote_shell *remote_shell_pt;
-
-celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance);
-celix_status_t remoteShell_destroy(remote_shell_pt instance);
-celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket);
-celix_status_t remoteShell_stopConnections(remote_shell_pt instance);
-
-#endif /* REMOTE_SHELL_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/include/shell_mediator.h
----------------------------------------------------------------------
diff --git a/remote_shell/private/include/shell_mediator.h b/remote_shell/private/include/shell_mediator.h
deleted file mode 100644
index 24e8250..0000000
--- a/remote_shell/private/include/shell_mediator.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-/*
- * shell_mediator.h
- *
- * \date Nov 4, 2012
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-
-#ifndef shellMediator_H_
-#define shellMediator_H_
-
-#include <bundle_context.h>
-#include <service_tracker.h>
-#include <celix_errno.h>
-
-#include <shell.h>
-
-struct shell_mediator {
-
- log_helper_pt loghelper;
- bundle_context_pt context;
- service_tracker_pt tracker;
- celix_thread_mutex_t mutex;
-
- //protected by mutex
- shell_service_pt shellService;
-};
-typedef struct shell_mediator *shell_mediator_pt;
-
-celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance);
-celix_status_t shellMediator_stop(shell_mediator_pt instance);
-celix_status_t shellMediator_destroy(shell_mediator_pt instance);
-celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err);
-
-#endif /* shellMediator_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/activator.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/activator.c b/remote_shell/private/src/activator.c
deleted file mode 100644
index 541eda6..0000000
--- a/remote_shell/private/src/activator.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-/*
- * activator.c
- *
- * \date Nov 4, 2012
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#include <celix_errno.h>
-
-#include <stdlib.h>
-
-#include "bundle_activator.h"
-#include "bundle_context.h"
-
-#include "log_helper.h"
-#include "connection_listener.h"
-#include "shell_mediator.h"
-#include "remote_shell.h"
-
-#define REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME "remote.shell.telnet.port"
-#define DEFAULT_REMOTE_SHELL_TELNET_PORT 6666
-
-#define REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME "remote.shell.telnet.maxconn"
-#define DEFAULT_REMOTE_SHELL_TELNET_MAXCONN 2
-
-struct bundle_instance {
- log_helper_pt loghelper;
- shell_mediator_pt shellMediator;
- remote_shell_pt remoteShell;
- connection_listener_pt connectionListener;
-};
-
-typedef struct bundle_instance *bundle_instance_pt;
-
-static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context);
-static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context);
-static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char * propertyName, int defaultValue);
-
-celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
- celix_status_t status = CELIX_SUCCESS;
-
- bundle_instance_pt bi = (bundle_instance_pt) calloc(1, sizeof(struct bundle_instance));
-
- if (!bi)
- {
- status = CELIX_ENOMEM;
- }
- else if (userData != NULL) {
- bi->shellMediator = NULL;
- bi->remoteShell = NULL;
- bi->connectionListener = NULL;
-
- status = logHelper_create(context, &bi->loghelper);
-
- (*userData) = bi;
- } else {
- status = CELIX_ILLEGAL_ARGUMENT;
- free(bi);
- }
-
- return status;
-}
-
-celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
- celix_status_t status = CELIX_SUCCESS;
- bundle_instance_pt bi = (bundle_instance_pt) userData;
-
- int port = bundleActivator_getPort(bi, context);
- int maxConn = bundleActivator_getMaximumConnections(bi, context);
-
- status = logHelper_start(bi->loghelper);
-
- status = CELIX_DO_IF(status, shellMediator_create(context, &bi->shellMediator));
- status = CELIX_DO_IF(status, remoteShell_create(bi->shellMediator, maxConn, &bi->remoteShell));
- status = CELIX_DO_IF(status, connectionListener_create(bi->remoteShell, port, &bi->connectionListener));
- status = CELIX_DO_IF(status, connectionListener_start(bi->connectionListener));
-
- return status;
-}
-
-celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
- celix_status_t status = CELIX_SUCCESS;
- bundle_instance_pt bi = (bundle_instance_pt) userData;
-
- connectionListener_stop(bi->connectionListener);
- shellMediator_stop(bi->shellMediator);
- shellMediator_destroy(bi->shellMediator);
-
- remoteShell_stopConnections(bi->remoteShell);
-
- status = logHelper_stop(bi->loghelper);
-
- return status;
-}
-
-celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
- celix_status_t status = CELIX_SUCCESS;
- bundle_instance_pt bi = (bundle_instance_pt) userData;
-
- connectionListener_destroy(bi->connectionListener);
- status = logHelper_destroy(&bi->loghelper);
-
- return status;
-}
-
-static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context) {
- return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_PORT);
-}
-
-static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context) {
- return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_MAXCONN);
-}
-
-static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char* propertyName, int defaultValue) {
- const char *strValue = NULL;
- int value;
-
- bundleContext_getProperty(context, propertyName, &strValue);
- if (strValue != NULL) {
- char* endptr = (char*)strValue;
-
- errno = 0;
- value = strtol(strValue, &endptr, 10);
- if (*endptr || errno != 0) {
- logHelper_log(bi->loghelper, OSGI_LOGSERVICE_WARNING, "incorrect format for %s", propertyName);
- value = defaultValue;
- }
- }
- else {
- value = defaultValue;
- }
-
- return value;
-}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/connection_listener.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/connection_listener.c b/remote_shell/private/src/connection_listener.c
deleted file mode 100644
index 3bef9e5..0000000
--- a/remote_shell/private/src/connection_listener.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-/*
- * connection_listener.c
- *
- * \date Nov 4, 2012
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <celix_errno.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <fcntl.h>
-
-#include "log_service.h"
-#include "log_helper.h"
-
-#include "connection_listener.h"
-
-#include "shell_mediator.h"
-#include "remote_shell.h"
-
-#define CONNECTION_LISTENER_TIMEOUT_SEC 5
-
-struct connection_listener {
- //constant
- int port;
- log_helper_pt* loghelper;
- remote_shell_pt remoteShell;
- celix_thread_mutex_t mutex;
-
- //protected by mutex
- bool running;
- celix_thread_t thread;
- fd_set pollset;
-};
-
-static void* connection_listener_thread(void *data);
-
-celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance) {
- celix_status_t status = CELIX_SUCCESS;
- (*instance) = calloc(1, sizeof(**instance));
-
- if ((*instance) != NULL) {
- (*instance)->port = port;
- (*instance)->remoteShell = remoteShell;
- (*instance)->running = false;
- (*instance)->loghelper = remoteShell->loghelper;
-
- FD_ZERO(&(*instance)-> pollset);
-
- status = celixThreadMutex_create(&(*instance)->mutex, NULL);
- } else {
- status = CELIX_ENOMEM;
- }
- return status;
-}
-
-celix_status_t connectionListener_start(connection_listener_pt instance) {
- celix_status_t status = CELIX_SUCCESS;
- celixThreadMutex_lock(&instance->mutex);
- celixThread_create(&instance->thread, NULL, connection_listener_thread, instance);
- celixThreadMutex_unlock(&instance->mutex);
- return status;
-}
-
-celix_status_t connectionListener_stop(connection_listener_pt instance) {
- celix_status_t status = CELIX_SUCCESS;
- celix_thread_t thread;
- fd_set pollset;
-
- instance->running = false;
- FD_ZERO(&pollset);
-
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "CONNECTION_LISTENER: Stopping thread\n");
-
- celixThreadMutex_lock(&instance->mutex);
- thread = instance->thread;
-
- pollset = instance->pollset;
- celixThreadMutex_unlock(&instance->mutex);
-
- celixThread_join(thread, NULL);
- return status;
-}
-
-celix_status_t connectionListener_destroy(connection_listener_pt instance) {
- free(instance);
-
- return CELIX_SUCCESS;
-}
-
-static void* connection_listener_thread(void *data) {
- celix_status_t status = CELIX_BUNDLE_EXCEPTION;
- connection_listener_pt instance = data;
- struct timeval timeout; /* Timeout for select */
- fd_set active_fd_set;
- FD_ZERO(&active_fd_set);
- int listenSocket = 0;
- int on = 1;
-
- struct addrinfo *result, *rp;
- struct addrinfo hints;
-
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
- hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
- hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
- hints.ai_protocol = 0; /* Any protocol */
- hints.ai_canonname = NULL;
- hints.ai_addr = NULL;
- hints.ai_next = NULL;
-
- char portStr[10];
- snprintf(&portStr[0], 10, "%d", instance->port);
-
- getaddrinfo(NULL, portStr, &hints, &result);
-
- for (rp = result; rp != NULL && status == CELIX_BUNDLE_EXCEPTION; rp = rp->ai_next) {
-
- status = CELIX_BUNDLE_EXCEPTION;
-
- /* Create socket */
- listenSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
- if (listenSocket < 0) {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating socket: %s", strerror(errno));
- }
- else if (setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)) < 0) {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot set socket option: %s", strerror(errno));
- }
- else if (bind(listenSocket, rp->ai_addr, rp->ai_addrlen) < 0) {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot bind: %s", strerror(errno));
- }
- else if (listen(listenSocket, 5) < 0) {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "listen failed: %s", strerror(errno));
- }
- else {
- status = CELIX_SUCCESS;
- }
- }
-
- if (status == CELIX_SUCCESS) {
-
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "Remote Shell accepting connections on port %d", instance->port);
-
- celixThreadMutex_lock(&instance->mutex);
- instance->pollset = active_fd_set;
- celixThreadMutex_unlock(&instance->mutex);
-
- instance->running = true;
-
- while (status == CELIX_SUCCESS && instance->running) {
- int selectRet = -1;
- do {
- timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
- timeout.tv_usec = 0;
-
- FD_ZERO(&active_fd_set);
- FD_SET(listenSocket, &active_fd_set);
-
- selectRet = select(listenSocket + 1, &active_fd_set, NULL, NULL, &timeout);
- } while (selectRet == -1 && errno == EINTR && instance->running == true);
- if (selectRet < 0) {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "select on listenSocket failed: %s", strerror(errno));
- status = CELIX_BUNDLE_EXCEPTION;
- }
- else if (selectRet == 0) {
- /* do nothing here */
- }
- else if (FD_ISSET(listenSocket, &active_fd_set)) {
- int acceptedSocket = accept(listenSocket, NULL, NULL);
-
- if (acceptedSocket < 0) {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: accept failed: %s.", strerror(errno));
- status = CELIX_BUNDLE_EXCEPTION;
- }
- else {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: connection established.");
- remoteShell_addConnection(instance->remoteShell, acceptedSocket);
- }
- }
- else {
- logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_DEBUG, "REMOTE_SHELL: received data on a not-expected file-descriptor?");
- }
- }
- }
-
- if (listenSocket >= 0) {
- close(listenSocket);
- }
-
- freeaddrinfo(result);
-
- return NULL;
-}
-
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/remote_shell.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/remote_shell.c b/remote_shell/private/src/remote_shell.c
deleted file mode 100644
index 8f42778..0000000
--- a/remote_shell/private/src/remote_shell.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-/*
- * remote_shell.c
- *
- * \date Nov 4, 2012
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <utils.h>
-#include <array_list.h>
-#include <sys/socket.h>
-
-#include "log_helper.h"
-
-#include "log_service.h"
-#include "remote_shell.h"
-
-#define COMMAND_BUFF_SIZE (256)
-
-#define RS_PROMPT ("-> ")
-#define RS_WELCOME ("\n---- Apache Celix Remote Shell ----\n---- Type exit to disconnect ----\n\n-> ")
-#define RS_GOODBYE ("Goobye!\n")
-#define RS_ERROR ("Error executing command!\n")
-#define RS_MAXIMUM_CONNECTIONS_REACHED ("Maximum number of connections reached. Disconnecting ...\n")
-
-#define CONNECTION_LISTENER_TIMEOUT_SEC 5
-
-
-
-struct connection {
- remote_shell_pt parent;
- FILE *socketStream;
- fd_set pollset;
- bool threadRunning;
-};
-
-typedef struct connection *connection_pt;
-
-static celix_status_t remoteShell_connection_print(connection_pt connection, char * text);
-static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command);
-static void* remoteShell_connection_run(void *data);
-
-celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance) {
- celix_status_t status = CELIX_SUCCESS;
- (*instance) = calloc(1, sizeof(**instance));
- if ((*instance) != NULL) {
- (*instance)->mediator = mediator;
- (*instance)->maximumConnections = maximumConnections;
- (*instance)->connections = NULL;
- (*instance)->loghelper = &mediator->loghelper;
-
- status = celixThreadMutex_create(&(*instance)->mutex, NULL);
-
- if (status == CELIX_SUCCESS) {
- status = arrayList_create(&(*instance)->connections);
- }
- } else {
- status = CELIX_ENOMEM;
- }
- return status;
-}
-
-celix_status_t remoteShell_destroy(remote_shell_pt instance) {
- celix_status_t status = CELIX_SUCCESS;
-
- remoteShell_stopConnections(instance);
-
- celixThreadMutex_lock(&instance->mutex);
- arrayList_destroy(instance->connections);
- celixThreadMutex_unlock(&instance->mutex);
-
- return status;
-}
-
-celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket) {
- celix_status_t status = CELIX_SUCCESS;
- connection_pt connection = calloc(1, sizeof(struct connection));
-
- if (connection != NULL) {
- connection->parent = instance;
- connection->threadRunning = false;
- connection->socketStream = fdopen(socket, "w");
-
- if (connection->socketStream != NULL) {
-
- celixThreadMutex_lock(&instance->mutex);
-
- if (arrayList_size(instance->connections) < instance->maximumConnections) {
- celix_thread_t connectionRunThread = celix_thread_default;
- arrayList_add(instance->connections, connection);
- status = celixThread_create(&connectionRunThread, NULL, &remoteShell_connection_run, connection);
- } else {
- status = CELIX_BUNDLE_EXCEPTION;
- remoteShell_connection_print(connection, RS_MAXIMUM_CONNECTIONS_REACHED);
- }
- celixThreadMutex_unlock(&instance->mutex);
-
- } else {
- status = CELIX_BUNDLE_EXCEPTION;
- }
- } else {
- status = CELIX_ENOMEM;
- }
-
- if (status != CELIX_SUCCESS && connection != NULL) {
- if (connection->socketStream != NULL) {
- fclose(connection->socketStream);
- }
- free(connection);
- }
-
- return status;
-}
-
-celix_status_t remoteShell_stopConnections(remote_shell_pt instance) {
- celix_status_t status = CELIX_SUCCESS;
- int length = 0;
- int i = 0;
-
- celixThreadMutex_lock(&instance->mutex);
- length = arrayList_size(instance->connections);
-
- for (i = 0; i < length; i += 1) {
- connection_pt connection = arrayList_get(instance->connections, i);
- connection->threadRunning = false;
- }
-
- celixThreadMutex_unlock(&instance->mutex);
-
- return status;
-}
-
-void *remoteShell_connection_run(void *data) {
- celix_status_t status = CELIX_SUCCESS;
- connection_pt connection = data;
- size_t len;
- int result;
- struct timeval timeout; /* Timeout for select */
-
- int fd = fileno(connection->socketStream);
-
- connection->threadRunning = true;
- status = remoteShell_connection_print(connection, RS_WELCOME);
-
- while (status == CELIX_SUCCESS && connection->threadRunning == true) {
- do {
- timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
- timeout.tv_usec = 0;
-
- FD_ZERO(&connection->pollset);
- FD_SET(fd, &connection->pollset);
- result = select(fd + 1, &connection->pollset, NULL, NULL, &timeout);
- } while (result == -1 && errno == EINTR && connection->threadRunning == true);
-
- /* The socket_fd has data available to be read */
- if (result > 0 && FD_ISSET(fd, &connection->pollset)) {
- char buff[COMMAND_BUFF_SIZE];
-
- len = recv(fd, buff, COMMAND_BUFF_SIZE - 1, 0);
- if (len < COMMAND_BUFF_SIZE) {
- celix_status_t commandStatus = CELIX_SUCCESS;
- buff[len] = '\0';
-
- commandStatus = remoteShell_connection_execute(connection, buff);
-
- if (commandStatus == CELIX_SUCCESS) {
- remoteShell_connection_print(connection, RS_PROMPT);
- } else if (commandStatus == CELIX_FILE_IO_EXCEPTION) {
- //exit command
- break;
- } else { //error
- remoteShell_connection_print(connection, RS_ERROR);
- remoteShell_connection_print(connection, RS_PROMPT);
- }
-
- } else {
- logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: Error while retrieving data");
- }
- }
- }
-
- remoteShell_connection_print(connection, RS_GOODBYE);
-
- logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: Closing socket");
- celixThreadMutex_lock(&connection->parent->mutex);
- arrayList_removeElement(connection->parent->connections, connection);
- celixThreadMutex_unlock(&connection->parent->mutex);
-
- fclose(connection->socketStream);
-
- return NULL;
-}
-
-static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command) {
- celix_status_t status = CELIX_SUCCESS;
-
- if (status == CELIX_SUCCESS) {
- char *dline = strdup(command);
- char *line = utils_stringTrim(dline);
- int len = strlen(line);
-
- if (len == 0) {
- //ignore
- } else if (len == 4 && strncmp("exit", line, 4) == 0) {
- status = CELIX_FILE_IO_EXCEPTION;
- } else {
- status = shellMediator_executeCommand(connection->parent->mediator, line, connection->socketStream, connection->socketStream);
- fflush(connection->socketStream);
- }
-
- free(dline);
- }
-
- return status;
-}
-
-celix_status_t remoteShell_connection_print(connection_pt connection, char *text) {
- size_t len = strlen(text);
- int fd = fileno(connection->socketStream);
- return (send(fd, text, len, 0) > 0) ? CELIX_SUCCESS : CELIX_FILE_IO_EXCEPTION;
-}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/shell_mediator.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/shell_mediator.c b/remote_shell/private/src/shell_mediator.c
deleted file mode 100644
index d9722a9..0000000
--- a/remote_shell/private/src/shell_mediator.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- *Licensed to the Apache Software Foundation (ASF) under one
- *or more contributor license agreements. See the NOTICE file
- *distributed with this work for additional information
- *regarding copyright ownership. The ASF licenses this file
- *to you 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.
- */
-/*
- * shell_mediator.c
- *
- * \date Nov 4, 2012
- * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- * \copyright Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <utils.h>
-#include <shell.h>
-#include <service_tracker.h>
-#include <command.h>
-#include <sys/socket.h>
-
-#include "log_helper.h"
-#include "log_service.h"
-#include "shell_mediator.h"
-
-static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service);
-static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service);
-
-celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance) {
- celix_status_t status = CELIX_SUCCESS;
- service_tracker_customizer_pt customizer = NULL;
-
- (*instance) = (shell_mediator_pt) calloc(1, sizeof(**instance));
- if ((*instance) != NULL) {
-
- (*instance)->context = context;
- (*instance)->tracker = NULL;
- (*instance)->shellService = NULL;
-
- status = logHelper_create(context, &(*instance)->loghelper);
-
- status = CELIX_DO_IF(status, celixThreadMutex_create(&(*instance)->mutex, NULL));
-
- status = CELIX_DO_IF(status, serviceTrackerCustomizer_create((*instance), NULL, shellMediator_addedService,
- NULL, shellMediator_removedService, &customizer));
- status = CELIX_DO_IF(status, serviceTracker_create(context, (char * )OSGI_SHELL_SERVICE_NAME, customizer, &(*instance)->tracker));
-
- if (status == CELIX_SUCCESS) {
- logHelper_start((*instance)->loghelper);
- serviceTracker_open((*instance)->tracker);
- }
- } else {
- status = CELIX_ENOMEM;
- }
-
- if ((status != CELIX_SUCCESS) && ((*instance) != NULL)){
- logHelper_log((*instance)->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating shell_mediator, error code is %i\n", status);
- }
- return status;
-}
-
-celix_status_t shellMediator_stop(shell_mediator_pt instance) {
- service_tracker_pt tracker;
- celixThreadMutex_lock(&instance->mutex);
- tracker = instance->tracker;
- celixThreadMutex_unlock(&instance->mutex);
-
- if (tracker != NULL) {
- serviceTracker_close(tracker);
- }
-
- return CELIX_SUCCESS;
-}
-
-celix_status_t shellMediator_destroy(shell_mediator_pt instance) {
- celix_status_t status = CELIX_SUCCESS;
-
- celixThreadMutex_lock(&instance->mutex);
-
- instance->shellService = NULL;
- serviceTracker_destroy(instance->tracker);
- logHelper_stop(instance->loghelper);
- status = logHelper_destroy(&instance->loghelper);
- celixThreadMutex_destroy(&instance->mutex);
-
-
- free(instance);
-
-
- return status;
-}
-
-celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err) {
- celix_status_t status = CELIX_SUCCESS;
-
- celixThreadMutex_lock(&instance->mutex);
-
-
- if (instance->shellService != NULL) {
- instance->shellService->executeCommand(instance->shellService->shell, command, out, err);
- }
-
- celixThreadMutex_unlock(&instance->mutex);
-
- return status;
-}
-
-static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service) {
- celix_status_t status = CELIX_SUCCESS;
- shell_mediator_pt instance = (shell_mediator_pt) handler;
- celixThreadMutex_lock(&instance->mutex);
- instance->shellService = (shell_service_pt) service;
- celixThreadMutex_unlock(&instance->mutex);
- return status;
-}
-
-
-static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service) {
- celix_status_t status = CELIX_SUCCESS;
- shell_mediator_pt instance = (shell_mediator_pt) handler;
- celixThreadMutex_lock(&instance->mutex);
- instance->shellService = NULL;
- celixThreadMutex_unlock(&instance->mutex);
- return status;
-}
-
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/activator.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/activator.c b/remote_shell/src/activator.c
new file mode 100644
index 0000000..541eda6
--- /dev/null
+++ b/remote_shell/src/activator.c
@@ -0,0 +1,153 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you 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.
+ */
+/*
+ * activator.c
+ *
+ * \date Nov 4, 2012
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <celix_errno.h>
+
+#include <stdlib.h>
+
+#include "bundle_activator.h"
+#include "bundle_context.h"
+
+#include "log_helper.h"
+#include "connection_listener.h"
+#include "shell_mediator.h"
+#include "remote_shell.h"
+
+#define REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME "remote.shell.telnet.port"
+#define DEFAULT_REMOTE_SHELL_TELNET_PORT 6666
+
+#define REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME "remote.shell.telnet.maxconn"
+#define DEFAULT_REMOTE_SHELL_TELNET_MAXCONN 2
+
+struct bundle_instance {
+ log_helper_pt loghelper;
+ shell_mediator_pt shellMediator;
+ remote_shell_pt remoteShell;
+ connection_listener_pt connectionListener;
+};
+
+typedef struct bundle_instance *bundle_instance_pt;
+
+static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context);
+static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context);
+static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char * propertyName, int defaultValue);
+
+celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ bundle_instance_pt bi = (bundle_instance_pt) calloc(1, sizeof(struct bundle_instance));
+
+ if (!bi)
+ {
+ status = CELIX_ENOMEM;
+ }
+ else if (userData != NULL) {
+ bi->shellMediator = NULL;
+ bi->remoteShell = NULL;
+ bi->connectionListener = NULL;
+
+ status = logHelper_create(context, &bi->loghelper);
+
+ (*userData) = bi;
+ } else {
+ status = CELIX_ILLEGAL_ARGUMENT;
+ free(bi);
+ }
+
+ return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
+ celix_status_t status = CELIX_SUCCESS;
+ bundle_instance_pt bi = (bundle_instance_pt) userData;
+
+ int port = bundleActivator_getPort(bi, context);
+ int maxConn = bundleActivator_getMaximumConnections(bi, context);
+
+ status = logHelper_start(bi->loghelper);
+
+ status = CELIX_DO_IF(status, shellMediator_create(context, &bi->shellMediator));
+ status = CELIX_DO_IF(status, remoteShell_create(bi->shellMediator, maxConn, &bi->remoteShell));
+ status = CELIX_DO_IF(status, connectionListener_create(bi->remoteShell, port, &bi->connectionListener));
+ status = CELIX_DO_IF(status, connectionListener_start(bi->connectionListener));
+
+ return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
+ celix_status_t status = CELIX_SUCCESS;
+ bundle_instance_pt bi = (bundle_instance_pt) userData;
+
+ connectionListener_stop(bi->connectionListener);
+ shellMediator_stop(bi->shellMediator);
+ shellMediator_destroy(bi->shellMediator);
+
+ remoteShell_stopConnections(bi->remoteShell);
+
+ status = logHelper_stop(bi->loghelper);
+
+ return status;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
+ celix_status_t status = CELIX_SUCCESS;
+ bundle_instance_pt bi = (bundle_instance_pt) userData;
+
+ connectionListener_destroy(bi->connectionListener);
+ status = logHelper_destroy(&bi->loghelper);
+
+ return status;
+}
+
+static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context) {
+ return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_PORT);
+}
+
+static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context) {
+ return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_MAXCONN);
+}
+
+static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char* propertyName, int defaultValue) {
+ const char *strValue = NULL;
+ int value;
+
+ bundleContext_getProperty(context, propertyName, &strValue);
+ if (strValue != NULL) {
+ char* endptr = (char*)strValue;
+
+ errno = 0;
+ value = strtol(strValue, &endptr, 10);
+ if (*endptr || errno != 0) {
+ logHelper_log(bi->loghelper, OSGI_LOGSERVICE_WARNING, "incorrect format for %s", propertyName);
+ value = defaultValue;
+ }
+ }
+ else {
+ value = defaultValue;
+ }
+
+ return value;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/connection_listener.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/connection_listener.c b/remote_shell/src/connection_listener.c
new file mode 100644
index 0000000..3bef9e5
--- /dev/null
+++ b/remote_shell/src/connection_listener.c
@@ -0,0 +1,221 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you 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.
+ */
+/*
+ * connection_listener.c
+ *
+ * \date Nov 4, 2012
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <celix_errno.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <fcntl.h>
+
+#include "log_service.h"
+#include "log_helper.h"
+
+#include "connection_listener.h"
+
+#include "shell_mediator.h"
+#include "remote_shell.h"
+
+#define CONNECTION_LISTENER_TIMEOUT_SEC 5
+
+struct connection_listener {
+ //constant
+ int port;
+ log_helper_pt* loghelper;
+ remote_shell_pt remoteShell;
+ celix_thread_mutex_t mutex;
+
+ //protected by mutex
+ bool running;
+ celix_thread_t thread;
+ fd_set pollset;
+};
+
+static void* connection_listener_thread(void *data);
+
+celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance) {
+ celix_status_t status = CELIX_SUCCESS;
+ (*instance) = calloc(1, sizeof(**instance));
+
+ if ((*instance) != NULL) {
+ (*instance)->port = port;
+ (*instance)->remoteShell = remoteShell;
+ (*instance)->running = false;
+ (*instance)->loghelper = remoteShell->loghelper;
+
+ FD_ZERO(&(*instance)-> pollset);
+
+ status = celixThreadMutex_create(&(*instance)->mutex, NULL);
+ } else {
+ status = CELIX_ENOMEM;
+ }
+ return status;
+}
+
+celix_status_t connectionListener_start(connection_listener_pt instance) {
+ celix_status_t status = CELIX_SUCCESS;
+ celixThreadMutex_lock(&instance->mutex);
+ celixThread_create(&instance->thread, NULL, connection_listener_thread, instance);
+ celixThreadMutex_unlock(&instance->mutex);
+ return status;
+}
+
+celix_status_t connectionListener_stop(connection_listener_pt instance) {
+ celix_status_t status = CELIX_SUCCESS;
+ celix_thread_t thread;
+ fd_set pollset;
+
+ instance->running = false;
+ FD_ZERO(&pollset);
+
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "CONNECTION_LISTENER: Stopping thread\n");
+
+ celixThreadMutex_lock(&instance->mutex);
+ thread = instance->thread;
+
+ pollset = instance->pollset;
+ celixThreadMutex_unlock(&instance->mutex);
+
+ celixThread_join(thread, NULL);
+ return status;
+}
+
+celix_status_t connectionListener_destroy(connection_listener_pt instance) {
+ free(instance);
+
+ return CELIX_SUCCESS;
+}
+
+static void* connection_listener_thread(void *data) {
+ celix_status_t status = CELIX_BUNDLE_EXCEPTION;
+ connection_listener_pt instance = data;
+ struct timeval timeout; /* Timeout for select */
+ fd_set active_fd_set;
+ FD_ZERO(&active_fd_set);
+ int listenSocket = 0;
+ int on = 1;
+
+ struct addrinfo *result, *rp;
+ struct addrinfo hints;
+
+ memset(&hints, 0, sizeof(struct addrinfo));
+ hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
+ hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
+ hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
+ hints.ai_protocol = 0; /* Any protocol */
+ hints.ai_canonname = NULL;
+ hints.ai_addr = NULL;
+ hints.ai_next = NULL;
+
+ char portStr[10];
+ snprintf(&portStr[0], 10, "%d", instance->port);
+
+ getaddrinfo(NULL, portStr, &hints, &result);
+
+ for (rp = result; rp != NULL && status == CELIX_BUNDLE_EXCEPTION; rp = rp->ai_next) {
+
+ status = CELIX_BUNDLE_EXCEPTION;
+
+ /* Create socket */
+ listenSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+ if (listenSocket < 0) {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating socket: %s", strerror(errno));
+ }
+ else if (setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)) < 0) {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot set socket option: %s", strerror(errno));
+ }
+ else if (bind(listenSocket, rp->ai_addr, rp->ai_addrlen) < 0) {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot bind: %s", strerror(errno));
+ }
+ else if (listen(listenSocket, 5) < 0) {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "listen failed: %s", strerror(errno));
+ }
+ else {
+ status = CELIX_SUCCESS;
+ }
+ }
+
+ if (status == CELIX_SUCCESS) {
+
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "Remote Shell accepting connections on port %d", instance->port);
+
+ celixThreadMutex_lock(&instance->mutex);
+ instance->pollset = active_fd_set;
+ celixThreadMutex_unlock(&instance->mutex);
+
+ instance->running = true;
+
+ while (status == CELIX_SUCCESS && instance->running) {
+ int selectRet = -1;
+ do {
+ timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
+ timeout.tv_usec = 0;
+
+ FD_ZERO(&active_fd_set);
+ FD_SET(listenSocket, &active_fd_set);
+
+ selectRet = select(listenSocket + 1, &active_fd_set, NULL, NULL, &timeout);
+ } while (selectRet == -1 && errno == EINTR && instance->running == true);
+ if (selectRet < 0) {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "select on listenSocket failed: %s", strerror(errno));
+ status = CELIX_BUNDLE_EXCEPTION;
+ }
+ else if (selectRet == 0) {
+ /* do nothing here */
+ }
+ else if (FD_ISSET(listenSocket, &active_fd_set)) {
+ int acceptedSocket = accept(listenSocket, NULL, NULL);
+
+ if (acceptedSocket < 0) {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: accept failed: %s.", strerror(errno));
+ status = CELIX_BUNDLE_EXCEPTION;
+ }
+ else {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: connection established.");
+ remoteShell_addConnection(instance->remoteShell, acceptedSocket);
+ }
+ }
+ else {
+ logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_DEBUG, "REMOTE_SHELL: received data on a not-expected file-descriptor?");
+ }
+ }
+ }
+
+ if (listenSocket >= 0) {
+ close(listenSocket);
+ }
+
+ freeaddrinfo(result);
+
+ return NULL;
+}
+
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/connection_listener.h
----------------------------------------------------------------------
diff --git a/remote_shell/src/connection_listener.h b/remote_shell/src/connection_listener.h
new file mode 100644
index 0000000..392d6ec
--- /dev/null
+++ b/remote_shell/src/connection_listener.h
@@ -0,0 +1,42 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you 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.
+ */
+/*
+ * connection_listener.h
+ *
+ * \date Nov 4, 2012
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef connectionListener_H_
+#define connectionListener_H_
+
+#include <bundle_context.h>
+#include <celix_errno.h>
+
+#include "remote_shell.h"
+
+typedef struct connection_listener *connection_listener_pt;
+
+celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance);
+celix_status_t connectionListener_destroy(connection_listener_pt instance);
+celix_status_t connectionListener_start(connection_listener_pt instance);
+celix_status_t connectionListener_stop(connection_listener_pt instance);
+
+#endif /* connectionListener_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/remote_shell.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/remote_shell.c b/remote_shell/src/remote_shell.c
new file mode 100644
index 0000000..8f42778
--- /dev/null
+++ b/remote_shell/src/remote_shell.c
@@ -0,0 +1,242 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you 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.
+ */
+/*
+ * remote_shell.c
+ *
+ * \date Nov 4, 2012
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <utils.h>
+#include <array_list.h>
+#include <sys/socket.h>
+
+#include "log_helper.h"
+
+#include "log_service.h"
+#include "remote_shell.h"
+
+#define COMMAND_BUFF_SIZE (256)
+
+#define RS_PROMPT ("-> ")
+#define RS_WELCOME ("\n---- Apache Celix Remote Shell ----\n---- Type exit to disconnect ----\n\n-> ")
+#define RS_GOODBYE ("Goobye!\n")
+#define RS_ERROR ("Error executing command!\n")
+#define RS_MAXIMUM_CONNECTIONS_REACHED ("Maximum number of connections reached. Disconnecting ...\n")
+
+#define CONNECTION_LISTENER_TIMEOUT_SEC 5
+
+
+
+struct connection {
+ remote_shell_pt parent;
+ FILE *socketStream;
+ fd_set pollset;
+ bool threadRunning;
+};
+
+typedef struct connection *connection_pt;
+
+static celix_status_t remoteShell_connection_print(connection_pt connection, char * text);
+static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command);
+static void* remoteShell_connection_run(void *data);
+
+celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance) {
+ celix_status_t status = CELIX_SUCCESS;
+ (*instance) = calloc(1, sizeof(**instance));
+ if ((*instance) != NULL) {
+ (*instance)->mediator = mediator;
+ (*instance)->maximumConnections = maximumConnections;
+ (*instance)->connections = NULL;
+ (*instance)->loghelper = &mediator->loghelper;
+
+ status = celixThreadMutex_create(&(*instance)->mutex, NULL);
+
+ if (status == CELIX_SUCCESS) {
+ status = arrayList_create(&(*instance)->connections);
+ }
+ } else {
+ status = CELIX_ENOMEM;
+ }
+ return status;
+}
+
+celix_status_t remoteShell_destroy(remote_shell_pt instance) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ remoteShell_stopConnections(instance);
+
+ celixThreadMutex_lock(&instance->mutex);
+ arrayList_destroy(instance->connections);
+ celixThreadMutex_unlock(&instance->mutex);
+
+ return status;
+}
+
+celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket) {
+ celix_status_t status = CELIX_SUCCESS;
+ connection_pt connection = calloc(1, sizeof(struct connection));
+
+ if (connection != NULL) {
+ connection->parent = instance;
+ connection->threadRunning = false;
+ connection->socketStream = fdopen(socket, "w");
+
+ if (connection->socketStream != NULL) {
+
+ celixThreadMutex_lock(&instance->mutex);
+
+ if (arrayList_size(instance->connections) < instance->maximumConnections) {
+ celix_thread_t connectionRunThread = celix_thread_default;
+ arrayList_add(instance->connections, connection);
+ status = celixThread_create(&connectionRunThread, NULL, &remoteShell_connection_run, connection);
+ } else {
+ status = CELIX_BUNDLE_EXCEPTION;
+ remoteShell_connection_print(connection, RS_MAXIMUM_CONNECTIONS_REACHED);
+ }
+ celixThreadMutex_unlock(&instance->mutex);
+
+ } else {
+ status = CELIX_BUNDLE_EXCEPTION;
+ }
+ } else {
+ status = CELIX_ENOMEM;
+ }
+
+ if (status != CELIX_SUCCESS && connection != NULL) {
+ if (connection->socketStream != NULL) {
+ fclose(connection->socketStream);
+ }
+ free(connection);
+ }
+
+ return status;
+}
+
+celix_status_t remoteShell_stopConnections(remote_shell_pt instance) {
+ celix_status_t status = CELIX_SUCCESS;
+ int length = 0;
+ int i = 0;
+
+ celixThreadMutex_lock(&instance->mutex);
+ length = arrayList_size(instance->connections);
+
+ for (i = 0; i < length; i += 1) {
+ connection_pt connection = arrayList_get(instance->connections, i);
+ connection->threadRunning = false;
+ }
+
+ celixThreadMutex_unlock(&instance->mutex);
+
+ return status;
+}
+
+void *remoteShell_connection_run(void *data) {
+ celix_status_t status = CELIX_SUCCESS;
+ connection_pt connection = data;
+ size_t len;
+ int result;
+ struct timeval timeout; /* Timeout for select */
+
+ int fd = fileno(connection->socketStream);
+
+ connection->threadRunning = true;
+ status = remoteShell_connection_print(connection, RS_WELCOME);
+
+ while (status == CELIX_SUCCESS && connection->threadRunning == true) {
+ do {
+ timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
+ timeout.tv_usec = 0;
+
+ FD_ZERO(&connection->pollset);
+ FD_SET(fd, &connection->pollset);
+ result = select(fd + 1, &connection->pollset, NULL, NULL, &timeout);
+ } while (result == -1 && errno == EINTR && connection->threadRunning == true);
+
+ /* The socket_fd has data available to be read */
+ if (result > 0 && FD_ISSET(fd, &connection->pollset)) {
+ char buff[COMMAND_BUFF_SIZE];
+
+ len = recv(fd, buff, COMMAND_BUFF_SIZE - 1, 0);
+ if (len < COMMAND_BUFF_SIZE) {
+ celix_status_t commandStatus = CELIX_SUCCESS;
+ buff[len] = '\0';
+
+ commandStatus = remoteShell_connection_execute(connection, buff);
+
+ if (commandStatus == CELIX_SUCCESS) {
+ remoteShell_connection_print(connection, RS_PROMPT);
+ } else if (commandStatus == CELIX_FILE_IO_EXCEPTION) {
+ //exit command
+ break;
+ } else { //error
+ remoteShell_connection_print(connection, RS_ERROR);
+ remoteShell_connection_print(connection, RS_PROMPT);
+ }
+
+ } else {
+ logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: Error while retrieving data");
+ }
+ }
+ }
+
+ remoteShell_connection_print(connection, RS_GOODBYE);
+
+ logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: Closing socket");
+ celixThreadMutex_lock(&connection->parent->mutex);
+ arrayList_removeElement(connection->parent->connections, connection);
+ celixThreadMutex_unlock(&connection->parent->mutex);
+
+ fclose(connection->socketStream);
+
+ return NULL;
+}
+
+static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ if (status == CELIX_SUCCESS) {
+ char *dline = strdup(command);
+ char *line = utils_stringTrim(dline);
+ int len = strlen(line);
+
+ if (len == 0) {
+ //ignore
+ } else if (len == 4 && strncmp("exit", line, 4) == 0) {
+ status = CELIX_FILE_IO_EXCEPTION;
+ } else {
+ status = shellMediator_executeCommand(connection->parent->mediator, line, connection->socketStream, connection->socketStream);
+ fflush(connection->socketStream);
+ }
+
+ free(dline);
+ }
+
+ return status;
+}
+
+celix_status_t remoteShell_connection_print(connection_pt connection, char *text) {
+ size_t len = strlen(text);
+ int fd = fileno(connection->socketStream);
+ return (send(fd, text, len, 0) > 0) ? CELIX_SUCCESS : CELIX_FILE_IO_EXCEPTION;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/remote_shell.h
----------------------------------------------------------------------
diff --git a/remote_shell/src/remote_shell.h b/remote_shell/src/remote_shell.h
new file mode 100644
index 0000000..55249a8
--- /dev/null
+++ b/remote_shell/src/remote_shell.h
@@ -0,0 +1,50 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you 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.
+ */
+/*
+ * remote_shell.h
+ *
+ * \date Nov 4, 2012
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef REMOTE_SHELL_H_
+#define REMOTE_SHELL_H_
+
+#include <bundle_context.h>
+#include <celix_errno.h>
+
+#include "shell_mediator.h"
+
+struct remote_shell {
+ log_helper_pt* loghelper;
+ shell_mediator_pt mediator;
+ celix_thread_mutex_t mutex;
+ int maximumConnections;
+
+ array_list_pt connections;
+};
+typedef struct remote_shell *remote_shell_pt;
+
+celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance);
+celix_status_t remoteShell_destroy(remote_shell_pt instance);
+celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket);
+celix_status_t remoteShell_stopConnections(remote_shell_pt instance);
+
+#endif /* REMOTE_SHELL_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/shell_mediator.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/shell_mediator.c b/remote_shell/src/shell_mediator.c
new file mode 100644
index 0000000..d9722a9
--- /dev/null
+++ b/remote_shell/src/shell_mediator.c
@@ -0,0 +1,139 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you 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.
+ */
+/*
+ * shell_mediator.c
+ *
+ * \date Nov 4, 2012
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <utils.h>
+#include <shell.h>
+#include <service_tracker.h>
+#include <command.h>
+#include <sys/socket.h>
+
+#include "log_helper.h"
+#include "log_service.h"
+#include "shell_mediator.h"
+
+static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service);
+static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service);
+
+celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance) {
+ celix_status_t status = CELIX_SUCCESS;
+ service_tracker_customizer_pt customizer = NULL;
+
+ (*instance) = (shell_mediator_pt) calloc(1, sizeof(**instance));
+ if ((*instance) != NULL) {
+
+ (*instance)->context = context;
+ (*instance)->tracker = NULL;
+ (*instance)->shellService = NULL;
+
+ status = logHelper_create(context, &(*instance)->loghelper);
+
+ status = CELIX_DO_IF(status, celixThreadMutex_create(&(*instance)->mutex, NULL));
+
+ status = CELIX_DO_IF(status, serviceTrackerCustomizer_create((*instance), NULL, shellMediator_addedService,
+ NULL, shellMediator_removedService, &customizer));
+ status = CELIX_DO_IF(status, serviceTracker_create(context, (char * )OSGI_SHELL_SERVICE_NAME, customizer, &(*instance)->tracker));
+
+ if (status == CELIX_SUCCESS) {
+ logHelper_start((*instance)->loghelper);
+ serviceTracker_open((*instance)->tracker);
+ }
+ } else {
+ status = CELIX_ENOMEM;
+ }
+
+ if ((status != CELIX_SUCCESS) && ((*instance) != NULL)){
+ logHelper_log((*instance)->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating shell_mediator, error code is %i\n", status);
+ }
+ return status;
+}
+
+celix_status_t shellMediator_stop(shell_mediator_pt instance) {
+ service_tracker_pt tracker;
+ celixThreadMutex_lock(&instance->mutex);
+ tracker = instance->tracker;
+ celixThreadMutex_unlock(&instance->mutex);
+
+ if (tracker != NULL) {
+ serviceTracker_close(tracker);
+ }
+
+ return CELIX_SUCCESS;
+}
+
+celix_status_t shellMediator_destroy(shell_mediator_pt instance) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ celixThreadMutex_lock(&instance->mutex);
+
+ instance->shellService = NULL;
+ serviceTracker_destroy(instance->tracker);
+ logHelper_stop(instance->loghelper);
+ status = logHelper_destroy(&instance->loghelper);
+ celixThreadMutex_destroy(&instance->mutex);
+
+
+ free(instance);
+
+
+ return status;
+}
+
+celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ celixThreadMutex_lock(&instance->mutex);
+
+
+ if (instance->shellService != NULL) {
+ instance->shellService->executeCommand(instance->shellService->shell, command, out, err);
+ }
+
+ celixThreadMutex_unlock(&instance->mutex);
+
+ return status;
+}
+
+static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ shell_mediator_pt instance = (shell_mediator_pt) handler;
+ celixThreadMutex_lock(&instance->mutex);
+ instance->shellService = (shell_service_pt) service;
+ celixThreadMutex_unlock(&instance->mutex);
+ return status;
+}
+
+
+static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ shell_mediator_pt instance = (shell_mediator_pt) handler;
+ celixThreadMutex_lock(&instance->mutex);
+ instance->shellService = NULL;
+ celixThreadMutex_unlock(&instance->mutex);
+ return status;
+}
+
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/shell_mediator.h
----------------------------------------------------------------------
diff --git a/remote_shell/src/shell_mediator.h b/remote_shell/src/shell_mediator.h
new file mode 100644
index 0000000..24e8250
--- /dev/null
+++ b/remote_shell/src/shell_mediator.h
@@ -0,0 +1,54 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements. See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership. The ASF licenses this file
+ *to you 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.
+ */
+/*
+ * shell_mediator.h
+ *
+ * \date Nov 4, 2012
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+
+#ifndef shellMediator_H_
+#define shellMediator_H_
+
+#include <bundle_context.h>
+#include <service_tracker.h>
+#include <celix_errno.h>
+
+#include <shell.h>
+
+struct shell_mediator {
+
+ log_helper_pt loghelper;
+ bundle_context_pt context;
+ service_tracker_pt tracker;
+ celix_thread_mutex_t mutex;
+
+ //protected by mutex
+ shell_service_pt shellService;
+};
+typedef struct shell_mediator *shell_mediator_pt;
+
+celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance);
+celix_status_t shellMediator_stop(shell_mediator_pt instance);
+celix_status_t shellMediator_destroy(shell_mediator_pt instance);
+celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err);
+
+#endif /* shellMediator_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/shell/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt
index 974d2ff..31822c4 100644
--- a/shell/CMakeLists.txt
+++ b/shell/CMakeLists.txt
@@ -18,38 +18,35 @@ celix_subproject(SHELL "Option to enable building the Shell bundles" ON DEPS LAU
if (SHELL)
find_package(CURL REQUIRED)
+ add_library(shell_api INTERFACE)
+ target_include_directories(shell_api INTERFACE include)
+
add_bundle(shell
SYMBOLIC_NAME "apache_celix_shell"
VERSION "2.0.0"
NAME "Apache Celix Shell"
-
SOURCES
+ src/activator
+ src/shell
+ src/lb_command
+ src/start_command
+ src/stop_command
+ src/install_command
+ src/update_command
+ src/uninstall_command
+ src/log_command
+ src/inspect_command
+ src/help_command
+ )
+ target_include_directories(shell PRIVATE src ${CURL_INCLUDE_DIRS})
+ target_link_libraries(shell PRIVATE Celix::shell_api ${CURL_LIBRARIES} Celix::log_service_api log_helper)
- private/src/activator
- private/src/shell
- private/src/lb_command
- private/src/start_command
- private/src/stop_command
- private/src/install_command
- private/src/update_command
- private/src/uninstall_command
- private/src/log_command
- private/src/inspect_command
- private/src/help_command
-
- ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
-
- )
-
- install_bundle(shell
+ install_bundle(shell
HEADERS
- public/include/shell.h public/include/command.h public/include/shell_constants.h
- )
+ include/shell.h include/command.h include/shell_constants.h
+ )
- include_directories("public/include")
- include_directories("private/include")
- include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
- include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
- include_directories(${CURL_INCLUDE_DIRS})
- target_link_libraries(shell celix_framework ${CURL_LIBRARIES})
+ #Setup target aliases to match external usage
+ add_library(Celix::shell_api ALIAS shell_api)
+ add_library(Celix::shell ALIAS shell)
endif (SHELL)