diff --git a/changelog.md b/changelog.md index 9b4b3de..cc9a9dd 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,11 @@ ## 0.4.0 _(unknown)_ +### Fixes + +* Fix meson build failure when gtest or jansson are not installed +* Fix crash if libfuse is not available at runtime + ## 0.3.0 _(Fri Jun 05 2020)_ ### Breaking Changes diff --git a/lib/webfuse/adapter/impl/session.c b/lib/webfuse/adapter/impl/session.c index 6bacd10..159f43a 100644 --- a/lib/webfuse/adapter/impl/session.c +++ b/lib/webfuse/adapter/impl/session.c @@ -109,8 +109,11 @@ bool wf_impl_session_add_filesystem( if (result) { struct wf_impl_filesystem * filesystem = wf_impl_filesystem_create(session, name, mountpoint); - wf_slist_append(&session->filesystems, &filesystem->item); result = (NULL != filesystem); + if (result) + { + wf_slist_append(&session->filesystems, &filesystem->item); + } } // cleanup on error diff --git a/meson.build b/meson.build index cea37e2..e08f828 100644 --- a/meson.build +++ b/meson.build @@ -76,7 +76,8 @@ webfuse_provider_static = static_library('webfuse_provider', webfuse_provider_static_dep = declare_dependency( include_directories: inc_dir, - link_with: webfuse_provider_static) + link_with: webfuse_provider_static, + dependencies: [webfuse_core_dep]) webfuse_provider = shared_library('webfuse_provider', 'lib/webfuse/provider/api.c', @@ -95,7 +96,8 @@ install_headers('include/webfuse_provider.h', subdir: 'webfuse') install_subdir('include/webfuse/provider', install_dir: 'include/webfuse') pkg_config.generate( - libraries: [webfuse_provider, jansson_dep, libwebsockets_dep], + libraries: [webfuse_provider], + requires: ['libwebsockets', 'jansson'], subdirs: '.', version: meson.project_version(), name: 'libwebfuse_provider', @@ -137,7 +139,7 @@ webfuse_adapter_static = static_library('webfuse_adapter', webfuse_adapter_static_dep = declare_dependency( include_directories: inc_dir, link_with: [webfuse_adapter_static], - dependencies: [libfuse_dep]) + dependencies: [webfuse_core_dep, libfuse_dep]) webfuse_adapter = shared_library('webfuse_adapter', 'lib/webfuse/adapter/api.c', @@ -156,7 +158,8 @@ install_headers('include/webfuse_adapter.h', subdir: 'webfuse') install_subdir('include/webfuse/adapter', install_dir: 'include/webfuse') pkg_config.generate( - libraries: [webfuse_adapter, jansson_dep, libwebsockets_dep, libfuse_dep], + libraries: [webfuse_adapter], + requires: ['fuse3', 'libwebsockets', 'jansson'], subdirs: '.', version: meson.project_version(), name: 'libwebfuse_adapter', @@ -170,7 +173,7 @@ endif if not without_tests gtest_dep = dependency('gtest', version: '>=1.10.0', fallback: ['gtest', 'gtest_dep']) -gmock_main_dep = dependency('gmock_main', version: '>=1.10.0', fallback: ['gtest', 'gmock_main_main_dep']) +gmock_main_dep = dependency('gmock_main', version: '>=1.10.0', fallback: ['gtest', 'gmock_main_dep']) fscheck = executable('fs_check', 'test/webfuse/tests/integration/fs_check.c') diff --git a/test/webfuse/tests/integration/provider.cc b/test/webfuse/tests/integration/provider.cc index e813b4d..a4b4473 100644 --- a/test/webfuse/tests/integration/provider.cc +++ b/test/webfuse/tests/integration/provider.cc @@ -9,6 +9,39 @@ using namespace std::chrono_literals; +namespace +{ + enum class ConnectionState + { + disconnected, + connected, + connecting + }; +} + +extern "C" +{ + +void +webfuse_test_provider_onconnected( + void * user_data) +{ + auto * fs = reinterpret_cast(user_data); + auto * connection_state = reinterpret_cast(wfp_static_filesystem_get_user_data(fs)); + *connection_state = ConnectionState::connected; +} + +void +webfuse_test_provider_ondisconnected( + void * user_data) +{ + auto * fs = reinterpret_cast(user_data); + auto * connection_state = reinterpret_cast(wfp_static_filesystem_get_user_data(fs)); + *connection_state = ConnectionState::disconnected; +} + +} + namespace webfuse_test { @@ -18,23 +51,40 @@ public: explicit Private(char const * url) : is_shutdown_requested(false) { + ConnectionState connection_state = ConnectionState::connecting; + config = wfp_client_config_create(); wfp_client_config_set_certpath(config, "client-cert.pem"); wfp_client_config_set_keypath(config, "client-key.pem"); wfp_client_config_set_ca_filepath(config, "server-cert.pem"); + wfp_client_config_set_onconnected(config, &webfuse_test_provider_onconnected); + wfp_client_config_set_ondisconnected(config, &webfuse_test_provider_ondisconnected); fs = wfp_static_filesystem_create(config); + wfp_static_filesystem_set_user_data(fs, reinterpret_cast(&connection_state)); wfp_static_filesystem_add_text(fs, "hello.txt", 0444, "Hello, World"); client = wfp_client_create(config); wfp_client_connect(client, url); - while (!wfp_impl_client_is_connected(client)) + while (ConnectionState::connecting == connection_state) { wfp_client_service(client); } - - thread = std::thread(Run, this); - std::this_thread::sleep_for(200ms); + + if (ConnectionState::connected == connection_state) + { + thread = std::thread(Run, this); + std::this_thread::sleep_for(200ms); + } + else + { + wfp_client_dispose(client); + + wfp_static_filesystem_dispose(fs); + wfp_client_config_dispose(config); + + throw std::runtime_error("unable to connect"); + } } ~Private() diff --git a/test/webfuse/utils/static_filesystem.c b/test/webfuse/utils/static_filesystem.c index 855564b..0f64733 100644 --- a/test/webfuse/utils/static_filesystem.c +++ b/test/webfuse/utils/static_filesystem.c @@ -38,6 +38,7 @@ struct wfp_static_filesystem struct wfp_static_filesystem_entry * entries; size_t size; size_t capacity; + void * user_data; }; static struct wfp_static_filesystem_entry * @@ -335,6 +336,7 @@ wfp_static_filesystem_create( filesystem->entries = malloc(sizeof(struct wfp_static_filesystem_entry) * WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY); filesystem->size = 0; filesystem->capacity = WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY; + filesystem->user_data = NULL; wfp_static_filesystem_add_dir(filesystem, 0, ""); @@ -402,3 +404,18 @@ wfp_static_filesystem_add_text( size_t length = strlen(content); wfp_static_filesystem_add(filesystem, path, mode, content, length); } + +void +wfp_static_filesystem_set_user_data( + struct wfp_static_filesystem * filesystem, + void * user_data) +{ + filesystem->user_data = user_data; +} + +void * +wfp_static_filesystem_get_user_data( + struct wfp_static_filesystem * filesystem) +{ + return filesystem->user_data; +} diff --git a/test/webfuse/utils/static_filesystem.h b/test/webfuse/utils/static_filesystem.h index bf23b88..d4d574a 100644 --- a/test/webfuse/utils/static_filesystem.h +++ b/test/webfuse/utils/static_filesystem.h @@ -56,6 +56,15 @@ wfp_static_filesystem_add_text( int mode, char const * content); +extern void +wfp_static_filesystem_set_user_data( + struct wfp_static_filesystem * filesystem, + void * user_data); + +extern void * +wfp_static_filesystem_get_user_data( + struct wfp_static_filesystem * filesystem); + #ifdef __cplusplus } #endif