From 0dc93a6f31adefdd7502fa587859553297b05692 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Fri, 5 Jun 2020 23:06:48 +0200 Subject: [PATCH 1/5] fix: fixed dependency of jansson and gmock_main --- meson.build | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index cea37e2..5b3ffbe 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', @@ -137,7 +138,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', @@ -170,7 +171,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') From 82dedba6a145ee0e33eb70cc0d3a0c40556f2517 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Fri, 5 Jun 2020 23:44:00 +0200 Subject: [PATCH 2/5] added fix --- changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.md b/changelog.md index 9b4b3de..f7af51b 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,10 @@ ## 0.4.0 _(unknown)_ +### Fixes + +* Fix meson build failure when gtest or jansson are not installed + ## 0.3.0 _(Fri Jun 05 2020)_ ### Breaking Changes From 38ef0ddd9a3517b255dcb54db8d2e1ed28f1d1ee Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 6 Jun 2020 00:00:08 +0200 Subject: [PATCH 3/5] fix: crash if libfuse is not available at runtime --- changelog.md | 1 + lib/webfuse/adapter/impl/session.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index f7af51b..cc9a9dd 100644 --- a/changelog.md +++ b/changelog.md @@ -5,6 +5,7 @@ ### 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)_ 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 From 11e45789baeb593512e56727ef9bd61d0820bf4a Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 6 Jun 2020 08:08:37 +0200 Subject: [PATCH 4/5] fix: requires section of pc files --- meson.build | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 5b3ffbe..e08f828 100644 --- a/meson.build +++ b/meson.build @@ -96,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', @@ -157,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', From 11565d22ade0208354791a4f232ea00ce16c07c5 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 6 Jun 2020 10:59:06 +0200 Subject: [PATCH 5/5] fix: prevent deadlock if libfuse is not available at runtime --- test/webfuse/tests/integration/provider.cc | 58 ++++++++++++++++++++-- test/webfuse/utils/static_filesystem.c | 17 +++++++ test/webfuse/utils/static_filesystem.h | 9 ++++ 3 files changed, 80 insertions(+), 4 deletions(-) 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