From c50a198321a47f87821f55351d17c022c434d745 Mon Sep 17 00:00:00 2001 From: nosamad Date: Sun, 31 Mar 2019 20:26:09 +0200 Subject: [PATCH 01/16] fixes verbosity option when set through command line --- Makefile | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 49a896e..38f3679 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,8 @@ OUT ?= $(PROJECT_ROOT)/.build UID ?= $(shell id -u) -CONTAINER_USER ?= $(UID) -CONTAINER_GROUP ?= $(shell id -g) +CONTAINER_USER ?= user +CONTAINER_GROUP ?= user CONTAINER_CGROUP_PARENT ?= HOST_CONTAINER ?= $(shell $(PROJECT_ROOT)/build/get_container_id.sh) @@ -97,7 +97,8 @@ CMAKEFLAGS += '-GNinja' BUILDSILENT := $(if $(BUILDVERBOSE),,1) $(BUILDSILENT)NINJAFLAGS += -v -DOCKER_RUNFLAGS += --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined +DOCKER_RUNFLAGS += --device /dev/fuse +DOCKER_RUNFLAGS += --cap-add SYS_ADMIN --security-opt apparmor:unconfined DOCKER_RUNFLAGS += --interactive DOCKER_RUNFLAGS += --rm @@ -118,10 +119,12 @@ DOCKER_BUILDARGS += OUT=$(CONTAINER_OUT) DOCKER_BUILDFLAGS += --rm DOCKER_BUILDFLAGS += $(addprefix --build-arg ,$(DOCKER_BUILDARGS)) +OUT_TARGETS += $(addprefix $(OUT)/,$(TARGETS)) + OUT_DIRS += $(OUT) OUT_DIRS += $(OUT)/docker OUT_DIRS += $(OUT)/src -OUT_DIRS += $(addprefix $(OUT)/,$(TARGETS)) +OUT_DIRS += $(addsuffix /usr/bin,$(OUT_TARGETS)) BUILD_TARGETS += $(addprefix build-,$(TARGETS)) CHECK_TARGETS += $(addprefix check-,$(TARGETS)) @@ -129,7 +132,7 @@ CLEAN_TARGETS += $(addprefix clean-,$(TARGETS)) RUN_TARGETS += $(addprefix run-,$(firstword $(TARGETS))) EXTRACT_TARGETS += $(patsubst $(OUT)/%.tar.gz,$(OUT)/src/%,$(FETCH_TARGETS)) DISCOVER_CC_TARGETS += $(addprefix discover-cc-,$(firstword $(TARGETS))) -RULE_TARGETS = $(addprefix $(OUT)/,$(addsuffix /rules.mk,$(TARGETS))) +RULE_TARGETS += $(addsuffix /rules.mk,$(OUT_TARGETS)) TARGETS := $(sort $(TARGETS)) @@ -151,21 +154,21 @@ container_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ image_rule = \ $$(OUT)/docker/$1: $$(OUT)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(PROJECT_ROOT)/Makefile; \ - $(SILENT)$$(call image,$1) + $$(SILENT)$$(call image,$1) image = \ $(call echo_if_silent,docker build $(call container_name,$1) $(OUT)) \ && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call container_name,$1) $(OUT) configure_rule = \ - $$(OUT)/$1/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ - $(SILENT)$$(call configure,$1) + $$(OUT)/$1/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/usr/bin/gdb; \ + $$(SILENT)$$(call configure,$1) configure = \ $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ && touch $(addprefix $(dir $@)/,include_dirs.txt) $@ build_rule = \ build-$1: $$(OUT)/$1/CMakeCache.txt; \ - $(SILENT)$$(call build,$1) + $$(SILENT)$$(call build,$1) build = $(call run,$1,ninja $(PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) check_rule = \ @@ -173,28 +176,28 @@ check_rule = \ memcheck_rule = \ memcheck-$1: build-$1; \ - $(SILENT)$$(call memcheck,$1) + $$(SILENT)$$(call memcheck,$1) memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) run_rule = \ run-$1: $$(OUT)/docker/$1; \ - $(SILENT)$$(call run,$1,/bin/bash,--tty) || true + $$(SILENT)$$(call run,$1,bash,--tty) || true run = $(call echo_if_silent,TARGET=$1 $2) && $(call container_run,$1,$2,$3) clean_rule = \ clean-$1: ; \ - $(SILENT)-$$(call clean,$1) + $$(SILENT)-$$(call clean,$1) clean = rm -rf $(OUT)/$1 discover_cc_settings_rule = \ $$(OUT)/$1/include_dirs.txt: $$(OUT)/$1/CMakeCache.txt; \ - $(SILENT)$$(call discover_cc_settings,$1) + $$(SILENT)$$(call discover_cc_settings,$1) discover_cc_settings = \ $(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<))) discover_cc_rule = \ discover-cc-$1: $$(OUT)/$1/include_dirs.txt; \ - $(SILENT)$$(call discover_cc,$1) + $$(SILENT)$$(call discover_cc,$1) discover_cc = cat $< # Rules @@ -259,7 +262,6 @@ debug-print-%: @printf '%s\n' '$*:' $($*) $(CHECK_TARGETS): GOALS := test -$(CHECK_TARGETS) $(MEMCHECK_TARGETS): CONTAINER_USER := user $(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): $(SILENT) \ From 3934e0b48181695611f9527e7241e1106a26185b Mon Sep 17 00:00:00 2001 From: nosamad Date: Sun, 31 Mar 2019 21:24:26 +0200 Subject: [PATCH 02/16] adds support for build type and allows to run gdb in container --- .travis.yml | 10 ++++++---- Makefile | 24 +++++++++++++++--------- build/amd64-ubuntu-builder.dockerfile | 1 + build/arm32v7-ubuntu-builder.dockerfile | 1 + 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1ddfa3e..7db3714 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,9 +15,11 @@ env: - PARALLELMFLAGS="-j2" - PORTABLE_WORSPACE=1 matrix: - - MARCH=amd64 CHECK_TARGET=memcheck - - MARCH=arm32v7 CHECK_TARGET=check + - BUILDTYPE=Debug MARCH=amd64 CHECK_TARGET=memcheck + - BUILDTYPE=Release MARCH=amd64 CHECK_TARGET=memcheck + - BUILDTYPE=Debug MARCH=arm32v7 CHECK_TARGET=check + - BUILDTYPE=MinSizeRel MARCH=arm32v7 CHECK_TARGET=check before_script: -- make MARCH=$MARCH +- make BUILDTYPE=$BUILDTYPE MARCH=$MARCH script: -- make MARCH=$MARCH $CHECK_TARGET +- make BUILDTYPE=$BUILDTYPE MARCH=$MARCH $CHECK_TARGET diff --git a/Makefile b/Makefile index 38f3679..d0388e0 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,7 @@ DOCKER_BUILDKIT ?= VERBOSE ?= BUILDVERBOSE ?= BUILDTARGET ?= +BUILDTYPE ?= Debug MARCH ?= $(call march,$(BUILDTARGET)) PROJECT_NAME ?= webfuse @@ -93,12 +94,17 @@ $(addprefix $(OUT)/docker/,$(UBUNTU_TARGETS)): CODENAME := $(UBUNTU_CODENAME) # Common rule target configuration CMAKEFLAGS += '-GNinja' +CMAKEFLAGS += '-DCMAKE_BUILD_TYPE=$(BUILDTYPE)' BUILDSILENT := $(if $(BUILDVERBOSE),,1) $(BUILDSILENT)NINJAFLAGS += -v DOCKER_RUNFLAGS += --device /dev/fuse -DOCKER_RUNFLAGS += --cap-add SYS_ADMIN --security-opt apparmor:unconfined +DOCKER_RUNFLAGS += --cap-add SYS_ADMIN +DOCKER_RUNFLAGS += --security-opt apparmor:unconfined + +DOCKER_RUNFLAGS += --cap-add SYS_PTRACE +DOCKER_RUNFLAGS += --security-opt seccomp=unconfined DOCKER_RUNFLAGS += --interactive DOCKER_RUNFLAGS += --rm @@ -124,7 +130,7 @@ OUT_TARGETS += $(addprefix $(OUT)/,$(TARGETS)) OUT_DIRS += $(OUT) OUT_DIRS += $(OUT)/docker OUT_DIRS += $(OUT)/src -OUT_DIRS += $(addsuffix /usr/bin,$(OUT_TARGETS)) +OUT_DIRS += $(addsuffix /$(BUILDTYPE),$(OUT_TARGETS)) BUILD_TARGETS += $(addprefix build-,$(TARGETS)) CHECK_TARGETS += $(addprefix check-,$(TARGETS)) @@ -148,7 +154,7 @@ $(HOST_CONTAINER)container_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT container_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) container_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ $(addprefix --volume ,$(call container_run_volumes,$1)) \ - --workdir '$(CONTAINER_OUT)/$1' \ + --workdir '$(CONTAINER_OUT)/$1/$(BUILDTYPE)' \ $(call container_name,$1) \ $2 @@ -156,18 +162,18 @@ image_rule = \ $$(OUT)/docker/$1: $$(OUT)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(PROJECT_ROOT)/Makefile; \ $$(SILENT)$$(call image,$1) image = \ - $(call echo_if_silent,docker build $(call container_name,$1) $(OUT)) \ + $(call echo_if_silent,TARGET=$1 docker build $(call container_name,$1) $(OUT)) \ && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call container_name,$1) $(OUT) configure_rule = \ - $$(OUT)/$1/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/usr/bin/gdb; \ + $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ $$(SILENT)$$(call configure,$1) configure = \ $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ && touch $(addprefix $(dir $@)/,include_dirs.txt) $@ build_rule = \ - build-$1: $$(OUT)/$1/CMakeCache.txt; \ + build-$1: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ $$(SILENT)$$(call build,$1) build = $(call run,$1,ninja $(PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) @@ -182,7 +188,7 @@ memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) run_rule = \ run-$1: $$(OUT)/docker/$1; \ $$(SILENT)$$(call run,$1,bash,--tty) || true -run = $(call echo_if_silent,TARGET=$1 $2) && $(call container_run,$1,$2,$3) +run = $(call echo_if_silent,TARGET=$1 BUILDTYPE=$(BUILDTYPE) $2) && $(call container_run,$1,$2,$3) clean_rule = \ clean-$1: ; \ @@ -190,13 +196,13 @@ clean_rule = \ clean = rm -rf $(OUT)/$1 discover_cc_settings_rule = \ - $$(OUT)/$1/include_dirs.txt: $$(OUT)/$1/CMakeCache.txt; \ + $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ $$(SILENT)$$(call discover_cc_settings,$1) discover_cc_settings = \ $(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<))) discover_cc_rule = \ - discover-cc-$1: $$(OUT)/$1/include_dirs.txt; \ + discover-cc-$1: $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt; \ $$(SILENT)$$(call discover_cc,$1) discover_cc = cat $< diff --git a/build/amd64-ubuntu-builder.dockerfile b/build/amd64-ubuntu-builder.dockerfile index 543b826..314cee1 100644 --- a/build/amd64-ubuntu-builder.dockerfile +++ b/build/amd64-ubuntu-builder.dockerfile @@ -11,6 +11,7 @@ RUN set -x \ ninja-build \ pkg-config \ rsync \ + gdb \ valgrind \ && rm -rf /var/lib/apt/lists/* diff --git a/build/arm32v7-ubuntu-builder.dockerfile b/build/arm32v7-ubuntu-builder.dockerfile index f605e0c..6e0c659 100644 --- a/build/arm32v7-ubuntu-builder.dockerfile +++ b/build/arm32v7-ubuntu-builder.dockerfile @@ -13,6 +13,7 @@ RUN set -x \ ninja-build \ pkg-config \ rsync \ + gdb \ && rm -rf /var/lib/apt/lists/* COPY src /usr/local/src From 59b0b4d0594f3898172721fee5c5b55855bac336 Mon Sep 17 00:00:00 2001 From: nosamad Date: Sun, 31 Mar 2019 21:33:35 +0200 Subject: [PATCH 03/16] adds missing toolchain headers to project --- .settings/language.settings.xml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index dc364b8..910ca28 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -2,7 +2,22 @@ - + + + + + + + + + + + + + + + + From f2880e1eae889f4a6b6b92d95c1f49f716c4adc8 Mon Sep 17 00:00:00 2001 From: nosamad Date: Mon, 1 Apr 2019 00:25:40 +0200 Subject: [PATCH 04/16] renames container macros --- Makefile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index d0388e0..1caf7c0 100644 --- a/Makefile +++ b/Makefile @@ -148,22 +148,22 @@ echo_if_silent = VERBOSE=1 $(VERBOSE)echo_if_silent = echo $1 $(VERBOSE)SILENT := @ -$(HOST_CONTAINER)container_run_volumes += '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' -$(HOST_CONTAINER)container_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' +$(HOST_CONTAINER)image_run_volumes += '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' +$(HOST_CONTAINER)image_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' -container_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) -container_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ - $(addprefix --volume ,$(call container_run_volumes,$1)) \ +image_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) +image_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ + $(addprefix --volume ,$(call image_run_volumes,$1)) \ --workdir '$(CONTAINER_OUT)/$1/$(BUILDTYPE)' \ - $(call container_name,$1) \ + $(call image_name,$1) \ $2 image_rule = \ $$(OUT)/docker/$1: $$(OUT)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(PROJECT_ROOT)/Makefile; \ $$(SILENT)$$(call image,$1) image = \ - $(call echo_if_silent,TARGET=$1 docker build $(call container_name,$1) $(OUT)) \ - && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call container_name,$1) $(OUT) + $(call echo_if_silent,TARGET=$1 docker build $(call image_name,$1) $(OUT)) \ + && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call image_name,$1) $(OUT) configure_rule = \ $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ @@ -188,7 +188,7 @@ memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) run_rule = \ run-$1: $$(OUT)/docker/$1; \ $$(SILENT)$$(call run,$1,bash,--tty) || true -run = $(call echo_if_silent,TARGET=$1 BUILDTYPE=$(BUILDTYPE) $2) && $(call container_run,$1,$2,$3) +run = $(call echo_if_silent,TARGET=$1 BUILDTYPE=$(BUILDTYPE) $2) && $(call image_run,$1,$2,$3) clean_rule = \ clean-$1: ; \ From 0dc34df7a56ac427ff4022b20cb8ce71f0f4ae33 Mon Sep 17 00:00:00 2001 From: nosamad Date: Mon, 1 Apr 2019 00:31:53 +0200 Subject: [PATCH 05/16] adds gdbserver --- build/amd64-ubuntu-builder.dockerfile | 1 + build/arm32v7-ubuntu-builder.dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/build/amd64-ubuntu-builder.dockerfile b/build/amd64-ubuntu-builder.dockerfile index 314cee1..cace9f3 100644 --- a/build/amd64-ubuntu-builder.dockerfile +++ b/build/amd64-ubuntu-builder.dockerfile @@ -12,6 +12,7 @@ RUN set -x \ pkg-config \ rsync \ gdb \ + gdbserver \ valgrind \ && rm -rf /var/lib/apt/lists/* diff --git a/build/arm32v7-ubuntu-builder.dockerfile b/build/arm32v7-ubuntu-builder.dockerfile index 6e0c659..8eb36e7 100644 --- a/build/arm32v7-ubuntu-builder.dockerfile +++ b/build/arm32v7-ubuntu-builder.dockerfile @@ -14,6 +14,7 @@ RUN set -x \ pkg-config \ rsync \ gdb \ + gdbserver \ && rm -rf /var/lib/apt/lists/* COPY src /usr/local/src From c5687c668062bc1d395431b5f4f1c2b1f044db46 Mon Sep 17 00:00:00 2001 From: nosamad Date: Sun, 31 Mar 2019 20:26:09 +0200 Subject: [PATCH 06/16] fixes verbosity option when set through command line --- Makefile | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 49a896e..38f3679 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,8 @@ OUT ?= $(PROJECT_ROOT)/.build UID ?= $(shell id -u) -CONTAINER_USER ?= $(UID) -CONTAINER_GROUP ?= $(shell id -g) +CONTAINER_USER ?= user +CONTAINER_GROUP ?= user CONTAINER_CGROUP_PARENT ?= HOST_CONTAINER ?= $(shell $(PROJECT_ROOT)/build/get_container_id.sh) @@ -97,7 +97,8 @@ CMAKEFLAGS += '-GNinja' BUILDSILENT := $(if $(BUILDVERBOSE),,1) $(BUILDSILENT)NINJAFLAGS += -v -DOCKER_RUNFLAGS += --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined +DOCKER_RUNFLAGS += --device /dev/fuse +DOCKER_RUNFLAGS += --cap-add SYS_ADMIN --security-opt apparmor:unconfined DOCKER_RUNFLAGS += --interactive DOCKER_RUNFLAGS += --rm @@ -118,10 +119,12 @@ DOCKER_BUILDARGS += OUT=$(CONTAINER_OUT) DOCKER_BUILDFLAGS += --rm DOCKER_BUILDFLAGS += $(addprefix --build-arg ,$(DOCKER_BUILDARGS)) +OUT_TARGETS += $(addprefix $(OUT)/,$(TARGETS)) + OUT_DIRS += $(OUT) OUT_DIRS += $(OUT)/docker OUT_DIRS += $(OUT)/src -OUT_DIRS += $(addprefix $(OUT)/,$(TARGETS)) +OUT_DIRS += $(addsuffix /usr/bin,$(OUT_TARGETS)) BUILD_TARGETS += $(addprefix build-,$(TARGETS)) CHECK_TARGETS += $(addprefix check-,$(TARGETS)) @@ -129,7 +132,7 @@ CLEAN_TARGETS += $(addprefix clean-,$(TARGETS)) RUN_TARGETS += $(addprefix run-,$(firstword $(TARGETS))) EXTRACT_TARGETS += $(patsubst $(OUT)/%.tar.gz,$(OUT)/src/%,$(FETCH_TARGETS)) DISCOVER_CC_TARGETS += $(addprefix discover-cc-,$(firstword $(TARGETS))) -RULE_TARGETS = $(addprefix $(OUT)/,$(addsuffix /rules.mk,$(TARGETS))) +RULE_TARGETS += $(addsuffix /rules.mk,$(OUT_TARGETS)) TARGETS := $(sort $(TARGETS)) @@ -151,21 +154,21 @@ container_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ image_rule = \ $$(OUT)/docker/$1: $$(OUT)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(PROJECT_ROOT)/Makefile; \ - $(SILENT)$$(call image,$1) + $$(SILENT)$$(call image,$1) image = \ $(call echo_if_silent,docker build $(call container_name,$1) $(OUT)) \ && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call container_name,$1) $(OUT) configure_rule = \ - $$(OUT)/$1/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ - $(SILENT)$$(call configure,$1) + $$(OUT)/$1/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/usr/bin/gdb; \ + $$(SILENT)$$(call configure,$1) configure = \ $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ && touch $(addprefix $(dir $@)/,include_dirs.txt) $@ build_rule = \ build-$1: $$(OUT)/$1/CMakeCache.txt; \ - $(SILENT)$$(call build,$1) + $$(SILENT)$$(call build,$1) build = $(call run,$1,ninja $(PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) check_rule = \ @@ -173,28 +176,28 @@ check_rule = \ memcheck_rule = \ memcheck-$1: build-$1; \ - $(SILENT)$$(call memcheck,$1) + $$(SILENT)$$(call memcheck,$1) memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) run_rule = \ run-$1: $$(OUT)/docker/$1; \ - $(SILENT)$$(call run,$1,/bin/bash,--tty) || true + $$(SILENT)$$(call run,$1,bash,--tty) || true run = $(call echo_if_silent,TARGET=$1 $2) && $(call container_run,$1,$2,$3) clean_rule = \ clean-$1: ; \ - $(SILENT)-$$(call clean,$1) + $$(SILENT)-$$(call clean,$1) clean = rm -rf $(OUT)/$1 discover_cc_settings_rule = \ $$(OUT)/$1/include_dirs.txt: $$(OUT)/$1/CMakeCache.txt; \ - $(SILENT)$$(call discover_cc_settings,$1) + $$(SILENT)$$(call discover_cc_settings,$1) discover_cc_settings = \ $(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<))) discover_cc_rule = \ discover-cc-$1: $$(OUT)/$1/include_dirs.txt; \ - $(SILENT)$$(call discover_cc,$1) + $$(SILENT)$$(call discover_cc,$1) discover_cc = cat $< # Rules @@ -259,7 +262,6 @@ debug-print-%: @printf '%s\n' '$*:' $($*) $(CHECK_TARGETS): GOALS := test -$(CHECK_TARGETS) $(MEMCHECK_TARGETS): CONTAINER_USER := user $(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): $(SILENT) \ From 20619e67a94d0b9c6e40b71befcabfac0c17ebf4 Mon Sep 17 00:00:00 2001 From: nosamad Date: Sun, 31 Mar 2019 21:24:26 +0200 Subject: [PATCH 07/16] adds support for build type and allows to run gdb in container --- .travis.yml | 10 ++++++---- Makefile | 24 +++++++++++++++--------- build/amd64-ubuntu-builder.dockerfile | 1 + build/arm32v7-ubuntu-builder.dockerfile | 1 + 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1ddfa3e..7db3714 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,9 +15,11 @@ env: - PARALLELMFLAGS="-j2" - PORTABLE_WORSPACE=1 matrix: - - MARCH=amd64 CHECK_TARGET=memcheck - - MARCH=arm32v7 CHECK_TARGET=check + - BUILDTYPE=Debug MARCH=amd64 CHECK_TARGET=memcheck + - BUILDTYPE=Release MARCH=amd64 CHECK_TARGET=memcheck + - BUILDTYPE=Debug MARCH=arm32v7 CHECK_TARGET=check + - BUILDTYPE=MinSizeRel MARCH=arm32v7 CHECK_TARGET=check before_script: -- make MARCH=$MARCH +- make BUILDTYPE=$BUILDTYPE MARCH=$MARCH script: -- make MARCH=$MARCH $CHECK_TARGET +- make BUILDTYPE=$BUILDTYPE MARCH=$MARCH $CHECK_TARGET diff --git a/Makefile b/Makefile index 38f3679..d0388e0 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,7 @@ DOCKER_BUILDKIT ?= VERBOSE ?= BUILDVERBOSE ?= BUILDTARGET ?= +BUILDTYPE ?= Debug MARCH ?= $(call march,$(BUILDTARGET)) PROJECT_NAME ?= webfuse @@ -93,12 +94,17 @@ $(addprefix $(OUT)/docker/,$(UBUNTU_TARGETS)): CODENAME := $(UBUNTU_CODENAME) # Common rule target configuration CMAKEFLAGS += '-GNinja' +CMAKEFLAGS += '-DCMAKE_BUILD_TYPE=$(BUILDTYPE)' BUILDSILENT := $(if $(BUILDVERBOSE),,1) $(BUILDSILENT)NINJAFLAGS += -v DOCKER_RUNFLAGS += --device /dev/fuse -DOCKER_RUNFLAGS += --cap-add SYS_ADMIN --security-opt apparmor:unconfined +DOCKER_RUNFLAGS += --cap-add SYS_ADMIN +DOCKER_RUNFLAGS += --security-opt apparmor:unconfined + +DOCKER_RUNFLAGS += --cap-add SYS_PTRACE +DOCKER_RUNFLAGS += --security-opt seccomp=unconfined DOCKER_RUNFLAGS += --interactive DOCKER_RUNFLAGS += --rm @@ -124,7 +130,7 @@ OUT_TARGETS += $(addprefix $(OUT)/,$(TARGETS)) OUT_DIRS += $(OUT) OUT_DIRS += $(OUT)/docker OUT_DIRS += $(OUT)/src -OUT_DIRS += $(addsuffix /usr/bin,$(OUT_TARGETS)) +OUT_DIRS += $(addsuffix /$(BUILDTYPE),$(OUT_TARGETS)) BUILD_TARGETS += $(addprefix build-,$(TARGETS)) CHECK_TARGETS += $(addprefix check-,$(TARGETS)) @@ -148,7 +154,7 @@ $(HOST_CONTAINER)container_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT container_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) container_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ $(addprefix --volume ,$(call container_run_volumes,$1)) \ - --workdir '$(CONTAINER_OUT)/$1' \ + --workdir '$(CONTAINER_OUT)/$1/$(BUILDTYPE)' \ $(call container_name,$1) \ $2 @@ -156,18 +162,18 @@ image_rule = \ $$(OUT)/docker/$1: $$(OUT)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(PROJECT_ROOT)/Makefile; \ $$(SILENT)$$(call image,$1) image = \ - $(call echo_if_silent,docker build $(call container_name,$1) $(OUT)) \ + $(call echo_if_silent,TARGET=$1 docker build $(call container_name,$1) $(OUT)) \ && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call container_name,$1) $(OUT) configure_rule = \ - $$(OUT)/$1/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/usr/bin/gdb; \ + $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ $$(SILENT)$$(call configure,$1) configure = \ $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ && touch $(addprefix $(dir $@)/,include_dirs.txt) $@ build_rule = \ - build-$1: $$(OUT)/$1/CMakeCache.txt; \ + build-$1: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ $$(SILENT)$$(call build,$1) build = $(call run,$1,ninja $(PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) @@ -182,7 +188,7 @@ memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) run_rule = \ run-$1: $$(OUT)/docker/$1; \ $$(SILENT)$$(call run,$1,bash,--tty) || true -run = $(call echo_if_silent,TARGET=$1 $2) && $(call container_run,$1,$2,$3) +run = $(call echo_if_silent,TARGET=$1 BUILDTYPE=$(BUILDTYPE) $2) && $(call container_run,$1,$2,$3) clean_rule = \ clean-$1: ; \ @@ -190,13 +196,13 @@ clean_rule = \ clean = rm -rf $(OUT)/$1 discover_cc_settings_rule = \ - $$(OUT)/$1/include_dirs.txt: $$(OUT)/$1/CMakeCache.txt; \ + $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ $$(SILENT)$$(call discover_cc_settings,$1) discover_cc_settings = \ $(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<))) discover_cc_rule = \ - discover-cc-$1: $$(OUT)/$1/include_dirs.txt; \ + discover-cc-$1: $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt; \ $$(SILENT)$$(call discover_cc,$1) discover_cc = cat $< diff --git a/build/amd64-ubuntu-builder.dockerfile b/build/amd64-ubuntu-builder.dockerfile index 543b826..314cee1 100644 --- a/build/amd64-ubuntu-builder.dockerfile +++ b/build/amd64-ubuntu-builder.dockerfile @@ -11,6 +11,7 @@ RUN set -x \ ninja-build \ pkg-config \ rsync \ + gdb \ valgrind \ && rm -rf /var/lib/apt/lists/* diff --git a/build/arm32v7-ubuntu-builder.dockerfile b/build/arm32v7-ubuntu-builder.dockerfile index f605e0c..6e0c659 100644 --- a/build/arm32v7-ubuntu-builder.dockerfile +++ b/build/arm32v7-ubuntu-builder.dockerfile @@ -13,6 +13,7 @@ RUN set -x \ ninja-build \ pkg-config \ rsync \ + gdb \ && rm -rf /var/lib/apt/lists/* COPY src /usr/local/src From a86d45e45062683f0a4425913952ffa8239edccf Mon Sep 17 00:00:00 2001 From: nosamad Date: Sun, 31 Mar 2019 21:33:35 +0200 Subject: [PATCH 08/16] adds missing toolchain headers to project --- .settings/language.settings.xml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index dc364b8..910ca28 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -2,7 +2,22 @@ - + + + + + + + + + + + + + + + + From c7ab6bb1b1b097478a74d629d14e459a34ffca95 Mon Sep 17 00:00:00 2001 From: nosamad Date: Mon, 1 Apr 2019 00:25:40 +0200 Subject: [PATCH 09/16] renames container macros --- Makefile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index d0388e0..1caf7c0 100644 --- a/Makefile +++ b/Makefile @@ -148,22 +148,22 @@ echo_if_silent = VERBOSE=1 $(VERBOSE)echo_if_silent = echo $1 $(VERBOSE)SILENT := @ -$(HOST_CONTAINER)container_run_volumes += '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' -$(HOST_CONTAINER)container_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' +$(HOST_CONTAINER)image_run_volumes += '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' +$(HOST_CONTAINER)image_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' -container_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) -container_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ - $(addprefix --volume ,$(call container_run_volumes,$1)) \ +image_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) +image_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ + $(addprefix --volume ,$(call image_run_volumes,$1)) \ --workdir '$(CONTAINER_OUT)/$1/$(BUILDTYPE)' \ - $(call container_name,$1) \ + $(call image_name,$1) \ $2 image_rule = \ $$(OUT)/docker/$1: $$(OUT)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(PROJECT_ROOT)/Makefile; \ $$(SILENT)$$(call image,$1) image = \ - $(call echo_if_silent,TARGET=$1 docker build $(call container_name,$1) $(OUT)) \ - && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call container_name,$1) $(OUT) + $(call echo_if_silent,TARGET=$1 docker build $(call image_name,$1) $(OUT)) \ + && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call image_name,$1) $(OUT) configure_rule = \ $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ @@ -188,7 +188,7 @@ memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) run_rule = \ run-$1: $$(OUT)/docker/$1; \ $$(SILENT)$$(call run,$1,bash,--tty) || true -run = $(call echo_if_silent,TARGET=$1 BUILDTYPE=$(BUILDTYPE) $2) && $(call container_run,$1,$2,$3) +run = $(call echo_if_silent,TARGET=$1 BUILDTYPE=$(BUILDTYPE) $2) && $(call image_run,$1,$2,$3) clean_rule = \ clean-$1: ; \ From 8a11a880022f578065a8ca0b2d89ce7246009560 Mon Sep 17 00:00:00 2001 From: nosamad Date: Mon, 1 Apr 2019 00:31:53 +0200 Subject: [PATCH 10/16] adds gdbserver --- build/amd64-ubuntu-builder.dockerfile | 1 + build/arm32v7-ubuntu-builder.dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/build/amd64-ubuntu-builder.dockerfile b/build/amd64-ubuntu-builder.dockerfile index 314cee1..cace9f3 100644 --- a/build/amd64-ubuntu-builder.dockerfile +++ b/build/amd64-ubuntu-builder.dockerfile @@ -12,6 +12,7 @@ RUN set -x \ pkg-config \ rsync \ gdb \ + gdbserver \ valgrind \ && rm -rf /var/lib/apt/lists/* diff --git a/build/arm32v7-ubuntu-builder.dockerfile b/build/arm32v7-ubuntu-builder.dockerfile index 6e0c659..8eb36e7 100644 --- a/build/arm32v7-ubuntu-builder.dockerfile +++ b/build/arm32v7-ubuntu-builder.dockerfile @@ -14,6 +14,7 @@ RUN set -x \ pkg-config \ rsync \ gdb \ + gdbserver \ && rm -rf /var/lib/apt/lists/* COPY src /usr/local/src From aec079aa8cff01c299c078f00e2997bad71609f0 Mon Sep 17 00:00:00 2001 From: nosamad Date: Mon, 1 Apr 2019 22:52:14 +0200 Subject: [PATCH 11/16] removes language settings, which contains alternating values --- .gitignore | 1 + {.settings => build}/language.settings.xml | 0 2 files changed, 1 insertion(+) rename {.settings => build}/language.settings.xml (100%) diff --git a/.gitignore b/.gitignore index 1b0152c..ad4875e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .vscode .build .deps +.settings/language.settings.xml \ No newline at end of file diff --git a/.settings/language.settings.xml b/build/language.settings.xml similarity index 100% rename from .settings/language.settings.xml rename to build/language.settings.xml From 87826c605aaa05a9c2642ce55d517a761e3c16e9 Mon Sep 17 00:00:00 2001 From: nosamad Date: Mon, 1 Apr 2019 23:51:39 +0200 Subject: [PATCH 12/16] adds wrapper script to launch gdbserver --- Makefile | 17 ++++++++++++++++- build/run_image.template | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 build/run_image.template diff --git a/Makefile b/Makefile index 1caf7c0..410a138 100644 --- a/Makefile +++ b/Makefile @@ -166,7 +166,7 @@ image = \ && $(DOCKER) build $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call image_name,$1) $(OUT) configure_rule = \ - $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ + $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/$$(BUILDTYPE)/gdbserver; \ $$(SILENT)$$(call configure,$1) configure = \ $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ @@ -206,6 +206,19 @@ discover_cc_rule = \ $$(SILENT)$$(call discover_cc,$1) discover_cc = cat $< +wrapper_rule = \ + $$(OUT)/$1/$$(BUILDTYPE)/gdbserver: $$(PROJECT_ROOT)/build/run_image.template $$(OUT)/docker/$1; \ + $$(SILENT)$$(call wrapper,$1) +wrapper = \ + $(call echo_if_silent,generating $@) \ + && sed \ + -e 's@%DOCKER%@$(DOCKER)@g' \ + -e 's@%DOCKER_RUNFLAGS%@$(DOCKER_RUNFLAGS) $(addprefix --volume ,$(call image_run_volumes,$1))@g' \ + -e 's@%DOCKER_IMAGE%@$(call image_name,$1)@g' \ + -e 's@%DOCKER_RUNCMD%@$(notdir $@)@g' \ + $< > $@ \ + && chmod +x $@ + # Rules ifneq ($(MAKECMDGOALS),distclean) @@ -233,6 +246,8 @@ $(RULE_TARGETS): $(PROJECT_ROOT)/Makefile | $(OUT_DIRS) echo '$(call discover_cc_settings_rule,$(TARGET))'; \ echo; \ echo '$(call discover_cc_rule,$(TARGET))'; \ + echo; \ + echo '$(call wrapper_rule,$(TARGET))'; \ } > $@ .PHONY: all build-% diff --git a/build/run_image.template b/build/run_image.template new file mode 100644 index 0000000..7a237e5 --- /dev/null +++ b/build/run_image.template @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +set -e + +DOCKER="${DOCKER:-'%DOCKER%'}" +DOCKER_IMAGE="{DOCKER_IMAGE:-'%DOCKER_IMAGE%'}" + +DOCKER_RUNFLAGS+=( %DOCKER_RUNFLAGS% ) +DOCKER_RUNFLAGS+=( --network host ) +DOCKER_RUNFLAGS+=( --workdir "$PWD" ) + +DOCKER_RUNCMD=( %DOCKER_RUNCMD% ) + +set -- "${DOCKER_RUNFLAGS[@]}" "%DOCKER_IMAGE%" "${DOCKER_RUNCMD[@]}" "$@" + +exec docker run "$@" From a8f20eccf90a28d417dc9062b5c2220069410c9f Mon Sep 17 00:00:00 2001 From: nosamad Date: Tue, 2 Apr 2019 00:23:46 +0200 Subject: [PATCH 13/16] fix docker command in wrapper script --- build/run_image.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/run_image.template b/build/run_image.template index 7a237e5..888e0b5 100644 --- a/build/run_image.template +++ b/build/run_image.template @@ -13,4 +13,4 @@ DOCKER_RUNCMD=( %DOCKER_RUNCMD% ) set -- "${DOCKER_RUNFLAGS[@]}" "%DOCKER_IMAGE%" "${DOCKER_RUNCMD[@]}" "$@" -exec docker run "$@" +exec "$DOCKER" run "$@" From fa0ae1c66e93f35834954a06009f83c9014d9815 Mon Sep 17 00:00:00 2001 From: nosamad Date: Tue, 2 Apr 2019 18:36:38 +0200 Subject: [PATCH 14/16] fixes run in dind setup --- Makefile | 20 +++++++++++--------- build/discover_cc_settings.sh | 1 + build/run_image.template | 34 +++++++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 410a138..584c206 100644 --- a/Makefile +++ b/Makefile @@ -113,8 +113,6 @@ DOCKER_RUNFLAGS += --user $(CONTAINER_USER):$(CONTAINER_GROUP) DOCKER_RUNFLAGS += --env SOURCE_DATE_EPOCH DOCKER_RUNFLAGS += --env BUILDTIME DOCKER_RUNFLAGS += --env NINJA_STATUS -DOCKER_RUNFLAGS += $(addprefix --volumes-from ,$(HOST_CONTAINER)) -DOCKER_RUNFLAGS += $(addprefix --cgroup-parent ,$(CONTAINER_CGROUP_PARENT)) DOCKER_BUILDARGS += CODENAME=$(CODENAME) DOCKER_BUILDARGS += PARALLELMFLAGS=$(PARALLELMFLAGS) @@ -148,13 +146,16 @@ echo_if_silent = VERBOSE=1 $(VERBOSE)echo_if_silent = echo $1 $(VERBOSE)SILENT := @ -$(HOST_CONTAINER)image_run_volumes += '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' -$(HOST_CONTAINER)image_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' +$(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' +$(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' +image_run_volumes += $(addprefix --volumes-from ,$2) image_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) -image_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ - $(addprefix --volume ,$(call image_run_volumes,$1)) \ +image_run = $(DOCKER) run $(DOCKER_RUNFLAGS) \ + $(call image_run_volumes,$1,$(HOST_CONTAINER)) \ + $(addprefix --cgroup-parent ,$(CONTAINER_CGROUP_PARENT)) \ --workdir '$(CONTAINER_OUT)/$1/$(BUILDTYPE)' \ + $3 \ $(call image_name,$1) \ $2 @@ -212,10 +213,11 @@ wrapper_rule = \ wrapper = \ $(call echo_if_silent,generating $@) \ && sed \ + -e 's@%PROJECT_ROOT%@$(abspath $(PROJECT_ROOT))@g' \ -e 's@%DOCKER%@$(DOCKER)@g' \ - -e 's@%DOCKER_RUNFLAGS%@$(DOCKER_RUNFLAGS) $(addprefix --volume ,$(call image_run_volumes,$1))@g' \ - -e 's@%DOCKER_IMAGE%@$(call image_name,$1)@g' \ - -e 's@%DOCKER_RUNCMD%@$(notdir $@)@g' \ + -e 's@%RUNFLAGS%@$(DOCKER_RUNFLAGS) $(call image_run_volumes,$1)@g' \ + -e 's@%IMAGE%@$(call image_name,$1)@g' \ + -e 's@%RUNCMD%@$(notdir $@)@g' \ $< > $@ \ && chmod +x $@ diff --git a/build/discover_cc_settings.sh b/build/discover_cc_settings.sh index 61a08fd..276c13b 100755 --- a/build/discover_cc_settings.sh +++ b/build/discover_cc_settings.sh @@ -41,6 +41,7 @@ fi { echo '#include <...> search starts here:' + # shellcheck disable=SC1117 sed -n -e "s@\(.*\)@$INCLUDE_DIRS_PREFIX\1@p" "$INCLUDE_DIRS_TMPFILE" echo 'End of search list.' } > "$INCLUDE_DIRS_FILE" diff --git a/build/run_image.template b/build/run_image.template index 888e0b5..d199b1e 100644 --- a/build/run_image.template +++ b/build/run_image.template @@ -2,15 +2,35 @@ set -e -DOCKER="${DOCKER:-'%DOCKER%'}" -DOCKER_IMAGE="{DOCKER_IMAGE:-'%DOCKER_IMAGE%'}" +PROJECT_ROOT="${PROJECT_ROOT:-%PROJECT_ROOT%}" -DOCKER_RUNFLAGS+=( %DOCKER_RUNFLAGS% ) -DOCKER_RUNFLAGS+=( --network host ) -DOCKER_RUNFLAGS+=( --workdir "$PWD" ) +DOCKER="${DOCKER:-%DOCKER%}" +IMAGE="${IMAGE:-%IMAGE%}" +NETWORK="${NETWORK:-host}" +HOST_CONTAINER="${HOST_CONTAINER:-"$("$PROJECT_ROOT/build/get_container_id.sh")"}" -DOCKER_RUNCMD=( %DOCKER_RUNCMD% ) +# shellcheck disable=SC2162 +read -a ADDITIONAL_RUNFLAGS <<< "$RUNFLAGS" -set -- "${DOCKER_RUNFLAGS[@]}" "%DOCKER_IMAGE%" "${DOCKER_RUNCMD[@]}" "$@" +RUNFLAGS=() + +# shellcheck disable=SC2191 +RUNFLAGS+=( %RUNFLAGS% ) + +if [[ -n "$HOST_CONTAINER" ]]; then + RUNFLAGS+=( --volumes-from "$HOST_CONTAINER" ) +fi + +RUNFLAGS+=( --network "$NETWORK" ) + +if [[ -n "$CONTAINER_CGROUP_PARENT" ]]; then + RUNFLAGS+=( --cgroup-parent "$CONTAINER_CGROUP_PARENT" ) +fi + +RUNFLAGS+=( --workdir "$PWD" ) + +RUNCMD=( %RUNCMD% ) + +set -- "${RUNFLAGS[@]}" "${ADDITIONAL_RUNFLAGS[@]}" "$IMAGE" "${RUNCMD[@]}" "$@" exec "$DOCKER" run "$@" From eaebd02fe7846bb9d2d5f1518603498d5ac8db27 Mon Sep 17 00:00:00 2001 From: nosamad Date: Tue, 2 Apr 2019 19:56:46 +0200 Subject: [PATCH 15/16] replaces docker's init through dump-init --- Makefile | 6 ++- build/amd64-ubuntu-builder.dockerfile | 62 ++++++++++++++++--------- build/arm32v7-ubuntu-builder.dockerfile | 62 ++++++++++++++++--------- 3 files changed, 85 insertions(+), 45 deletions(-) diff --git a/Makefile b/Makefile index 584c206..06a4e5e 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,11 @@ UBUNTU_CODENAME ?= bionic # Dependencies +DUMB_INIT_VERISON ?= 1.2.2 +DOCKER_BUILDARGS += DUMB_INIT_VERISON=$(DUMB_INIT_VERISON) +FETCH_TARGETS += $(OUT)/dumb-init-$(DUMB_INIT_VERISON).tar.gz +$(OUT)/dumb-init-$(DUMB_INIT_VERISON).tar.gz: URL := https://github.com/Yelp/dumb-init/archive/v${DUMB_INIT_VERISON}.tar.gz + GTEST_VERSION ?= 1.8.1 DOCKER_BUILDARGS += GTEST_VERSION=$(GTEST_VERSION) FETCH_TARGETS += $(OUT)/googletest-release-$(GTEST_VERSION).tar.gz @@ -108,7 +113,6 @@ DOCKER_RUNFLAGS += --security-opt seccomp=unconfined DOCKER_RUNFLAGS += --interactive DOCKER_RUNFLAGS += --rm -DOCKER_RUNFLAGS += --init DOCKER_RUNFLAGS += --user $(CONTAINER_USER):$(CONTAINER_GROUP) DOCKER_RUNFLAGS += --env SOURCE_DATE_EPOCH DOCKER_RUNFLAGS += --env BUILDTIME diff --git a/build/amd64-ubuntu-builder.dockerfile b/build/amd64-ubuntu-builder.dockerfile index cace9f3..317e5e2 100644 --- a/build/amd64-ubuntu-builder.dockerfile +++ b/build/amd64-ubuntu-builder.dockerfile @@ -13,61 +13,77 @@ RUN set -x \ rsync \ gdb \ gdbserver \ - valgrind \ - && rm -rf /var/lib/apt/lists/* + valgrind COPY src /usr/local/src ARG PARALLELMFLAGS=-j2 +ARG DUMB_INIT_VERISON=1.2.2 + +RUN set -x \ + && builddeps="xxd" \ + && apt install --yes --no-install-recommends $builddeps \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ + && cp -R "/usr/local/src/dumb-init-$DUMB_INIT_VERISON" . \ + && cd dumb-init-$DUMB_INIT_VERISON \ + && make "$PARALLELMFLAGS" \ + && chmod +x dumb-init \ + && mv dumb-init /usr/local/bin/dumb-init \ + && dumb-init --version \ + && rm -rf "$builddir" \ + && apt purge -y $builddeps + ARG GTEST_VERSION=1.8.1 RUN set -x \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && cmake "/usr/local/src/googletest-release-$GTEST_VERSION" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out + && rm -rf "$builddir" ARG FUSE_VERSION=3.1.1 RUN set -x \ - && apt update \ - && apt install --yes --no-install-recommends \ - libtool \ - automake \ - gettext \ + && builddeps="libtool automake gettext" \ + && apt install --yes --no-install-recommends $builddeps \ && cd "/usr/local/src/libfuse-fuse-$FUSE_VERSION" \ && ./makeconf.sh \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && "/usr/local/src/libfuse-fuse-$FUSE_VERSION/configure" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out \ - && rm -rf /var/lib/apt/lists/* + && rm -rf "$builddir" \ + && apt purge -y $builddeps ARG WEBSOCKETS_VERSION=3.1.0 RUN set -x \ - && apt update \ && apt install --yes --no-install-recommends \ + ca-certificates \ openssl \ libssl-dev \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && cmake "/usr/local/src/libwebsockets-$WEBSOCKETS_VERSION" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out \ - && rm -rf /var/lib/apt/lists/* + && rm -rf "$builddir" ARG JANSSON_VERSION=2.12 RUN set -x \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && cmake -DJANSSON_BUILD_DOCS=OFF "/usr/local/src/jansson-$JANSSON_VERSION" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out + && rm -rf "$builddir" ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" @@ -83,3 +99,5 @@ RUN set -x \ WORKDIR "$OUT" +ENTRYPOINT ["dumb-init", "--"] + diff --git a/build/arm32v7-ubuntu-builder.dockerfile b/build/arm32v7-ubuntu-builder.dockerfile index 8eb36e7..e0a1f31 100644 --- a/build/arm32v7-ubuntu-builder.dockerfile +++ b/build/arm32v7-ubuntu-builder.dockerfile @@ -14,61 +14,77 @@ RUN set -x \ pkg-config \ rsync \ gdb \ - gdbserver \ - && rm -rf /var/lib/apt/lists/* + gdbserver COPY src /usr/local/src ARG PARALLELMFLAGS=-j2 +ARG DUMB_INIT_VERISON=1.2.2 + +RUN set -x \ + && builddeps="xxd" \ + && apt install --yes --no-install-recommends $builddeps \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ + && cp -R "/usr/local/src/dumb-init-$DUMB_INIT_VERISON" . \ + && cd dumb-init-$DUMB_INIT_VERISON \ + && make "$PARALLELMFLAGS" \ + && chmod +x dumb-init \ + && mv dumb-init /usr/local/bin/dumb-init \ + && dumb-init --version \ + && rm -rf "$builddir" \ + && apt purge -y $builddeps + ARG GTEST_VERSION=1.8.1 RUN set -x \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && cmake "/usr/local/src/googletest-release-$GTEST_VERSION" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out + && rm -rf "$builddir" ARG FUSE_VERSION=3.1.1 RUN set -x \ - && apt update \ - && apt install --yes --no-install-recommends \ - libtool \ - automake \ - gettext \ + && builddeps="libtool automake gettext" \ + && apt install --yes --no-install-recommends $builddeps \ && cd "/usr/local/src/libfuse-fuse-$FUSE_VERSION" \ && ./makeconf.sh \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && "/usr/local/src/libfuse-fuse-$FUSE_VERSION/configure" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out \ - && rm -rf /var/lib/apt/lists/* + && rm -rf "$builddir" \ + && apt purge -y $builddeps ARG WEBSOCKETS_VERSION=3.1.0 RUN set -x \ - && apt update \ && apt install --yes --no-install-recommends \ + ca-certificates \ openssl \ libssl-dev \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && cmake "/usr/local/src/libwebsockets-$WEBSOCKETS_VERSION" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out \ - && rm -rf /var/lib/apt/lists/* + && rm -rf "$builddir" ARG JANSSON_VERSION=2.12 RUN set -x \ - && mkdir -p /tmp/out \ - && cd /tmp/out \ + && builddir="/tmp/out" \ + && mkdir -p "$builddir" \ + && cd "$builddir" \ && cmake -DJANSSON_BUILD_DOCS=OFF "/usr/local/src/jansson-$JANSSON_VERSION" \ && make "$PARALLELMFLAGS" install \ - && rm -rf /tmp/out + && rm -rf "$builddir" ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" @@ -84,3 +100,5 @@ RUN set -x \ WORKDIR "$OUT" +ENTRYPOINT ["dumb-init", "--"] + From 815885957666784eb31451e8f5d9736fc16f13f9 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Tue, 2 Apr 2019 23:00:03 +0200 Subject: [PATCH 16/16] moves filesystem to session --- lib/webfuse/adapter/impl/filesystem.c | 6 +-- lib/webfuse/adapter/impl/filesystem.h | 6 +-- lib/webfuse/adapter/impl/operation/close.c | 2 +- lib/webfuse/adapter/impl/operation/getattr.c | 2 +- lib/webfuse/adapter/impl/operation/lookup.c | 2 +- lib/webfuse/adapter/impl/operation/open.c | 2 +- lib/webfuse/adapter/impl/operation/read.c | 2 +- lib/webfuse/adapter/impl/operation/readdir.c | 2 +- lib/webfuse/adapter/impl/operations.c | 6 +-- lib/webfuse/adapter/impl/operations.h | 7 ++- lib/webfuse/adapter/impl/server.c | 17 ++----- lib/webfuse/adapter/impl/server_protocol.c | 45 +++++------------ lib/webfuse/adapter/impl/server_protocol.h | 5 +- lib/webfuse/adapter/impl/session.c | 52 +++++++++++++++++--- lib/webfuse/adapter/impl/session.h | 16 ++++-- lib/webfuse/adapter/impl/session_manager.c | 26 +++------- lib/webfuse/adapter/impl/session_manager.h | 8 ++- 17 files changed, 101 insertions(+), 105 deletions(-) diff --git a/lib/webfuse/adapter/impl/filesystem.c b/lib/webfuse/adapter/impl/filesystem.c index 0e52b9f..0c8a1e4 100644 --- a/lib/webfuse/adapter/impl/filesystem.c +++ b/lib/webfuse/adapter/impl/filesystem.c @@ -19,8 +19,8 @@ static struct fuse_lowlevel_ops const filesystem_operations = bool wf_impl_filesystem_init( struct wf_impl_filesystem * filesystem, - struct wf_impl_session_manager * session_manager, - char * mount_point) + struct wf_impl_session * session, + char const * mount_point) { bool result = false; @@ -29,7 +29,7 @@ bool wf_impl_filesystem_init( filesystem->args.argv = argv; filesystem->args.allocated = 0; - filesystem->user_data.session_manager = session_manager; + filesystem->user_data.session = session; filesystem->user_data.timeout = 1.0; memset(&filesystem->buffer, 0, sizeof(struct fuse_buf)); diff --git a/lib/webfuse/adapter/impl/filesystem.h b/lib/webfuse/adapter/impl/filesystem.h index af07c32..db1ef81 100644 --- a/lib/webfuse/adapter/impl/filesystem.h +++ b/lib/webfuse/adapter/impl/filesystem.h @@ -13,7 +13,7 @@ extern "C" { #endif -struct wf_impl_session_manager; +struct wf_impl_session; struct wf_impl_filesystem { @@ -25,8 +25,8 @@ struct wf_impl_filesystem extern bool wf_impl_filesystem_init( struct wf_impl_filesystem * filesystem, - struct wf_impl_session_manager * session_manager, - char * mount_point); + struct wf_impl_session * session, + char const * mount_point); extern void wf_impl_filesystem_cleanup( struct wf_impl_filesystem * filesystem); diff --git a/lib/webfuse/adapter/impl/operation/close.c b/lib/webfuse/adapter/impl/operation/close.c index 6ccefc8..59cbf93 100644 --- a/lib/webfuse/adapter/impl/operation/close.c +++ b/lib/webfuse/adapter/impl/operation/close.c @@ -13,7 +13,7 @@ void wf_impl_operation_close( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data); if (NULL != rpc) { diff --git a/lib/webfuse/adapter/impl/operation/getattr.c b/lib/webfuse/adapter/impl/operation/getattr.c index 98993e8..647be3d 100644 --- a/lib/webfuse/adapter/impl/operation/getattr.c +++ b/lib/webfuse/adapter/impl/operation/getattr.c @@ -81,7 +81,7 @@ void wf_impl_operation_getattr ( { struct fuse_ctx const * context = fuse_req_ctx(request); struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data); if (NULL != rpc) { diff --git a/lib/webfuse/adapter/impl/operation/lookup.c b/lib/webfuse/adapter/impl/operation/lookup.c index 840a754..7e96f48 100644 --- a/lib/webfuse/adapter/impl/operation/lookup.c +++ b/lib/webfuse/adapter/impl/operation/lookup.c @@ -90,7 +90,7 @@ void wf_impl_operation_lookup ( { struct fuse_ctx const * context = fuse_req_ctx(request); struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, parent); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data); if (NULL != rpc) { diff --git a/lib/webfuse/adapter/impl/operation/open.c b/lib/webfuse/adapter/impl/operation/open.c index 51894fa..dcac221 100644 --- a/lib/webfuse/adapter/impl/operation/open.c +++ b/lib/webfuse/adapter/impl/operation/open.c @@ -47,7 +47,7 @@ void wf_impl_operation_open( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data); if (NULL != rpc) { diff --git a/lib/webfuse/adapter/impl/operation/read.c b/lib/webfuse/adapter/impl/operation/read.c index 8c956fb..3e5bfbd 100644 --- a/lib/webfuse/adapter/impl/operation/read.c +++ b/lib/webfuse/adapter/impl/operation/read.c @@ -87,7 +87,7 @@ void wf_impl_operation_read( struct fuse_file_info * file_info) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data); if (NULL != rpc) { diff --git a/lib/webfuse/adapter/impl/operation/readdir.c b/lib/webfuse/adapter/impl/operation/readdir.c index 104e807..617535d 100644 --- a/lib/webfuse/adapter/impl/operation/readdir.c +++ b/lib/webfuse/adapter/impl/operation/readdir.c @@ -137,7 +137,7 @@ void wf_impl_operation_readdir ( struct fuse_file_info * WF_UNUSED_PARAM(file_info)) { struct wf_impl_operations_context * user_data = fuse_req_userdata(request); - struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data, inode); + struct wf_impl_jsonrpc_proxy * rpc = wf_impl_operations_context_get_proxy(user_data); if (NULL != rpc) { diff --git a/lib/webfuse/adapter/impl/operations.c b/lib/webfuse/adapter/impl/operations.c index 75949b5..393ab99 100644 --- a/lib/webfuse/adapter/impl/operations.c +++ b/lib/webfuse/adapter/impl/operations.c @@ -4,13 +4,11 @@ #include struct wf_impl_jsonrpc_proxy * wf_impl_operations_context_get_proxy( - struct wf_impl_operations_context * context, - fuse_ino_t inode) + struct wf_impl_operations_context * context) { struct wf_impl_jsonrpc_proxy * proxy = NULL; - struct wf_impl_session_manager * session_manger = context->session_manager; - struct wf_impl_session * session = wf_impl_session_manager_get_by_inode(session_manger, inode); + struct wf_impl_session * session = context->session; if (NULL != session) { proxy = &session->rpc; diff --git a/lib/webfuse/adapter/impl/operations.h b/lib/webfuse/adapter/impl/operations.h index fe1a540..5d6d35b 100644 --- a/lib/webfuse/adapter/impl/operations.h +++ b/lib/webfuse/adapter/impl/operations.h @@ -7,12 +7,12 @@ extern "C" { #endif -struct wf_impl_session_manager; +struct wf_impl_session; struct wf_impl_jsonrpc_proxy; struct wf_impl_operations_context { - struct wf_impl_session_manager * session_manager; + struct wf_impl_session * session; double timeout; }; @@ -49,8 +49,7 @@ extern void wf_impl_operation_read( struct fuse_file_info *fi); extern struct wf_impl_jsonrpc_proxy * wf_impl_operations_context_get_proxy( - struct wf_impl_operations_context * context, - fuse_ino_t inode); + struct wf_impl_operations_context * context); #ifdef __cplusplus } diff --git a/lib/webfuse/adapter/impl/server.c b/lib/webfuse/adapter/impl/server.c index 5bddb10..13250f6 100644 --- a/lib/webfuse/adapter/impl/server.c +++ b/lib/webfuse/adapter/impl/server.c @@ -108,18 +108,11 @@ struct wf_server * wf_impl_server_create( server = malloc(sizeof(struct wf_server)); if (NULL != server) { - if (wf_impl_server_protocol_init(&server->protocol, config->mount_point)) - { - server->shutdown_requested = false; - wf_impl_server_config_clone(config, &server->config); - wf_impl_authenticators_move(&server->config.authenticators, &server->protocol.authenticators); - server->context = wf_impl_server_context_create(server); - } - else - { - free(server); - server = NULL; - } + wf_impl_server_protocol_init(&server->protocol, config->mount_point); + server->shutdown_requested = false; + wf_impl_server_config_clone(config, &server->config); + wf_impl_authenticators_move(&server->config.authenticators, &server->protocol.authenticators); + server->context = wf_impl_server_context_create(server); } } diff --git a/lib/webfuse/adapter/impl/server_protocol.c b/lib/webfuse/adapter/impl/server_protocol.c index 0e89437..16279ae 100644 --- a/lib/webfuse/adapter/impl/server_protocol.c +++ b/lib/webfuse/adapter/impl/server_protocol.c @@ -6,7 +6,6 @@ #include "webfuse/core/message.h" #include "webfuse/core/util.h" -#include "webfuse/adapter/impl/filesystem.h" #include "webfuse/adapter/impl/credentials.h" #include "webfuse/adapter/impl/jsonrpc/request.h" @@ -25,23 +24,15 @@ static int wf_impl_server_protocol_callback( switch (reason) { - case LWS_CALLBACK_PROTOCOL_INIT: - { - lws_sock_file_fd_type fd; - fd.filefd = wf_impl_filesystem_get_fd(&protocol->filesystem); - if (!lws_adopt_descriptor_vhost(lws_get_vhost(wsi), LWS_ADOPT_RAW_FILE_DESC, fd, ws_protocol->name, NULL)) - { - fprintf(stderr, "error: unable to adopt fd"); - } - } - break; case LWS_CALLBACK_ESTABLISHED: session = wf_impl_session_manager_add( &protocol->session_manager, wsi, &protocol->authenticators, &protocol->timeout_manager, - &protocol->server); + &protocol->server, + protocol->mount_point, + ws_protocol->name); if (NULL != session) { @@ -64,7 +55,10 @@ static int wf_impl_server_protocol_callback( } break; case LWS_CALLBACK_RAW_RX_FILE: - wf_impl_filesystem_process_request(&protocol->filesystem); + if (NULL != session) + { + wf_impl_filesystem_process_request(&session->filesystem); + } break; default: break; @@ -79,11 +73,7 @@ struct wf_server_protocol * wf_impl_server_protocol_create( struct wf_server_protocol * protocol = malloc(sizeof(struct wf_server_protocol)); if (NULL != protocol) { - if (!wf_impl_server_protocol_init(protocol, mount_point)) - { - free(protocol); - protocol = NULL; - } + wf_impl_server_protocol_init(protocol, mount_point); } return protocol; @@ -140,35 +130,24 @@ static void wf_impl_server_protocol_authenticate( } } -bool wf_impl_server_protocol_init( +void wf_impl_server_protocol_init( struct wf_server_protocol * protocol, char * mount_point) { + protocol->mount_point = strdup(mount_point); + wf_impl_timeout_manager_init(&protocol->timeout_manager); wf_impl_session_manager_init(&protocol->session_manager); wf_impl_authenticators_init(&protocol->authenticators); wf_impl_jsonrpc_server_init(&protocol->server); wf_impl_jsonrpc_server_add(&protocol->server, "authenticate", &wf_impl_server_protocol_authenticate, protocol); - - bool const success = wf_impl_filesystem_init(&protocol->filesystem, &protocol->session_manager, mount_point); - - // cleanup on error - if (!success) - { - wf_impl_jsonrpc_server_cleanup(&protocol->server); - wf_impl_authenticators_cleanup(&protocol->authenticators); - wf_impl_timeout_manager_cleanup(&protocol->timeout_manager); - wf_impl_session_manager_cleanup(&protocol->session_manager); - } - - return success; } void wf_impl_server_protocol_cleanup( struct wf_server_protocol * protocol) { - wf_impl_filesystem_cleanup(&protocol->filesystem); + free(protocol->mount_point); wf_impl_jsonrpc_server_cleanup(&protocol->server); wf_impl_timeout_manager_cleanup(&protocol->timeout_manager); wf_impl_authenticators_cleanup(&protocol->authenticators); diff --git a/lib/webfuse/adapter/impl/server_protocol.h b/lib/webfuse/adapter/impl/server_protocol.h index 8a4b0d7..2ae0fe6 100644 --- a/lib/webfuse/adapter/impl/server_protocol.h +++ b/lib/webfuse/adapter/impl/server_protocol.h @@ -1,7 +1,6 @@ #ifndef WF_ADAPTER_IMPL_SERVER_PROTOCOL_H #define WF_ADAPTER_IMPL_SERVER_PROTOCOL_H -#include "webfuse/adapter/impl/filesystem.h" #include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/adapter/impl/time/timeout_manager.h" #include "webfuse/adapter/impl/authenticators.h" @@ -17,14 +16,14 @@ struct lws_protocols; struct wf_server_protocol { + char * mount_point; struct wf_impl_timeout_manager timeout_manager; - struct wf_impl_filesystem filesystem; struct wf_impl_authenticators authenticators; struct wf_impl_session_manager session_manager; struct wf_impl_jsonrpc_server server; }; -extern bool wf_impl_server_protocol_init( +extern void wf_impl_server_protocol_init( struct wf_server_protocol * protocol, char * mount_point); diff --git a/lib/webfuse/adapter/impl/session.c b/lib/webfuse/adapter/impl/session.c index b45027d..7e07b69 100644 --- a/lib/webfuse/adapter/impl/session.c +++ b/lib/webfuse/adapter/impl/session.c @@ -33,12 +33,25 @@ static bool wf_impl_session_send( return result; } -void wf_impl_session_init( +void wf_impl_session_init_empty( + struct wf_impl_session * session) +{ + wf_message_queue_init(&session->queue); + session->is_authenticated = false; + session->wsi = NULL; + session->wsi_fuse = NULL; + session->authenticators = NULL; + session->server = NULL; +} + +bool wf_impl_session_init( struct wf_impl_session * session, struct lws * wsi, struct wf_impl_authenticators * authenticators, struct wf_impl_timeout_manager * timeout_manager, - struct wf_impl_jsonrpc_server * server) + struct wf_impl_jsonrpc_server * server, + char const * mount_point, + char const * protocol_name) { session->wsi = wsi; session->is_authenticated = false; @@ -46,17 +59,40 @@ void wf_impl_session_init( session->server = server; wf_impl_jsonrpc_proxy_init(&session->rpc, timeout_manager, &wf_impl_session_send, session); wf_message_queue_init(&session->queue); + + bool const success = wf_impl_filesystem_init(&session->filesystem, session, mount_point); + if (!success) + { + wf_impl_jsonrpc_proxy_cleanup(&session->rpc); + wf_message_queue_cleanup(&session->queue); + } + + lws_sock_file_fd_type fd; + fd.filefd = wf_impl_filesystem_get_fd(&session->filesystem); + session->wsi_fuse = lws_adopt_descriptor_vhost(lws_get_vhost(wsi), LWS_ADOPT_RAW_FILE_DESC, fd, protocol_name, wsi); + if (NULL == session->wsi_fuse) + { + fprintf(stderr, "error: unable to adopt fd"); + } + + return success; } void wf_impl_session_cleanup( struct wf_impl_session * session) { - wf_impl_jsonrpc_proxy_cleanup(&session->rpc); - wf_message_queue_cleanup(&session->queue); - session->is_authenticated = false; - session->wsi = NULL; - session->authenticators = NULL; - session->server = NULL; + if (NULL != session->wsi) + { + wf_impl_filesystem_cleanup(&session->filesystem); + + wf_impl_jsonrpc_proxy_cleanup(&session->rpc); + wf_message_queue_cleanup(&session->queue); + session->is_authenticated = false; + session->wsi = NULL; + session->wsi_fuse = NULL; + session->authenticators = NULL; + session->server = NULL; + } } bool wf_impl_session_authenticate( diff --git a/lib/webfuse/adapter/impl/session.h b/lib/webfuse/adapter/impl/session.h index 116e196..6e7ef7d 100644 --- a/lib/webfuse/adapter/impl/session.h +++ b/lib/webfuse/adapter/impl/session.h @@ -12,6 +12,7 @@ using std::size_t; #include "webfuse/core/message_queue.h" #include "webfuse/adapter/impl/jsonrpc/proxy.h" #include "webfuse/adapter/impl/jsonrpc/server.h" +#include "webfuse/adapter/impl/filesystem.h" #ifdef __cplusplus extern "C" @@ -27,19 +28,26 @@ struct wf_impl_timeout_manager; struct wf_impl_session { struct lws * wsi; + struct lws * wsi_fuse; bool is_authenticated; struct wf_message_queue queue; + struct wf_impl_filesystem filesystem; struct wf_impl_authenticators * authenticators; struct wf_impl_jsonrpc_server * server; struct wf_impl_jsonrpc_proxy rpc; }; -extern void wf_impl_session_init( +extern void wf_impl_session_init_empty( + struct wf_impl_session * session); + +extern bool wf_impl_session_init( struct wf_impl_session * session, struct lws * wsi, - struct wf_impl_authenticators * authenticators, - struct wf_impl_timeout_manager * timeout_manager, - struct wf_impl_jsonrpc_server * server); + struct wf_impl_authenticators * authenticators, + struct wf_impl_timeout_manager * timeout_manager, + struct wf_impl_jsonrpc_server * server, + char const * mount_point, + char const * protocol_name); extern bool wf_impl_session_authenticate( struct wf_impl_session * session, diff --git a/lib/webfuse/adapter/impl/session_manager.c b/lib/webfuse/adapter/impl/session_manager.c index be87c2a..49fccf6 100644 --- a/lib/webfuse/adapter/impl/session_manager.c +++ b/lib/webfuse/adapter/impl/session_manager.c @@ -5,7 +5,7 @@ void wf_impl_session_manager_init( struct wf_impl_session_manager * manager) { - wf_impl_session_init(&manager->session, NULL, NULL, NULL, NULL); + wf_impl_session_init_empty(&manager->session); } void wf_impl_session_manager_cleanup( @@ -19,13 +19,15 @@ struct wf_impl_session * wf_impl_session_manager_add( struct lws * wsi, struct wf_impl_authenticators * authenticators, struct wf_impl_timeout_manager * timeout_manager, - struct wf_impl_jsonrpc_server * server) + struct wf_impl_jsonrpc_server * server, + char const * mount_point, + char const * protocol_name) { struct wf_impl_session * session = NULL; if (NULL == manager->session.wsi) { session = &manager->session; - wf_impl_session_init(&manager->session, wsi, authenticators, timeout_manager, server); + wf_impl_session_init(&manager->session, wsi, authenticators, timeout_manager, server, mount_point, protocol_name); } return session; @@ -36,7 +38,7 @@ struct wf_impl_session * wf_impl_session_manager_get( struct lws * wsi) { struct wf_impl_session * session = NULL; - if (wsi == manager->session.wsi) + if ((wsi == manager->session.wsi) || (wsi == manager->session.wsi_fuse)) { session = &manager->session; } @@ -44,22 +46,6 @@ struct wf_impl_session * wf_impl_session_manager_get( return session; } -struct wf_impl_session * wf_impl_session_manager_get_by_inode( - struct wf_impl_session_manager * manager, - fuse_ino_t WF_UNUSED_PARAM(inode)) -{ - // ToDo: use inode to determine session manager - - struct wf_impl_session * session = NULL; - if (NULL != manager->session.wsi) - { - session = &manager->session; - } - - return session; -} - - void wf_impl_session_manager_remove( struct wf_impl_session_manager * manager, struct lws * wsi) diff --git a/lib/webfuse/adapter/impl/session_manager.h b/lib/webfuse/adapter/impl/session_manager.h index 6b7a26b..fe60551 100644 --- a/lib/webfuse/adapter/impl/session_manager.h +++ b/lib/webfuse/adapter/impl/session_manager.h @@ -33,16 +33,14 @@ extern struct wf_impl_session * wf_impl_session_manager_add( struct lws * wsi, struct wf_impl_authenticators * authenticators, struct wf_impl_timeout_manager * timeout_manager, - struct wf_impl_jsonrpc_server * server); + struct wf_impl_jsonrpc_server * server, + char const * mount_point, + char const * protocol_name); extern struct wf_impl_session * wf_impl_session_manager_get( struct wf_impl_session_manager * manager, struct lws * wsi); -extern struct wf_impl_session * wf_impl_session_manager_get_by_inode( - struct wf_impl_session_manager * session_manger, - fuse_ino_t inode); - extern void wf_impl_session_manager_remove( struct wf_impl_session_manager * manager, struct lws * wsi);