diff --git a/Makefile-libostree.am b/Makefile-libostree.am index 0a4de6de..19f8184e 100644 --- a/Makefile-libostree.am +++ b/Makefile-libostree.am @@ -202,6 +202,10 @@ libostree_1_la_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/bsdiff -I$(srcdir)/libglnx -I$( libostree_1_la_LDFLAGS = -version-number 1:0:0 -Bsymbolic-functions $(addprefix $(wl_versionscript_arg),$(symbol_files)) libostree_1_la_LIBADD = libotutil.la libglnx.la libbsdiff.la libostree-kernel-args.la $(OT_INTERNAL_GIO_UNIX_LIBS) $(OT_INTERNAL_GPGME_LIBS) \ $(OT_DEP_LZMA_LIBS) $(OT_DEP_ZLIB_LIBS) $(OT_DEP_CRYPTO_LIBS) +# Some change between rust-1.21.0-1.fc27 and rust-1.22.1-1.fc27.x86_64 +if ENABLE_RUST +libostree_1_la_LIBADD += -ldl +endif libostree_1_la_LIBADD += $(bupsplitpath) EXTRA_libostree_1_la_DEPENDENCIES = $(symbol_files) diff --git a/Makefile-tests.am b/Makefile-tests.am index 2b335556..284dc76f 100644 --- a/Makefile-tests.am +++ b/Makefile-tests.am @@ -116,6 +116,7 @@ _installed_or_uninstalled_test_scripts = \ tests/test-pull-mirrorlist.sh \ tests/test-summary-update.sh \ tests/test-summary-view.sh \ + tests/test-no-initramfs.sh \ $(NULL) experimental_test_scripts = \ @@ -130,7 +131,13 @@ experimental_test_scripts = \ tests/test-summary-collections.sh \ tests/test-pull-collections.sh \ $(NULL) -test_extra_programs = $(NULL) +test_extra_programs = \ + tests/get-byte-order \ + $(NULL) + +tests_get_byte_order_SOURCES = tests/get-byte-order.c +tests_get_byte_order_CFLAGS = $(AM_CFLAGS) $(GLIB_CFLAGS) +tests_get_byte_order_LDADD = $(GLIB_LIBS) tests_repo_finder_mount_SOURCES = tests/repo-finder-mount.c tests_repo_finder_mount_CFLAGS = $(common_tests_cflags) @@ -171,6 +178,7 @@ dist_installed_test_data = tests/archive-test.sh \ tests/pre-endian-deltas-repo-little.tar.xz \ tests/fah-deltadata-old.tar.xz \ tests/fah-deltadata-new.tar.xz \ + tests/ostree-path-traverse.tar.gz \ tests/libtest-core.sh \ $(NULL) @@ -375,6 +383,14 @@ dist_test_scripts += $(_installed_or_uninstalled_test_scripts) test_programs += $(_installed_or_uninstalled_test_programs) endif +if !USE_LIBSOUP +no-soup-for-you-warning: + @echo "WARNING: $(PACKAGE) was built without libsoup, which is currently" 1>&2 + @echo "WARNING: required for many unit tests." 1>&2 + sleep 10 +check: no-soup-for-you-warning +endif + # Unfortunately the glib test data APIs don't actually handle # non-recursive Automake, so we change our code to canonically look # for tests/ which is just a symlink when installed. diff --git a/Makefile.in b/Makefile.in index 0a220382..90f9284c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -433,13 +433,15 @@ check_PROGRAMS = $(am__EXEEXT_13) $(am__EXEEXT_14) $(am__EXEEXT_15) @BUILDOPT_IS_DEVEL_BUILD_TRUE@am__append_24 = $(top_srcdir)/src/libostree/libostree-devel.sym @ENABLE_EXPERIMENTAL_API_TRUE@am__append_25 = $(top_srcdir)/src/libostree/libostree-experimental.sym -@USE_LIBARCHIVE_TRUE@am__append_26 = $(OT_DEP_LIBARCHIVE_CFLAGS) -@USE_LIBARCHIVE_TRUE@am__append_27 = $(OT_DEP_LIBARCHIVE_LIBS) -@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_28 = $(OT_DEP_AVAHI_CFLAGS) -@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_29 = $(OT_DEP_AVAHI_LIBS) -@BUILDOPT_LIBSYSTEMD_TRUE@am__append_30 = $(LIBSYSTEMD_CFLAGS) -@BUILDOPT_LIBSYSTEMD_TRUE@am__append_31 = $(LIBSYSTEMD_LIBS) -@USE_CURL_OR_SOUP_TRUE@am__append_32 = \ +# Some change between rust-1.21.0-1.fc27 and rust-1.22.1-1.fc27.x86_64 +@ENABLE_RUST_TRUE@am__append_26 = -ldl +@USE_LIBARCHIVE_TRUE@am__append_27 = $(OT_DEP_LIBARCHIVE_CFLAGS) +@USE_LIBARCHIVE_TRUE@am__append_28 = $(OT_DEP_LIBARCHIVE_LIBS) +@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_29 = $(OT_DEP_AVAHI_CFLAGS) +@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_30 = $(OT_DEP_AVAHI_LIBS) +@BUILDOPT_LIBSYSTEMD_TRUE@am__append_31 = $(LIBSYSTEMD_CFLAGS) +@BUILDOPT_LIBSYSTEMD_TRUE@am__append_32 = $(LIBSYSTEMD_LIBS) +@USE_CURL_OR_SOUP_TRUE@am__append_33 = \ @USE_CURL_OR_SOUP_TRUE@ src/libostree/ostree-fetcher.h \ @USE_CURL_OR_SOUP_TRUE@ src/libostree/ostree-fetcher-util.h \ @USE_CURL_OR_SOUP_TRUE@ src/libostree/ostree-fetcher-util.c \ @@ -448,32 +450,32 @@ check_PROGRAMS = $(am__EXEEXT_13) $(am__EXEEXT_14) $(am__EXEEXT_15) @USE_CURL_OR_SOUP_TRUE@ src/libostree/ostree-metalink.c \ @USE_CURL_OR_SOUP_TRUE@ $(NULL) -@USE_CURL_TRUE@am__append_33 = src/libostree/ostree-fetcher-curl.c \ +@USE_CURL_TRUE@am__append_34 = src/libostree/ostree-fetcher-curl.c \ @USE_CURL_TRUE@ src/libostree/ostree-soup-uri.h src/libostree/ostree-soup-uri.c \ @USE_CURL_TRUE@ src/libostree/ostree-soup-form.c \ @USE_CURL_TRUE@ $(NULL) -@USE_CURL_TRUE@am__append_34 = $(OT_DEP_CURL_CFLAGS) -@USE_CURL_TRUE@am__append_35 = $(OT_DEP_CURL_LIBS) -@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_36 = src/libostree/ostree-fetcher-soup.c -@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_37 = $(OT_INTERNAL_SOUP_CFLAGS) -@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_38 = $(OT_INTERNAL_SOUP_LIBS) -@USE_LIBMOUNT_TRUE@am__append_39 = $(OT_DEP_LIBMOUNT_CFLAGS) -@USE_LIBMOUNT_TRUE@am__append_40 = $(OT_DEP_LIBMOUNT_LIBS) -@USE_SELINUX_TRUE@am__append_41 = $(OT_DEP_SELINUX_CFLAGS) -@USE_SELINUX_TRUE@am__append_42 = $(OT_DEP_SELINUX_LIBS) +@USE_CURL_TRUE@am__append_35 = $(OT_DEP_CURL_CFLAGS) +@USE_CURL_TRUE@am__append_36 = $(OT_DEP_CURL_LIBS) +@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_37 = src/libostree/ostree-fetcher-soup.c +@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_38 = $(OT_INTERNAL_SOUP_CFLAGS) +@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_39 = $(OT_INTERNAL_SOUP_LIBS) +@USE_LIBMOUNT_TRUE@am__append_40 = $(OT_DEP_LIBMOUNT_CFLAGS) +@USE_LIBMOUNT_TRUE@am__append_41 = $(OT_DEP_LIBMOUNT_LIBS) +@USE_SELINUX_TRUE@am__append_42 = $(OT_DEP_SELINUX_CFLAGS) +@USE_SELINUX_TRUE@am__append_43 = $(OT_DEP_SELINUX_LIBS) # When compiling this is set via config.h, but g-ir-scanner can't use that -@BUILDOPT_INTROSPECTION_TRUE@@ENABLE_EXPERIMENTAL_API_TRUE@am__append_43 = -DOSTREE_ENABLE_EXPERIMENTAL_API=1 -@BUILDOPT_INTROSPECTION_TRUE@am__append_44 = OSTree-1.0.gir +@BUILDOPT_INTROSPECTION_TRUE@@ENABLE_EXPERIMENTAL_API_TRUE@am__append_44 = -DOSTREE_ENABLE_EXPERIMENTAL_API=1 @BUILDOPT_INTROSPECTION_TRUE@am__append_45 = OSTree-1.0.gir -@BUILDOPT_INTROSPECTION_TRUE@am__append_46 = OSTree-1.0.typelib -@BUILDOPT_INTROSPECTION_TRUE@am__append_47 = $(gir_DATA) $(typelib_DATA) -@ENABLE_EXPERIMENTAL_API_TRUE@am__append_48 = \ +@BUILDOPT_INTROSPECTION_TRUE@am__append_46 = OSTree-1.0.gir +@BUILDOPT_INTROSPECTION_TRUE@am__append_47 = OSTree-1.0.typelib +@BUILDOPT_INTROSPECTION_TRUE@am__append_48 = $(gir_DATA) $(typelib_DATA) +@ENABLE_EXPERIMENTAL_API_TRUE@am__append_49 = \ @ENABLE_EXPERIMENTAL_API_TRUE@ src/ostree/ot-builtin-create-usb.c \ @ENABLE_EXPERIMENTAL_API_TRUE@ src/ostree/ot-builtin-find-remotes.c \ @ENABLE_EXPERIMENTAL_API_TRUE@ $(NULL) -@USE_CURL_OR_SOUP_TRUE@am__append_49 = src/ostree/ot-remote-builtin-add-cookie.c \ +@USE_CURL_OR_SOUP_TRUE@am__append_50 = src/ostree/ot-remote-builtin-add-cookie.c \ @USE_CURL_OR_SOUP_TRUE@ src/ostree/ot-remote-builtin-delete-cookie.c \ @USE_CURL_OR_SOUP_TRUE@ src/ostree/ot-remote-builtin-list-cookies.c \ @USE_CURL_OR_SOUP_TRUE@ src/ostree/ot-remote-cookie-util.h \ @@ -481,66 +483,66 @@ check_PROGRAMS = $(am__EXEEXT_13) $(am__EXEEXT_14) $(am__EXEEXT_15) @USE_CURL_OR_SOUP_TRUE@ $(NULL) src/ostree/ot-builtin-pull.c # Eventually once we stop things from using this, we should support disabling this -@USE_LIBSOUP_TRUE@am__append_50 = src/ostree/ot-builtin-trivial-httpd.c -@USE_LIBSOUP_TRUE@am__append_51 = ostree-trivial-httpd +@USE_LIBSOUP_TRUE@am__append_51 = src/ostree/ot-builtin-trivial-httpd.c +@USE_LIBSOUP_TRUE@am__append_52 = ostree-trivial-httpd # This is necessary for the cookie jar bits -@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_52 = $(OT_INTERNAL_SOUP_CFLAGS) -@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_53 = $(OT_INTERNAL_SOUP_LIBS) -@USE_LIBARCHIVE_TRUE@am__append_54 = $(OT_DEP_LIBARCHIVE_CFLAGS) -@USE_LIBARCHIVE_TRUE@am__append_55 = $(OT_DEP_LIBARCHIVE_LIBS) -@BUILDOPT_SYSTEMD_TRUE@am__append_56 = ostree-remount +@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_53 = $(OT_INTERNAL_SOUP_CFLAGS) +@USE_CURL_FALSE@@USE_LIBSOUP_TRUE@am__append_54 = $(OT_INTERNAL_SOUP_LIBS) +@USE_LIBARCHIVE_TRUE@am__append_55 = $(OT_DEP_LIBARCHIVE_CFLAGS) +@USE_LIBARCHIVE_TRUE@am__append_56 = $(OT_DEP_LIBARCHIVE_LIBS) +@BUILDOPT_SYSTEMD_TRUE@am__append_57 = ostree-remount # It is built anyway as a side-effect of having the symlink in tests/, # and if we declare it here, it gets cleaned up properly -@BUILDOPT_SYSTEMD_FALSE@am__append_57 = ostree-remount -@BUILDOPT_USE_STATIC_COMPILER_FALSE@am__append_58 = ostree-prepare-root +@BUILDOPT_SYSTEMD_FALSE@am__append_58 = ostree-remount +@BUILDOPT_USE_STATIC_COMPILER_FALSE@am__append_59 = ostree-prepare-root # This is the "new mode" of using a generator for /var; see # https://github.com/ostreedev/ostree/issues/855 -@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_59 = -DHAVE_SYSTEMD_AND_LIBMOUNT=1 @BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_60 = -DHAVE_SYSTEMD_AND_LIBMOUNT=1 +@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_61 = -DHAVE_SYSTEMD_AND_LIBMOUNT=1 @BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@systemdsystemgenerator_PROGRAMS = ostree-system-generator$(EXEEXT) -@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_61 = $(systemdsystemgenerator_PROGRAMS) +@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_62 = $(systemdsystemgenerator_PROGRAMS) # Allow the distcheck install under $prefix test to pass -@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_62 = --with-systemdsystemgeneratordir='$${libdir}/systemd/system-generators' -@BUILDOPT_FUSE_TRUE@am__append_63 = rofiles-fuse -@BUILDOPT_ASAN_TRUE@am__append_64 = OT_SKIP_READDIR_RAND=1 G_SLICE=always-malloc -@ENABLE_EXPERIMENTAL_API_TRUE@am__append_65 = $(experimental_test_scripts) -@ENABLE_EXPERIMENTAL_API_TRUE@am__append_66 = tests/repo-finder-mount -@ENABLE_EXPERIMENTAL_API_FALSE@am__append_67 = $(experimental_test_scripts) -@BUILDOPT_FUSE_TRUE@am__append_68 = tests/test-rofiles-fuse.sh -@BUILDOPT_FUSE_TRUE@am__append_69 = tests/rofiles-fuse-symlink-stamp -@BUILDOPT_FUSE_FALSE@am__append_70 = tests/test-rofiles-fuse.sh -@USE_LIBSOUP_TRUE@am__append_71 = tests/test-remote-cookies.sh -@BUILDOPT_GJS_TRUE@am__append_72 = $(js_tests) $(js_installed_tests) -@BUILDOPT_GJS_FALSE@am__append_73 = $(js_tests) -@BUILDOPT_GJS_FALSE@am__append_74 = $(js_installed_tests) -@ENABLE_INSTALLED_TESTS_FALSE@am__append_75 = -rpath $(abs_builddir) -@ENABLE_EXPERIMENTAL_API_TRUE@am__append_76 = \ +@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_63 = --with-systemdsystemgeneratordir='$${libdir}/systemd/system-generators' +@BUILDOPT_FUSE_TRUE@am__append_64 = rofiles-fuse +@BUILDOPT_ASAN_TRUE@am__append_65 = OT_SKIP_READDIR_RAND=1 G_SLICE=always-malloc +@ENABLE_EXPERIMENTAL_API_TRUE@am__append_66 = $(experimental_test_scripts) +@ENABLE_EXPERIMENTAL_API_TRUE@am__append_67 = tests/repo-finder-mount +@ENABLE_EXPERIMENTAL_API_FALSE@am__append_68 = $(experimental_test_scripts) +@BUILDOPT_FUSE_TRUE@am__append_69 = tests/test-rofiles-fuse.sh +@BUILDOPT_FUSE_TRUE@am__append_70 = tests/rofiles-fuse-symlink-stamp +@BUILDOPT_FUSE_FALSE@am__append_71 = tests/test-rofiles-fuse.sh +@USE_LIBSOUP_TRUE@am__append_72 = tests/test-remote-cookies.sh +@BUILDOPT_GJS_TRUE@am__append_73 = $(js_tests) $(js_installed_tests) +@BUILDOPT_GJS_FALSE@am__append_74 = $(js_tests) +@BUILDOPT_GJS_FALSE@am__append_75 = $(js_installed_tests) +@ENABLE_INSTALLED_TESTS_FALSE@am__append_76 = -rpath $(abs_builddir) +@ENABLE_EXPERIMENTAL_API_TRUE@am__append_77 = \ @ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-bloom \ @ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-repo-finder-config \ @ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-repo-finder-mount \ @ENABLE_EXPERIMENTAL_API_TRUE@ $(NULL) -@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_77 = tests/test-repo-finder-avahi -@USE_LIBARCHIVE_TRUE@am__append_78 = tests/test-libarchive-import -@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_79 = $(_installed_or_uninstalled_test_scripts) -@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_80 = $(_installed_or_uninstalled_test_programs) -@ENABLE_INSTALLED_TESTS_TRUE@am__append_81 = install-installed-tests-extra +@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_78 = tests/test-repo-finder-avahi +@USE_LIBARCHIVE_TRUE@am__append_79 = tests/test-libarchive-import +@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_80 = $(_installed_or_uninstalled_test_scripts) +@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_81 = $(_installed_or_uninstalled_test_programs) +@ENABLE_INSTALLED_TESTS_TRUE@am__append_82 = install-installed-tests-extra # Allow the distcheck install under $prefix test to pass -@BUILDOPT_SYSTEMD_TRUE@am__append_82 = --with-systemdsystemunitdir='$${libdir}/systemd/system' +@BUILDOPT_SYSTEMD_TRUE@am__append_83 = --with-systemdsystemunitdir='$${libdir}/systemd/system' # We're using the system grub2-mkconfig generator -@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_83 = src/boot/grub2/grub2-15_ostree -@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_84 = install-grub2-config-hook -@BUILDOPT_TRIVIAL_HTTPD_TRUE@@ENABLE_MAN_TRUE@am__append_85 = ostree-trivial-httpd.1 +@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_84 = src/boot/grub2/grub2-15_ostree +@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_85 = install-grub2-config-hook +@BUILDOPT_TRIVIAL_HTTPD_TRUE@@ENABLE_MAN_TRUE@am__append_86 = ostree-trivial-httpd.1 # We still want to distribute the source, even if we are not building it -@BUILDOPT_TRIVIAL_HTTPD_FALSE@@ENABLE_MAN_TRUE@am__append_86 = man/ostree-trivial-httpd.xml -@BUILDOPT_FUSE_TRUE@@ENABLE_MAN_TRUE@am__append_87 = rofiles-fuse.1 -@ENABLE_MAN_TRUE@am__append_88 = $(man1_MANS:.1=.xml) $(man5_MANS:.5=.xml) -@ENABLE_MAN_TRUE@am__append_89 = \ +@BUILDOPT_TRIVIAL_HTTPD_FALSE@@ENABLE_MAN_TRUE@am__append_87 = man/ostree-trivial-httpd.xml +@BUILDOPT_FUSE_TRUE@@ENABLE_MAN_TRUE@am__append_88 = rofiles-fuse.1 +@ENABLE_MAN_TRUE@am__append_89 = $(man1_MANS:.1=.xml) $(man5_MANS:.5=.xml) +@ENABLE_MAN_TRUE@am__append_90 = \ @ENABLE_MAN_TRUE@ $(man1_MANS) \ @ENABLE_MAN_TRUE@ $(man5_MANS) \ @ENABLE_MAN_TRUE@ $(NULL) @@ -671,11 +673,11 @@ am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) libostree_1_la_DEPENDENCIES = libotutil.la libglnx.la libbsdiff.la \ libostree-kernel-args.la $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(bupsplitpath) \ - $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ - $(am__DEPENDENCIES_6) $(am__DEPENDENCIES_7) \ - $(am__DEPENDENCIES_8) $(am__DEPENDENCIES_9) \ - $(am__DEPENDENCIES_10) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(bupsplitpath) $(am__DEPENDENCIES_4) \ + $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) \ + $(am__DEPENDENCIES_7) $(am__DEPENDENCIES_8) \ + $(am__DEPENDENCIES_9) $(am__DEPENDENCIES_10) am__libostree_1_la_SOURCES_DIST = \ src/libostree/ostree-async-progress.c \ src/libostree/ostree-cmdprivate.h \ @@ -932,7 +934,8 @@ am__EXEEXT_8 = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \ $(am__EXEEXT_7) @ENABLE_INSTALLED_TESTS_EXCLUSIVE_TRUE@am__EXEEXT_9 = $(am__EXEEXT_6) @ENABLE_EXPERIMENTAL_API_TRUE@am__EXEEXT_10 = tests/repo-finder-mount$(EXEEXT) -am__EXEEXT_11 = $(am__EXEEXT_2) $(am__EXEEXT_10) +am__EXEEXT_11 = tests/get-byte-order$(EXEEXT) $(am__EXEEXT_2) \ + $(am__EXEEXT_10) am__EXEEXT_12 = $(am__EXEEXT_8) $(am__EXEEXT_9) $(am__EXEEXT_11) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__EXEEXT_13 = $(am__EXEEXT_12) am__EXEEXT_14 = test-libglnx-xattrs$(EXEEXT) \ @@ -1114,7 +1117,7 @@ am__rofiles_fuse_SOURCES_DIST = src/rofiles-fuse/main.c rofiles_fuse_OBJECTS = $(am_rofiles_fuse_OBJECTS) @BUILDOPT_FUSE_TRUE@rofiles_fuse_DEPENDENCIES = libglnx.la \ @BUILDOPT_FUSE_TRUE@ $(am__DEPENDENCIES_1) \ -@BUILDOPT_FUSE_TRUE@ $(am__DEPENDENCIES_2) +@BUILDOPT_FUSE_TRUE@ $(am__DEPENDENCIES_2) libostree-1.la rofiles_fuse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(rofiles_fuse_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @@ -1154,6 +1157,14 @@ test_libglnx_xattrs_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(test_libglnx_xattrs_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ +am_tests_get_byte_order_OBJECTS = \ + tests/tests_get_byte_order-get-byte-order.$(OBJEXT) +tests_get_byte_order_OBJECTS = $(am_tests_get_byte_order_OBJECTS) +tests_get_byte_order_DEPENDENCIES = $(am__DEPENDENCIES_1) +tests_get_byte_order_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(tests_get_byte_order_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ am_tests_repo_finder_mount_OBJECTS = \ tests/tests_repo_finder_mount-repo-finder-mount.$(OBJEXT) tests_repo_finder_mount_OBJECTS = \ @@ -1398,7 +1409,7 @@ SOURCES = $(libbsdiff_la_SOURCES) $(libbupsplit_la_SOURCES) \ $(ostree_trivial_httpd_SOURCES) $(rofiles_fuse_SOURCES) \ $(test_libglnx_errors_SOURCES) $(test_libglnx_fdio_SOURCES) \ $(test_libglnx_macros_SOURCES) $(test_libglnx_shutil_SOURCES) \ - $(test_libglnx_xattrs_SOURCES) \ + $(test_libglnx_xattrs_SOURCES) $(tests_get_byte_order_SOURCES) \ $(tests_repo_finder_mount_SOURCES) tests/test-basic-c.c \ $(tests_test_bloom_SOURCES) tests/test-bsdiff.c \ $(tests_test_checksum_SOURCES) \ @@ -1426,7 +1437,7 @@ DIST_SOURCES = $(libbsdiff_la_SOURCES) \ $(am__rofiles_fuse_SOURCES_DIST) \ $(test_libglnx_errors_SOURCES) $(test_libglnx_fdio_SOURCES) \ $(test_libglnx_macros_SOURCES) $(test_libglnx_shutil_SOURCES) \ - $(test_libglnx_xattrs_SOURCES) \ + $(test_libglnx_xattrs_SOURCES) $(tests_get_byte_order_SOURCES) \ $(tests_repo_finder_mount_SOURCES) tests/test-basic-c.c \ $(tests_test_bloom_SOURCES) tests/test-bsdiff.c \ $(tests_test_checksum_SOURCES) \ @@ -1733,8 +1744,8 @@ am__EXEEXT_25 = tests/test-basic.sh tests/test-basic-user.sh \ tests/test-demo-buildsystem.sh tests/test-switchroot.sh \ tests/test-pull-contenturl.sh tests/test-pull-mirrorlist.sh \ tests/test-summary-update.sh tests/test-summary-view.sh \ - $(am__EXEEXT_2) $(am__EXEEXT_22) $(am__append_68) \ - $(am__append_71) $(am__EXEEXT_24) + tests/test-no-initramfs.sh $(am__EXEEXT_2) $(am__EXEEXT_22) \ + $(am__append_69) $(am__append_72) $(am__EXEEXT_24) @ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__EXEEXT_26 = \ @ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@ $(am__EXEEXT_25) am__EXEEXT_27 = $(am__EXEEXT_2) $(am__EXEEXT_26) @@ -2030,21 +2041,21 @@ AM_CFLAGS = -std=gnu99 -fno-strict-aliasing $(WARN_CFLAGS) # Allow the distcheck install under $prefix test to pass AM_DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man \ - --disable-maintainer-mode $(NULL) $(am__append_62) \ - $(am__append_82) \ + --disable-maintainer-mode $(NULL) $(am__append_63) \ + $(am__append_83) \ BASH_COMPLETIONSDIR='$${datadir}/bash-completion/completions' SUBDIRS = . $(am__append_14) NULL = BUILT_SOURCES = $(nodist_libostree_1_la_SOURCES) MANPAGES = -CLEANFILES = $(am__append_13) $(BUILT_SOURCES) $(am__append_47) \ +CLEANFILES = $(am__append_13) $(BUILT_SOURCES) $(am__append_48) \ src/ostree/parse-datetime.c tests/libreaddir-rand.so \ tests/ostree-symlink-stamp \ tests/ostree-prepare-root-symlink-stamp \ tests/ostree-remount-symlink-stamp \ tests/rofiles-fuse-symlink-stamp tests/ostree \ tests/ostree-prepare-root tests/ostree-remount \ - tests/rofiles-fuse $(am__append_89) + tests/rofiles-fuse $(am__append_90) EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) autogen.sh \ COPYING README.md $(am__append_15) libglnx/README.md \ libglnx/COPYING libglnx/libglnx.m4 $(NULL) \ @@ -2061,19 +2072,19 @@ EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) autogen.sh \ src/libostree/ostree-repo-deprecated.h \ src/libostree/ostree-version.h src/ostree/parse-datetime.y \ buildutil/tap-driver.sh buildutil/tap-test tests/glib.supp \ - tests/ostree.supp $(NULL) $(am__append_67) $(am__append_70) \ - $(am__append_73) tests/libtest.sh $(am__append_74) \ + tests/ostree.supp $(NULL) $(am__append_68) $(am__append_71) \ + $(am__append_74) tests/libtest.sh $(am__append_75) \ tests/libostreetest.h tests/libtest.sh \ tests/gpg-verify-data/README.md $(NULL) \ src/boot/dracut/module-setup.sh src/boot/dracut/ostree.conf \ src/boot/mkinitcpio/ostree \ src/boot/ostree-prepare-root.service \ src/boot/ostree-remount.service src/boot/grub2/grub2-15_ostree \ - src/boot/grub2/ostree-grub-generator $(NULL) $(am__append_86) \ - $(am__append_88) + src/boot/grub2/ostree-grub-generator $(NULL) $(am__append_87) \ + $(am__append_89) bin_SCRIPTS = lib_LTLIBRARIES = libostree-1.la -pkglibexec_SCRIPTS = $(am__append_83) +pkglibexec_SCRIPTS = $(am__append_84) noinst_LTLIBRARIES = $(am__append_1) libglnx.la libbsdiff.la \ libotutil.la libostree-kernel-args.la $(am__append_18) \ libostreetest.la @@ -2081,11 +2092,11 @@ privlibdir = $(pkglibdir) privlib_LTLIBRARIES = pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = src/libostree/ostree-1.pc -INTROSPECTION_GIRS = $(am__append_44) +INTROSPECTION_GIRS = $(am__append_45) girdir = $(datadir)/gir-1.0 -gir_DATA = $(am__append_45) +gir_DATA = $(am__append_46) typelibdir = $(libdir)/girepository-1.0 -typelib_DATA = $(am__append_46) +typelib_DATA = $(am__append_47) gsettings_SCHEMAS = ostree_bootdir = $(prefix)/lib/ostree @@ -2104,7 +2115,7 @@ AM_TESTS_ENVIRONMENT = G_TEST_SRCDIR="$(abs_srcdir)" \ pwd)$${LD_LIBRARY_PATH:+:$${LD_LIBRARY_PATH}} PATH=$$(cd \ $(top_builddir)/tests && pwd):$${PATH} \ OSTREE_FEATURES="$(OSTREE_FEATURES)" PYTHONUNBUFFERED=1 \ - $(NULL) $(am__append_64) + $(NULL) $(am__append_65) LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/buildutil/tap-driver.sh LOG_COMPILER = $(top_srcdir)/buildutil/tap-test installed_test_LTLIBRARIES = $(am__append_12) @@ -2144,14 +2155,14 @@ all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installe # This initializes some more variables # This is a special facility to chain together hooks easily -INSTALL_DATA_HOOKS = install-mkdir-remotes-d-hook $(am__append_81) \ - $(am__append_84) +INSTALL_DATA_HOOKS = install-mkdir-remotes-d-hook $(am__append_82) \ + $(am__append_85) ALL_LOCAL_RULES = tests/libreaddir-rand.so shortened_sysconfdir = $$(echo "$(sysconfdir)" | sed -e 's|^$(prefix)||' -e 's|^/||') OSTREE_GITREV = $(shell cd $(srcdir) && if command -v git >/dev/null 2>&1 && test -d .git; then git describe --abbrev=42 --tags --always HEAD; fi) ACLOCAL_AMFLAGS = -I buildutil -I libglnx ${ACLOCAL_FLAGS} GITIGNOREFILES = aclocal.m4 build-aux/ buildutil/*.m4 config.h.in \ - gtk-doc.make $(am__append_61) + gtk-doc.make $(am__append_62) OT_INTERNAL_GIO_UNIX_CFLAGS = $(OT_DEP_GIO_UNIX_CFLAGS) OT_INTERNAL_GIO_UNIX_LIBS = $(OT_DEP_GIO_UNIX_LIBS) OT_INTERNAL_SOUP_CFLAGS = $(OT_DEP_SOUP_CFLAGS) @@ -2356,8 +2367,8 @@ libostree_1_la_SOURCES = src/libostree/ostree-async-progress.c \ src/libostree/ostree-gpg-verify-result-private.h \ src/libostree/ostree-autocleanups.h $(NULL) $(am__append_19) \ $(am__append_20) $(am__append_21) $(am__append_22) \ - $(am__append_23) $(am__append_32) $(am__append_33) \ - $(am__append_36) + $(am__append_23) $(am__append_33) $(am__append_34) \ + $(am__append_37) libostree_experimental_headers = \ src/libostree/ostree-ref.h \ src/libostree/ostree-remote.h \ @@ -2379,23 +2390,23 @@ libostree_1_la_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/bsdiff \ $(OT_DEP_LZMA_CFLAGS) $(OT_DEP_ZLIB_CFLAGS) \ $(OT_DEP_CRYPTO_CFLAGS) -fvisibility=hidden \ '-D_OSTREE_PUBLIC=__attribute__((visibility("default"))) \ - extern' $(am__append_26) $(am__append_28) $(am__append_30) \ - $(am__append_34) $(am__append_37) $(am__append_39) \ - $(am__append_41) + extern' $(am__append_27) $(am__append_29) $(am__append_31) \ + $(am__append_35) $(am__append_38) $(am__append_40) \ + $(am__append_42) libostree_1_la_LDFLAGS = -version-number 1:0:0 -Bsymbolic-functions $(addprefix $(wl_versionscript_arg),$(symbol_files)) libostree_1_la_LIBADD = libotutil.la libglnx.la libbsdiff.la \ libostree-kernel-args.la $(OT_INTERNAL_GIO_UNIX_LIBS) \ $(OT_INTERNAL_GPGME_LIBS) $(OT_DEP_LZMA_LIBS) \ - $(OT_DEP_ZLIB_LIBS) $(OT_DEP_CRYPTO_LIBS) $(bupsplitpath) \ - $(am__append_27) $(am__append_29) $(am__append_31) \ - $(am__append_35) $(am__append_38) $(am__append_40) \ - $(am__append_42) + $(OT_DEP_ZLIB_LIBS) $(OT_DEP_CRYPTO_LIBS) $(am__append_26) \ + $(bupsplitpath) $(am__append_28) $(am__append_30) \ + $(am__append_32) $(am__append_36) $(am__append_39) \ + $(am__append_41) $(am__append_43) EXTRA_libostree_1_la_DEPENDENCIES = $(symbol_files) @BUILDOPT_INTROSPECTION_TRUE@OSTree_1_0_gir_EXPORT_PACKAGES = ostree-1 @BUILDOPT_INTROSPECTION_TRUE@OSTree_1_0_gir_INCLUDES = Gio-2.0 @BUILDOPT_INTROSPECTION_TRUE@OSTree_1_0_gir_CFLAGS = \ @BUILDOPT_INTROSPECTION_TRUE@ $(libostree_1_la_CFLAGS) \ -@BUILDOPT_INTROSPECTION_TRUE@ $(am__append_43) +@BUILDOPT_INTROSPECTION_TRUE@ $(am__append_44) @BUILDOPT_INTROSPECTION_TRUE@OSTree_1_0_gir_LIBS = libostree-1.la @BUILDOPT_INTROSPECTION_TRUE@OSTree_1_0_gir_SCANNERFLAGS = --warn-all --identifier-prefix=Ostree --symbol-prefix=ostree $(GI_SCANNERFLAGS) @BUILDOPT_INTROSPECTION_TRUE@OSTree_1_0_gir_FILES = $(libostreeinclude_HEADERS) $(filter-out %-private.h %/ostree-soup-uri.h $(libostree_experimental_headers),$(libostree_1_la_SOURCES)) @@ -2423,7 +2434,7 @@ ostree_SOURCES = src/ostree/main.c src/ostree/ot-builtin-admin.c \ src/ostree/ot-main.c src/ostree/ot-dump.h src/ostree/ot-dump.c \ src/ostree/ot-editor.c src/ostree/ot-editor.h \ src/ostree/parse-datetime.h src/ostree/parse-datetime.c \ - $(NULL) $(am__append_48) src/ostree/ot-admin-builtin-init-fs.c \ + $(NULL) $(am__append_49) src/ostree/ot-admin-builtin-init-fs.c \ src/ostree/ot-admin-builtin-diff.c \ src/ostree/ot-admin-builtin-deploy.c \ src/ostree/ot-admin-builtin-undeploy.c \ @@ -2450,7 +2461,7 @@ ostree_SOURCES = src/ostree/main.c src/ostree/ot-builtin-admin.c \ src/ostree/ot-remote-builtin-show-url.c \ src/ostree/ot-remote-builtin-refs.c \ src/ostree/ot-remote-builtin-summary.c $(NULL) \ - $(am__append_49) $(am__append_50) + $(am__append_50) $(am__append_51) ostree_bin_shared_cflags = $(AM_CFLAGS) -I$(srcdir)/src/libotutil -I$(srcdir)/src/libostree \ -I$(builddir)/src/libostree -I$(srcdir)/src/ostree -I$(srcdir)/libglnx $(OT_INTERNAL_GIO_UNIX_CFLAGS) \ -DPKGLIBEXECDIR=\"$(pkglibexecdir)\" @@ -2458,11 +2469,11 @@ ostree_bin_shared_cflags = $(AM_CFLAGS) -I$(srcdir)/src/libotutil -I$(srcdir)/sr ostree_bin_shared_ldadd = $(AM_LDFLAGS) libglnx.la libotutil.la libostree-1.la \ $(OT_INTERNAL_GIO_UNIX_LIBS) -ostree_CFLAGS = $(ostree_bin_shared_cflags) $(am__append_52) \ - $(am__append_54) -ostree_LDADD = $(ostree_bin_shared_ldadd) libbsdiff.la \ - libostree-kernel-args.la $(LIBSYSTEMD_LIBS) $(am__append_53) \ +ostree_CFLAGS = $(ostree_bin_shared_cflags) $(am__append_53) \ $(am__append_55) +ostree_LDADD = $(ostree_bin_shared_ldadd) libbsdiff.la \ + libostree-kernel-args.la $(LIBSYSTEMD_LIBS) $(am__append_54) \ + $(am__append_56) @USE_LIBSOUP_TRUE@ostree_trivial_httpd_SOURCES = src/ostree/ostree-trivial-httpd.c @USE_LIBSOUP_TRUE@ostree_trivial_httpd_CFLAGS = $(ostree_bin_shared_cflags) $(OT_INTERNAL_SOUP_CFLAGS) @USE_LIBSOUP_TRUE@ostree_trivial_httpd_LDADD = $(ostree_bin_shared_ldadd) $(OT_INTERNAL_SOUP_LIBS) @@ -2471,7 +2482,7 @@ ostree_prepare_root_SOURCES = \ src/switchroot/ostree-prepare-root.c \ $(NULL) -ostree_prepare_root_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_59) +ostree_prepare_root_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_60) # We're using our internal generator @BUILDOPT_BUILTIN_GRUB2_MKCONFIG_TRUE@ostree_boot_SCRIPTS = src/boot/grub2/ostree-grub-generator @@ -2493,7 +2504,7 @@ ostree_remount_SOURCES = \ $(NULL) ostree_remount_CPPFLAGS = $(AM_CPPFLAGS) -Isrc/switchroot \ - $(am__append_60) + $(am__append_61) @BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@ostree_system_generator_SOURCES = src/switchroot/ostree-mount-util.h \ @BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@ src/switchroot/ostree-system-generator.c @@ -2501,11 +2512,14 @@ ostree_remount_CPPFLAGS = $(AM_CPPFLAGS) -Isrc/switchroot \ @BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@ostree_system_generator_CFLAGS = $(AM_CFLAGS) $(OT_INTERNAL_GIO_UNIX_CFLAGS) @BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@ostree_system_generator_LDADD = $(AM_LDFLAGS) libglnx.la libostree-1.la $(OT_INTERNAL_GIO_UNIX_LIBS) @BUILDOPT_FUSE_TRUE@rofiles_fuse_SOURCES = src/rofiles-fuse/main.c -@BUILDOPT_FUSE_TRUE@rofiles_fuse_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 $(BUILDOPT_FUSE_CFLAGS) $(OT_INTERNAL_GIO_UNIX_CFLAGS) -I$(srcdir)/libglnx $(NULL) -@BUILDOPT_FUSE_TRUE@rofiles_fuse_LDADD = libglnx.la $(BUILDOPT_FUSE_LIBS) $(OT_INTERNAL_GIO_UNIX_LIBS) +@BUILDOPT_FUSE_TRUE@rofiles_fuse_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 $(BUILDOPT_FUSE_CFLAGS) \ +@BUILDOPT_FUSE_TRUE@ $(OT_INTERNAL_GIO_UNIX_CFLAGS) -I $(srcdir)/src/libostree -I $(builddir)/src/libostree \ +@BUILDOPT_FUSE_TRUE@ -I$(srcdir)/libglnx + +@BUILDOPT_FUSE_TRUE@rofiles_fuse_LDADD = libglnx.la $(BUILDOPT_FUSE_LIBS) $(OT_INTERNAL_GIO_UNIX_LIBS) libostree-1.la uninstalled_test_data = tests/ostree-symlink-stamp \ tests/ostree-prepare-root-symlink-stamp \ - tests/ostree-remount-symlink-stamp $(am__append_69) + tests/ostree-remount-symlink-stamp $(am__append_70) dist_uninstalled_test_scripts = tests/test-symbols.sh tests/coccinelle.sh # This logic implements ENABLE_INSTALLED_TESTS_EXCLUSIVE; see below. @@ -2513,9 +2527,9 @@ dist_uninstalled_test_scripts = tests/test-symbols.sh tests/coccinelle.sh # tests *only* run installed, to avoid having to run them twice in CI. # This overrides the glib-tap.mk emphasis on doing both, if we'd # used e.g. `dist_test_scripts`. -dist_test_scripts = $(NULL) $(am__append_79) -test_programs = $(NULL) $(am__append_76) $(am__append_77) \ - $(am__append_80) +dist_test_scripts = $(NULL) $(am__append_80) +test_programs = $(NULL) $(am__append_77) $(am__append_78) \ + $(am__append_81) _installed_or_uninstalled_test_scripts = tests/test-basic.sh \ tests/test-basic-user.sh tests/test-basic-user-only.sh \ tests/test-basic-root.sh tests/test-pull-subpath.sh \ @@ -2555,8 +2569,8 @@ _installed_or_uninstalled_test_scripts = tests/test-basic.sh \ tests/test-demo-buildsystem.sh tests/test-switchroot.sh \ tests/test-pull-contenturl.sh tests/test-pull-mirrorlist.sh \ tests/test-summary-update.sh tests/test-summary-view.sh \ - $(NULL) $(am__append_65) $(am__append_68) $(am__append_71) \ - $(am__append_72) + tests/test-no-initramfs.sh $(NULL) $(am__append_66) \ + $(am__append_69) $(am__append_72) $(am__append_73) experimental_test_scripts = \ tests/test-create-usb.sh \ tests/test-find-remotes.sh \ @@ -2570,7 +2584,10 @@ experimental_test_scripts = \ tests/test-pull-collections.sh \ $(NULL) -test_extra_programs = $(NULL) $(am__append_66) +test_extra_programs = tests/get-byte-order $(NULL) $(am__append_67) +tests_get_byte_order_SOURCES = tests/get-byte-order.c +tests_get_byte_order_CFLAGS = $(AM_CFLAGS) $(GLIB_CFLAGS) +tests_get_byte_order_LDADD = $(GLIB_LIBS) tests_repo_finder_mount_SOURCES = tests/repo-finder-mount.c tests_repo_finder_mount_CFLAGS = $(common_tests_cflags) tests_repo_finder_mount_LDADD = $(common_tests_ldadd) libostreetest.la @@ -2586,6 +2603,7 @@ dist_installed_test_data = tests/archive-test.sh \ tests/pre-endian-deltas-repo-little.tar.xz \ tests/fah-deltadata-old.tar.xz \ tests/fah-deltadata-new.tar.xz \ + tests/ostree-path-traverse.tar.gz \ tests/libtest-core.sh \ $(NULL) @@ -2628,7 +2646,7 @@ libreaddir_rand_la_LIBADD = \ $(NULL) libreaddir_rand_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version \ - $(am__append_75) + $(am__append_76) _installed_or_uninstalled_test_programs = tests/test-varint \ tests/test-ot-unix-utils tests/test-bsdiff \ tests/test-mutable-tree tests/test-keyfile-utils \ @@ -2636,7 +2654,7 @@ _installed_or_uninstalled_test_programs = tests/test-varint \ tests/test-gpg-verify-result tests/test-checksum \ tests/test-lzma tests/test-rollsum tests/test-basic-c \ tests/test-sysroot-c tests/test-pull-c tests/test-repo \ - $(am__append_78) + $(am__append_79) common_tests_cflags = $(ostree_bin_shared_cflags) $(OT_INTERNAL_GIO_UNIX_CFLAGS) -I$(srcdir)/libglnx common_tests_ldadd = $(ostree_bin_shared_ldadd) $(OT_INTERNAL_GIO_UNIX_LIBS) libostreetest_la_SOURCES = tests/libostreetest.c tests/test-mock-gio.c tests/test-mock-gio.h @@ -2739,8 +2757,8 @@ tests_test_gpg_verify_result_LDADD = $(TESTS_LDADD) $(OT_INTERNAL_GPGME_LIBS) @ENABLE_MAN_TRUE@ ostree-pull.1 ostree-refs.1 ostree-remote.1 \ @ENABLE_MAN_TRUE@ ostree-reset.1 ostree-rev-parse.1 \ @ENABLE_MAN_TRUE@ ostree-show.1 ostree-summary.1 \ -@ENABLE_MAN_TRUE@ ostree-static-delta.1 $(am__append_85) \ -@ENABLE_MAN_TRUE@ $(am__append_87) +@ENABLE_MAN_TRUE@ ostree-static-delta.1 $(am__append_86) \ +@ENABLE_MAN_TRUE@ $(am__append_88) @ENABLE_MAN_TRUE@man5_files = ostree.repo.5 ostree.repo-config.5 @ENABLE_MAN_TRUE@man1_MANS = $(addprefix man/,$(man1_files)) @ENABLE_MAN_TRUE@man5_MANS = $(addprefix man/,$(man5_files)) @@ -3874,6 +3892,12 @@ libglnx/tests/test_libglnx_xattrs-test-libglnx-xattrs.$(OBJEXT): \ test-libglnx-xattrs$(EXEEXT): $(test_libglnx_xattrs_OBJECTS) $(test_libglnx_xattrs_DEPENDENCIES) $(EXTRA_test_libglnx_xattrs_DEPENDENCIES) @rm -f test-libglnx-xattrs$(EXEEXT) $(AM_V_CCLD)$(test_libglnx_xattrs_LINK) $(test_libglnx_xattrs_OBJECTS) $(test_libglnx_xattrs_LDADD) $(LIBS) +tests/tests_get_byte_order-get-byte-order.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +tests/get-byte-order$(EXEEXT): $(tests_get_byte_order_OBJECTS) $(tests_get_byte_order_DEPENDENCIES) $(EXTRA_tests_get_byte_order_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/get-byte-order$(EXEEXT) + $(AM_V_CCLD)$(tests_get_byte_order_LINK) $(tests_get_byte_order_OBJECTS) $(tests_get_byte_order_LDADD) $(LIBS) tests/tests_repo_finder_mount-repo-finder-mount.$(OBJEXT): \ tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) @@ -4429,6 +4453,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/libostreetest_la-libostreetest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/libostreetest_la-test-mock-gio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/libreaddir_rand_la-readdir-rand.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/tests_get_byte_order-get-byte-order.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/tests_repo_finder_mount-repo-finder-mount.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/tests_test_basic_c-test-basic-c.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/tests_test_bloom-test-bloom.Po@am__quote@ @@ -6037,6 +6062,20 @@ libglnx/tests/test_libglnx_xattrs-test-libglnx-xattrs.obj: libglnx/tests/test-li @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libglnx_xattrs_CFLAGS) $(CFLAGS) -c -o libglnx/tests/test_libglnx_xattrs-test-libglnx-xattrs.obj `if test -f 'libglnx/tests/test-libglnx-xattrs.c'; then $(CYGPATH_W) 'libglnx/tests/test-libglnx-xattrs.c'; else $(CYGPATH_W) '$(srcdir)/libglnx/tests/test-libglnx-xattrs.c'; fi` +tests/tests_get_byte_order-get-byte-order.o: tests/get-byte-order.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tests_get_byte_order_CFLAGS) $(CFLAGS) -MT tests/tests_get_byte_order-get-byte-order.o -MD -MP -MF tests/$(DEPDIR)/tests_get_byte_order-get-byte-order.Tpo -c -o tests/tests_get_byte_order-get-byte-order.o `test -f 'tests/get-byte-order.c' || echo '$(srcdir)/'`tests/get-byte-order.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/tests_get_byte_order-get-byte-order.Tpo tests/$(DEPDIR)/tests_get_byte_order-get-byte-order.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/get-byte-order.c' object='tests/tests_get_byte_order-get-byte-order.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tests_get_byte_order_CFLAGS) $(CFLAGS) -c -o tests/tests_get_byte_order-get-byte-order.o `test -f 'tests/get-byte-order.c' || echo '$(srcdir)/'`tests/get-byte-order.c + +tests/tests_get_byte_order-get-byte-order.obj: tests/get-byte-order.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tests_get_byte_order_CFLAGS) $(CFLAGS) -MT tests/tests_get_byte_order-get-byte-order.obj -MD -MP -MF tests/$(DEPDIR)/tests_get_byte_order-get-byte-order.Tpo -c -o tests/tests_get_byte_order-get-byte-order.obj `if test -f 'tests/get-byte-order.c'; then $(CYGPATH_W) 'tests/get-byte-order.c'; else $(CYGPATH_W) '$(srcdir)/tests/get-byte-order.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/tests_get_byte_order-get-byte-order.Tpo tests/$(DEPDIR)/tests_get_byte_order-get-byte-order.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/get-byte-order.c' object='tests/tests_get_byte_order-get-byte-order.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tests_get_byte_order_CFLAGS) $(CFLAGS) -c -o tests/tests_get_byte_order-get-byte-order.obj `if test -f 'tests/get-byte-order.c'; then $(CYGPATH_W) 'tests/get-byte-order.c'; else $(CYGPATH_W) '$(srcdir)/tests/get-byte-order.c'; fi` + tests/tests_repo_finder_mount-repo-finder-mount.o: tests/repo-finder-mount.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tests_repo_finder_mount_CFLAGS) $(CFLAGS) -MT tests/tests_repo_finder_mount-repo-finder-mount.o -MD -MP -MF tests/$(DEPDIR)/tests_repo_finder_mount-repo-finder-mount.Tpo -c -o tests/tests_repo_finder_mount-repo-finder-mount.o `test -f 'tests/repo-finder-mount.c' || echo '$(srcdir)/'`tests/repo-finder-mount.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/tests_repo_finder_mount-repo-finder-mount.Tpo tests/$(DEPDIR)/tests_repo_finder_mount-repo-finder-mount.Po @@ -7727,6 +7766,13 @@ tests/test-summary-view.sh.log: tests/test-summary-view.sh --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test-no-initramfs.sh.log: tests/test-no-initramfs.sh + @p='tests/test-no-initramfs.sh'; \ + b='tests/test-no-initramfs.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) tests/test-create-usb.sh.log: tests/test-create-usb.sh @p='tests/test-create-usb.sh'; \ b='tests/test-create-usb.sh'; \ @@ -8443,6 +8489,12 @@ tests/%-symlink-stamp: % Makefile @ENABLE_INSTALLED_TESTS_EXCLUSIVE_TRUE@check-local: @ENABLE_INSTALLED_TESTS_EXCLUSIVE_TRUE@ echo "NOTE: Exclusive installed tests are enabled; to run them, make install, then: gnome-desktop-testing-runner -p 0 libostree/" +@USE_LIBSOUP_FALSE@no-soup-for-you-warning: +@USE_LIBSOUP_FALSE@ @echo "WARNING: $(PACKAGE) was built without libsoup, which is currently" 1>&2 +@USE_LIBSOUP_FALSE@ @echo "WARNING: required for many unit tests." 1>&2 +@USE_LIBSOUP_FALSE@ sleep 10 +@USE_LIBSOUP_FALSE@check: no-soup-for-you-warning + # Unfortunately the glib test data APIs don't actually handle # non-recursive Automake, so we change our code to canonically look # for tests/ which is just a symlink when installed. diff --git a/apidoc/Makefile.in b/apidoc/Makefile.in index a2c0886e..10322c52 100644 --- a/apidoc/Makefile.in +++ b/apidoc/Makefile.in @@ -52,6 +52,24 @@ # Boston, MA 02111-1307, USA. # -*- mode: makefile -*- +# +# gtk-doc.make - make rules for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2004-2007 Damon Chaplin +# 2007-2017 Stefan Sauer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . #################################### # Everything below here is generic # @@ -830,6 +848,9 @@ sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HF sgml.stamp: sgml-build.stamp @true +$(DOC_MAIN_SGML_FILE): sgml-build.stamp + @true + xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ diff --git a/apidoc/html/index.html b/apidoc/html/index.html index 9bb5be8f..17d56a36 100644 --- a/apidoc/html/index.html +++ b/apidoc/html/index.html @@ -6,7 +6,7 @@ - + @@ -14,7 +14,7 @@
-

for OSTree 2017.15

+

for OSTree 2018.1


@@ -68,6 +68,6 @@ +
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-Core-repository-independent-functions.html b/apidoc/html/ostree-Core-repository-independent-functions.html index d00cd708..b2775515 100644 --- a/apidoc/html/ostree-Core-repository-independent-functions.html +++ b/apidoc/html/ostree-Core-repository-independent-functions.html @@ -8,7 +8,7 @@ - + @@ -2561,6 +2561,6 @@ Unix epoch in UTC, big-endian) when the commit was committed

+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-GPG-signature-verification-results.html b/apidoc/html/ostree-GPG-signature-verification-results.html index 90912533..2065a167 100644 --- a/apidoc/html/ostree-GPG-signature-verification-results.html +++ b/apidoc/html/ostree-GPG-signature-verification-results.html @@ -8,7 +8,7 @@ - + @@ -560,6 +560,8 @@ These may be returned by any API which creates or verifies signatures.


OstreeGpgVerifyResult

+
typedef struct OstreeGpgVerifyResult OstreeGpgVerifyResult;
+

Private instance structure.


@@ -705,6 +707,6 @@ for future variations.

+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-In-memory-modifiable-filesystem-tree.html b/apidoc/html/ostree-In-memory-modifiable-filesystem-tree.html index e41ec665..aab735f0 100644 --- a/apidoc/html/ostree-In-memory-modifiable-filesystem-tree.html +++ b/apidoc/html/ostree-In-memory-modifiable-filesystem-tree.html @@ -8,7 +8,7 @@ - + @@ -358,11 +358,13 @@ ostree_mutable_tree_get_files (

Types and Values

OstreeMutableTree

+
typedef struct OstreeMutableTree OstreeMutableTree;
+

Private instance structure.

+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-OstreeRepo.html b/apidoc/html/ostree-OstreeRepo.html index 064077d9..adc085d5 100644 --- a/apidoc/html/ostree-OstreeRepo.html +++ b/apidoc/html/ostree-OstreeRepo.html @@ -8,7 +8,7 @@ - + @@ -7549,6 +7549,8 @@ order.

Types and Values

OstreeRepo

+
typedef struct OstreeRepo OstreeRepo;
+

Private instance structure.


@@ -7855,6 +7857,8 @@ by

OstreeRepoCommitModifier

+
typedef struct OstreeRepoCommitModifier OstreeRepoCommitModifier;
+

A structure allowing control over commits.


@@ -8264,6 +8268,6 @@ as - List of pack file checksums in which this object appears

+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-Progress-notification-system-for-asynchronous-operations.html b/apidoc/html/ostree-Progress-notification-system-for-asynchronous-operations.html index 25b03a92..95907dfe 100644 --- a/apidoc/html/ostree-Progress-notification-system-for-asynchronous-operations.html +++ b/apidoc/html/ostree-Progress-notification-system-for-asynchronous-operations.html @@ -8,7 +8,7 @@ - + @@ -540,10 +540,12 @@ events will be queued.

Types and Values

OstreeAsyncProgress

+
typedef struct OstreeAsyncProgress   OstreeAsyncProgress;
+
+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-Root-partition-mount-point.html b/apidoc/html/ostree-Root-partition-mount-point.html index 44e362b4..37711249 100644 --- a/apidoc/html/ostree-Root-partition-mount-point.html +++ b/apidoc/html/ostree-Root-partition-mount-point.html @@ -8,7 +8,7 @@ - + @@ -1686,6 +1686,8 @@ later, instead.

Types and Values

OstreeSysroot

+
typedef struct OstreeSysroot OstreeSysroot;
+

@@ -1736,6 +1738,6 @@ later, instead.

+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-SELinux-policy-management.html b/apidoc/html/ostree-SELinux-policy-management.html index 730362db..91798adc 100644 --- a/apidoc/html/ostree-SELinux-policy-management.html +++ b/apidoc/html/ostree-SELinux-policy-management.html @@ -8,7 +8,7 @@ - + @@ -447,6 +447,8 @@ ostree_sepolicy_fscreatecon_cleanup (

Types and Values

OstreeSePolicy

+
typedef struct OstreeSePolicy OstreeSePolicy;
+

@@ -482,6 +484,6 @@ ostree_sepolicy_fscreatecon_cleanup ( -
Generated by GTK-Doc V1.26
+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-Simple-upgrade-class.html b/apidoc/html/ostree-Simple-upgrade-class.html index e810bda4..9202a842 100644 --- a/apidoc/html/ostree-Simple-upgrade-class.html +++ b/apidoc/html/ostree-Simple-upgrade-class.html @@ -8,7 +8,7 @@ - + @@ -642,6 +642,8 @@ with /etc, and update the bootloader configuration.

Types and Values

OstreeSysrootUpgrader

+
typedef struct OstreeSysrootUpgrader OstreeSysrootUpgrader;
+

@@ -708,6 +710,6 @@ with /etc, and update the bootloader configuration.

+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-ostree-bootconfig-parser.html b/apidoc/html/ostree-ostree-bootconfig-parser.html index 2e3b582f..272d09e1 100644 --- a/apidoc/html/ostree-ostree-bootconfig-parser.html +++ b/apidoc/html/ostree-ostree-bootconfig-parser.html @@ -8,7 +8,7 @@ - + @@ -256,6 +256,6 @@ ostree_bootconfig_parser_get ( -
Generated by GTK-Doc V1.26 +
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-ostree-chain-input-stream.html b/apidoc/html/ostree-ostree-chain-input-stream.html index 326f45a7..dc05ff12 100644 --- a/apidoc/html/ostree-ostree-chain-input-stream.html +++ b/apidoc/html/ostree-ostree-chain-input-stream.html @@ -8,7 +8,7 @@ - + @@ -84,6 +84,6 @@ ostree_chain_input_stream_new (GP +
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-ostree-checksum-input-stream.html b/apidoc/html/ostree-ostree-checksum-input-stream.html index 15e8eabf..e590ef8f 100644 --- a/apidoc/html/ostree-ostree-checksum-input-stream.html +++ b/apidoc/html/ostree-ostree-checksum-input-stream.html @@ -8,7 +8,7 @@ - + @@ -85,6 +85,6 @@ ostree_checksum_input_stream_new ( +
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-ostree-deployment.html b/apidoc/html/ostree-ostree-deployment.html index 3d344a80..7f238112 100644 --- a/apidoc/html/ostree-ostree-deployment.html +++ b/apidoc/html/ostree-ostree-deployment.html @@ -8,7 +8,7 @@ - + @@ -522,6 +522,6 @@ ostree_deployment_unlocked_state_to_string +
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-ostree-diff.html b/apidoc/html/ostree-ostree-diff.html index aa4af9ec..c1d94082 100644 --- a/apidoc/html/ostree-ostree-diff.html +++ b/apidoc/html/ostree-ostree-diff.html @@ -8,7 +8,7 @@ - + @@ -363,6 +363,6 @@ ostree_diff_print (GFile * +
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/ostree-ostree-repo-file.html b/apidoc/html/ostree-ostree-repo-file.html index 0d93d1e6..3b55a54f 100644 --- a/apidoc/html/ostree-ostree-repo-file.html +++ b/apidoc/html/ostree-ostree-repo-file.html @@ -7,7 +7,7 @@ - + @@ -255,10 +255,12 @@ ostree_repo_file_tree_query_child (

Types and Values

OstreeRepoFile

+
typedef struct OstreeRepoFile OstreeRepoFile;
+
+
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/html/reference.html b/apidoc/html/reference.html index b7506742..6c2fad75 100644 --- a/apidoc/html/reference.html +++ b/apidoc/html/reference.html @@ -8,7 +8,7 @@ - + @@ -1584,6 +1584,6 @@ OSTREE_YEAR_VERSION, macro in ostree-version +
Generated by GTK-Doc V1.27 \ No newline at end of file diff --git a/apidoc/version.xml b/apidoc/version.xml index 0a246337..20e4b07d 100644 --- a/apidoc/version.xml +++ b/apidoc/version.xml @@ -1 +1 @@ -2017.15 \ No newline at end of file +2018.1 \ No newline at end of file diff --git a/bash/ostree b/bash/ostree index 0ba135e7..fe8e3d2c 100644 --- a/bash/ostree +++ b/bash/ostree @@ -783,6 +783,8 @@ _ostree_commit() { local options_with_args=" --add-detached-metadata-string --add-metadata-string + --add-metadata + --keep-metadata --bind-ref --body -m --body-file -F diff --git a/buildutil/gtk-doc.m4 b/buildutil/gtk-doc.m4 index 36755432..2d12f01f 100644 --- a/buildutil/gtk-doc.m4 +++ b/buildutil/gtk-doc.m4 @@ -1,4 +1,29 @@ -dnl -*- mode: autoconf -*- +# -*- mode: autoconf -*- +# +# gtk-doc.m4 - configure macro to check for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2007-2017 Stefan Sauer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# As a special exception, the above copyright owner gives unlimited +# permission to copy, distribute and modify the configure scripts that +# are the output of Autoconf when processing the Macro. You need not +# follow the terms of the GNU General Public License when using or +# distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. # serial 2 diff --git a/configure b/configure index fa954b05..6f9a9540 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libostree 2017.15. +# Generated by GNU Autoconf 2.69 for libostree 2018.1. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libostree' PACKAGE_TARNAME='libostree' -PACKAGE_VERSION='2017.15' -PACKAGE_STRING='libostree 2017.15' +PACKAGE_VERSION='2018.1' +PACKAGE_STRING='libostree 2018.1' PACKAGE_BUGREPORT='walters@verbum.org' PACKAGE_URL='' @@ -1541,7 +1541,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libostree 2017.15 to adapt to many kinds of systems. +\`configure' configures libostree 2018.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1611,7 +1611,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libostree 2017.15:";; + short | recursive ) echo "Configuration of libostree 2018.1:";; esac cat <<\_ACEOF @@ -1853,7 +1853,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libostree configure 2017.15 +libostree configure 2018.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2325,7 +2325,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libostree $as_me 2017.15, which was +It was created by libostree $as_me 2018.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3193,7 +3193,7 @@ fi # Define the identity of the package. PACKAGE='libostree' - VERSION='2017.15' + VERSION='2018.1' # Some tools Automake needs. @@ -5925,11 +5925,11 @@ done test -n "$YACC" || YACC="yacc" -YEAR_VERSION=2017 +YEAR_VERSION=2018 -RELEASE_VERSION=15 +RELEASE_VERSION=1 -PACKAGE_VERSION=2017.15 +PACKAGE_VERSION=2018.1 if echo "$CFLAGS" | grep -q -E -e '-Werror($| )'; then : @@ -5951,7 +5951,7 @@ else -Werror=switch \ -Werror=overflow \ -Werror=int-conversion \ - -Werror=parenthesis \ + -Werror=parentheses \ -Werror=undef \ -Werror=incompatible-pointer-types \ -Werror=misleading-indentation \ @@ -15210,7 +15210,8 @@ fi if test x$with_curl = xyes && test x$with_soup = xno; then : - as_fn_error $? "Curl enabled, but libsoup is not; libsoup is needed for tests" "$LINENO" 5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Curl enabled, but libsoup is not; libsoup is needed for tests (make check, etc.)" >&5 +$as_echo "$as_me: WARNING: Curl enabled, but libsoup is not; libsoup is needed for tests (make check, etc.)" >&2;} fi if test x$with_curl != xno || test x$with_soup != xno; then @@ -18380,7 +18381,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libostree $as_me 2017.15, which was +This file was extended by libostree $as_me 2018.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18446,7 +18447,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libostree config.status 2017.15 +libostree config.status 2018.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 478d7349..a4e1e74f 100644 --- a/configure.ac +++ b/configure.ac @@ -3,8 +3,8 @@ dnl If doing a final release, remember to follow the instructions to dnl update libostree-released.sym from libostree-devel.sym, and update the checksum dnl in test-symbols.sh, and also set is_release_build=yes below. Then make dnl another post-release commit to bump the version, and set is_release_build=no. -m4_define([year_version], [2017]) -m4_define([release_version], [15]) +m4_define([year_version], [2018]) +m4_define([release_version], [1]) m4_define([package_version], [year_version.release_version]) AC_INIT([libostree], [package_version], [walters@verbum.org]) is_release_build=yes @@ -43,7 +43,7 @@ CC_CHECK_FLAGS_APPEND([WARN_CFLAGS], [CFLAGS], [\ -Werror=switch \ -Werror=overflow \ -Werror=int-conversion \ - -Werror=parenthesis \ + -Werror=parentheses \ -Werror=undef \ -Werror=incompatible-pointer-types \ -Werror=misleading-indentation \ @@ -197,7 +197,7 @@ AM_COND_IF(BUILDOPT_TRIVIAL_HTTPD, ) AS_IF([test x$with_curl = xyes && test x$with_soup = xno], [ - AC_MSG_ERROR([Curl enabled, but libsoup is not; libsoup is needed for tests]) + AC_MSG_WARN([Curl enabled, but libsoup is not; libsoup is needed for tests (make check, etc.)]) ]) AM_CONDITIONAL(USE_CURL_OR_SOUP, test x$with_curl != xno || test x$with_soup != xno) AS_IF([test x$with_curl != xno || test x$with_soup != xno], diff --git a/gtk-doc.make b/gtk-doc.make index e5777b6e..f87eaab9 100644 --- a/gtk-doc.make +++ b/gtk-doc.make @@ -1,4 +1,22 @@ # -*- mode: makefile -*- +# +# gtk-doc.make - make rules for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2004-2007 Damon Chaplin +# 2007-2017 Stefan Sauer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . #################################### # Everything below here is generic # @@ -152,6 +170,9 @@ sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HF sgml.stamp: sgml-build.stamp @true +$(DOC_MAIN_SGML_FILE): sgml-build.stamp + @true + xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ diff --git a/src/boot/grub2/grub2-15_ostree b/src/boot/grub2/grub2-15_ostree index dfff6e89..0b9bf930 100644 --- a/src/boot/grub2/grub2-15_ostree +++ b/src/boot/grub2/grub2-15_ostree @@ -17,10 +17,14 @@ # Free Software Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. -# Gracefully exit if ostree is not installed +# Gracefully exit if ostree is not installed, or there's +# no system repository initialized. if ! which ostree >/dev/null 2>/dev/null; then exit 0 fi +if ! test -d /ostree/repo; then + exit 0 +fi # Make sure we're in the right environment if ! test -n "${GRUB_DEVICE}"; then diff --git a/src/boot/grub2/ostree-grub-generator b/src/boot/grub2/ostree-grub-generator index 82e66bd7..97ef4d69 100644 --- a/src/boot/grub2/ostree-grub-generator +++ b/src/boot/grub2/ostree-grub-generator @@ -1,7 +1,6 @@ #!/bin/sh -# To use a custrom script for generating grub.cfg, set the --with-grub2-mkconfig=no -# configure switch when configuring and building OSTree. +# The builtin grub.cfg generator. # # This script is called by ostree/src/libostree/ostree-bootloader-grub2.c whenever # boot loader configuration file needs to be updated. It can be used as a template @@ -28,7 +27,7 @@ entries_path=$(dirname $new_grub2_cfg)/entries read_config() { - config_file=${entries_path}/${1} + config_file=${1} title="" initrd="" options="" @@ -67,11 +66,13 @@ populate_menu() else boot_prefix="${OSTREE_BOOT_PARTITION}" fi - for config in $(ls ${entries_path}); do + for config in $(ls $entries_path/*.conf); do read_config ${config} menu="${menu}menuentry '${title}' {\n" menu="${menu}\t linux ${boot_prefix}${linux} ${options}\n" - menu="${menu}\t initrd ${boot_prefix}${initrd}\n" + if [ -n "${initrd}" ] ; then + menu="${menu}\t initrd ${boot_prefix}${initrd}\n" + fi menu="${menu}}\n\n" done # The printf command seems to be more reliable across shells for special character (\n, \t) evaluation diff --git a/src/libostree/libostree-devel.sym b/src/libostree/libostree-devel.sym index 5ab4b99c..cdd6b7ca 100644 --- a/src/libostree/libostree-devel.sym +++ b/src/libostree/libostree-devel.sym @@ -18,8 +18,8 @@ ***/ /* Add new symbols here. Release commits should copy this section into -released.sym. */ -LIBOSTREE_2017.16 { -} LIBOSTREE_2017.15; +LIBOSTREE_2018.2 { +} LIBOSTREE_2018.1; /* Stub section for the stable release *after* this development one; don't * edit this other than to update the last number. This is just a copy/paste diff --git a/src/libostree/libostree-released.sym b/src/libostree/libostree-released.sym index b7d57853..51cd31a1 100644 --- a/src/libostree/libostree-released.sym +++ b/src/libostree/libostree-released.sym @@ -451,6 +451,9 @@ LIBOSTREE_2017.15 { ostree_break_hardlink; } LIBOSTREE_2017.14; +LIBOSTREE_2018.1 { +} LIBOSTREE_2017.15; + /* NOTE: Only add more content here in release commits! See the * comments at the top of this file. */ diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index 08809e4a..162677c3 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -164,6 +164,17 @@ _ostree_loose_path (char *buf, OstreeObjectType objtype, OstreeRepoMode repo_mode); +gboolean _ostree_validate_structureof_metadata (OstreeObjectType objtype, + GVariant *commit, + GError **error); + +gboolean +_ostree_verify_metadata_object (OstreeObjectType objtype, + const char *expected_checksum, + GVariant *metadata, + GError **error); + + #define _OSTREE_METADATA_GPGSIGS_NAME "ostree.gpgsigs" #define _OSTREE_METADATA_GPGSIGS_TYPE G_VARIANT_TYPE ("aay") diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 679c9529..2256a2c0 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -2071,6 +2071,74 @@ validate_variant (GVariant *variant, return TRUE; } +/* TODO: make this public later; just wraps the previously public + * commit/dirtree/dirmeta verifiers. + */ +gboolean +_ostree_validate_structureof_metadata (OstreeObjectType objtype, + GVariant *metadata, + GError **error) +{ + g_assert (OSTREE_OBJECT_TYPE_IS_META (objtype)); + + switch (objtype) + { + case OSTREE_OBJECT_TYPE_COMMIT: + if (!ostree_validate_structureof_commit (metadata, error)) + return FALSE; + break; + case OSTREE_OBJECT_TYPE_DIR_TREE: + if (!ostree_validate_structureof_dirtree (metadata, error)) + return FALSE; + break; + case OSTREE_OBJECT_TYPE_DIR_META: + if (!ostree_validate_structureof_dirmeta (metadata, error)) + return FALSE; + break; + case OSTREE_OBJECT_TYPE_TOMBSTONE_COMMIT: + case OSTREE_OBJECT_TYPE_COMMIT_META: + /* TODO */ + break; + case OSTREE_OBJECT_TYPE_FILE: + g_assert_not_reached (); + break; + } + + return TRUE; +} + +/* Used by fsck as well as pull. Verify the checksum of a metadata object + * and its "structure" or the additional schema we impose on GVariants such + * as ensuring the "ay" checksum entries are of length 32. Another important + * one is checking for path traversal in dirtree objects. + */ +gboolean +_ostree_verify_metadata_object (OstreeObjectType objtype, + const char *expected_checksum, + GVariant *metadata, + GError **error) +{ + g_assert (expected_checksum); + + g_auto(OtChecksum) hasher = { 0, }; + ot_checksum_init (&hasher); + ot_checksum_update (&hasher, g_variant_get_data (metadata), g_variant_get_size (metadata)); + + char actual_checksum[OSTREE_SHA256_STRING_LEN+1]; + ot_checksum_get_hexdigest (&hasher, actual_checksum, sizeof (actual_checksum)); + if (!_ostree_compare_object_checksum (objtype, expected_checksum, actual_checksum, error)) + return FALSE; + + /* Add the checksum + objtype prefix here */ + { const char *error_prefix = glnx_strjoina (expected_checksum, ".", ostree_object_type_to_string (objtype)); + GLNX_AUTO_PREFIX_ERROR(error_prefix, error); + if (!_ostree_validate_structureof_metadata (objtype, metadata, error)) + return FALSE; + } + + return TRUE; +} + /** * ostree_validate_structureof_commit: * @commit: A commit object, %OSTREE_OBJECT_TYPE_COMMIT diff --git a/src/libostree/ostree-fetcher-curl.c b/src/libostree/ostree-fetcher-curl.c index 272d609a..2d01257d 100644 --- a/src/libostree/ostree-fetcher-curl.c +++ b/src/libostree/ostree-fetcher-curl.c @@ -714,7 +714,7 @@ initiate_next_curl_request (FetcherRequest *req, curl_easy_setopt (req->easy, CURLOPT_URL, uri); } - curl_easy_setopt (req->easy, CURLOPT_USERAGENT, "ostree "); + curl_easy_setopt (req->easy, CURLOPT_USERAGENT, OSTREE_FETCHER_USERAGENT_STRING); if (self->extra_headers) curl_easy_setopt (req->easy, CURLOPT_HTTPHEADER, self->extra_headers); diff --git a/src/libostree/ostree-fetcher-soup.c b/src/libostree/ostree-fetcher-soup.c index e023d34e..cab8dff6 100644 --- a/src/libostree/ostree-fetcher-soup.c +++ b/src/libostree/ostree-fetcher-soup.c @@ -479,7 +479,7 @@ ostree_fetcher_session_thread (gpointer data) g_main_context_push_thread_default (mainctx); /* We retain ownership of the SoupSession reference. */ - closure->session = soup_session_async_new_with_options (SOUP_SESSION_USER_AGENT, "ostree ", + closure->session = soup_session_async_new_with_options (SOUP_SESSION_USER_AGENT, OSTREE_FETCHER_USERAGENT_STRING, SOUP_SESSION_SSL_USE_SYSTEM_CA_FILE, TRUE, SOUP_SESSION_USE_THREAD_CONTEXT, TRUE, SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_REQUESTER, diff --git a/src/libostree/ostree-fetcher-util.h b/src/libostree/ostree-fetcher-util.h index 29293816..48528e0f 100644 --- a/src/libostree/ostree-fetcher-util.h +++ b/src/libostree/ostree-fetcher-util.h @@ -25,6 +25,12 @@ G_BEGIN_DECLS +/* We used to only send "ostree/" but now include the version + * https://github.com/ostreedev/ostree/issues/1405 + * This came up in allowing Fedora infrastructure to work around a libcurl bug with HTTP2. + */ +#define OSTREE_FETCHER_USERAGENT_STRING (PACKAGE_NAME "/" PACKAGE_VERSION) + static inline gboolean _ostree_fetcher_tmpf_from_flags (OstreeFetcherRequestFlags flags, int dfd, diff --git a/src/libostree/ostree-repo-checkout.c b/src/libostree/ostree-repo-checkout.c index 962b503d..6334ae50 100644 --- a/src/libostree/ostree-repo-checkout.c +++ b/src/libostree/ostree-repo-checkout.c @@ -535,6 +535,10 @@ checkout_one_file_at (OstreeRepo *repo, GCancellable *cancellable, GError **error) { + /* Validate this up front to prevent path traversal attacks */ + if (!ot_util_filename_validate (destination_name, error)) + return FALSE; + gboolean need_copy = TRUE; gboolean is_bare_user_symlink = FALSE; char loose_path_buf[_OSTREE_LOOSE_PATH_MAX]; @@ -897,6 +901,15 @@ checkout_tree_at_recurse (OstreeRepo *self, while (g_variant_iter_loop (&viter, "(&s@ay@ay)", &dname, &subdirtree_csum_v, &subdirmeta_csum_v)) { + /* Validate this up front to prevent path traversal attacks. Note that + * we don't validate at the top of this function like we do for + * checkout_one_file_at() becuase I believe in some cases this function + * can be called *initially* with user-specified paths for the root + * directory. + */ + if (!ot_util_filename_validate (dname, error)) + return FALSE; + const size_t origlen = selabel_path_buf ? selabel_path_buf->len : 0; if (selabel_path_buf) { diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 4392f700..44434c66 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2027,6 +2027,13 @@ ostree_repo_write_metadata (OstreeRepo *self, if (!metadata_size_valid (objtype, g_variant_get_size (normalized), error)) return FALSE; + /* For untrusted objects, verify their structure here */ + if (expected_checksum) + { + if (!_ostree_validate_structureof_metadata (objtype, object, error)) + return FALSE; + } + g_autoptr(GBytes) vdata = g_variant_get_data_as_bytes (normalized); if (!write_metadata_object (self, objtype, expected_checksum, vdata, out_csum, cancellable, error)) @@ -4101,6 +4108,7 @@ _ostree_repo_import_object (OstreeRepo *self, &variant, error)) return FALSE; + /* Note this one also now verifies structure in the !trusted case */ g_autofree guchar *real_csum = NULL; if (!ostree_repo_write_metadata (self, objtype, checksum, variant, diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 2e6e308c..ab59c33a 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -27,12 +27,12 @@ #include "libglnx.h" #include "ostree.h" #include "otutil.h" +#include "ostree-repo-pull-private.h" #ifdef HAVE_LIBCURL_OR_LIBSOUP #include "ostree-core-private.h" #include "ostree-repo-private.h" -#include "ostree-repo-pull-private.h" #include "ostree-repo-static-delta-private.h" #include "ostree-metalink.h" #include "ostree-fetcher-util.h" @@ -736,6 +736,12 @@ scan_dirtree_object (OtPullData *pull_data, g_variant_get_child (files_variant, i, "(&s@ay)", &filename, &csum); + /* Note this is now obsoleted by the _ostree_validate_structureof_metadata() + * but I'm keeping this since: + * 1) It's cheap + * 2) We want to continue to do validation for objects written to disk + * before libostree's validation was strengthened. + */ if (!ot_util_filename_validate (filename, error)) return FALSE; @@ -810,6 +816,7 @@ scan_dirtree_object (OtPullData *pull_data, g_variant_get_child (dirs_variant, i, "(&s@ay@ay)", &dirname, &tree_csum, &meta_csum); + /* See comment above for files */ if (!ot_util_filename_validate (dirname, error)) return FALSE; @@ -1222,24 +1229,20 @@ meta_fetch_on_complete (GObject *object, FALSE, &metadata, error)) goto out; - /* For commit objects, compute the hash and check the GPG signature before - * writing to the repo, and also write the .commitpartial to say that - * we're still processing this commit. + /* Compute checksum and verify structure now. Note this is a recent change + * (Jan 2018) - we used to verify the checksum only when writing down + * below. But we want to do "structure" verification early on as well + * before the object is written even to the staging directory. + */ + if (!_ostree_verify_metadata_object (objtype, checksum, metadata, error)) + goto out; + + /* For commit objects, check the GPG signature before writing to the repo, + * and also write the .commitpartial to say that we're still processing + * this commit. */ if (objtype == OSTREE_OBJECT_TYPE_COMMIT) { - /* Verify checksum */ - OtChecksum hasher = { 0, }; - ot_checksum_init (&hasher); - { g_autoptr(GBytes) bytes = g_variant_get_data_as_bytes (metadata); - ot_checksum_update_bytes (&hasher, bytes); - } - char hexdigest[OSTREE_SHA256_STRING_LEN+1]; - ot_checksum_get_hexdigest (&hasher, hexdigest, sizeof (hexdigest)); - - if (!_ostree_compare_object_checksum (objtype, checksum, hexdigest, error)) - goto out; - /* Do GPG verification. `detached_data` may be NULL if no detached * metadata was found during pull; that's handled by * gpg_verify_unwritten_commit(). If we ever change the pull code to @@ -1256,7 +1259,13 @@ meta_fetch_on_complete (GObject *object, goto out; } - ostree_repo_write_metadata_async (pull_data->repo, objtype, checksum, metadata, + /* Note that we now (Jan 2018) pass NULL for checksum, which means "don't + * verify checksum", since we just did it above. Related to this...now + * that we're doing all the verification here, one thing we could do later + * just `glnx_link_tmpfile_at()` into the repository, like the content + * fetch path does for trusted commits. + */ + ostree_repo_write_metadata_async (pull_data->repo, objtype, NULL, metadata, pull_data->cancellable, on_metadata_written, fetch_data); pull_data->n_outstanding_metadata_write_requests++; diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 3b9fd49f..bb6238e4 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -497,8 +497,13 @@ dispatch_open_splice_and_close (OstreeRepo *repo, goto out; } - metadata = g_variant_new_from_data (ostree_metadata_variant_type (state->output_objtype), - state->payload_data + offset, length, TRUE, NULL, NULL); + /* Unfortunately we need a copy because GVariant wants pointer-alignment + * and we didn't guarantee that in static deltas. We can do so in the + * future. + */ + g_autoptr(GBytes) metadata_copy = g_bytes_new (state->payload_data + offset, length); + metadata = g_variant_new_from_bytes (ostree_metadata_variant_type (state->output_objtype), + metadata_copy, FALSE); { g_autofree guchar *actual_csum = NULL; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index ec509e9d..858a5555 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -3941,6 +3941,7 @@ ostree_repo_delete_object (OstreeRepo *self, return TRUE; } +/* Thin wrapper for _ostree_verify_metadata_object() */ static gboolean fsck_metadata_object (OstreeRepo *self, OstreeObjectType objtype, @@ -3956,39 +3957,7 @@ fsck_metadata_object (OstreeRepo *self, cancellable, error)) return FALSE; - g_auto(OtChecksum) hasher = { 0, }; - ot_checksum_init (&hasher); - ot_checksum_update (&hasher, g_variant_get_data (metadata), g_variant_get_size (metadata)); - - char actual_checksum[OSTREE_SHA256_STRING_LEN+1]; - ot_checksum_get_hexdigest (&hasher, actual_checksum, sizeof (actual_checksum)); - if (!_ostree_compare_object_checksum (objtype, sha256, actual_checksum, error)) - return FALSE; - - switch (objtype) - { - case OSTREE_OBJECT_TYPE_COMMIT: - if (!ostree_validate_structureof_commit (metadata, error)) - return FALSE; - break; - case OSTREE_OBJECT_TYPE_DIR_TREE: - if (!ostree_validate_structureof_dirtree (metadata, error)) - return FALSE; - break; - case OSTREE_OBJECT_TYPE_DIR_META: - if (!ostree_validate_structureof_dirmeta (metadata, error)) - return FALSE; - break; - case OSTREE_OBJECT_TYPE_TOMBSTONE_COMMIT: - case OSTREE_OBJECT_TYPE_COMMIT_META: - /* TODO */ - break; - case OSTREE_OBJECT_TYPE_FILE: - g_assert_not_reached (); - break; - } - - return TRUE; + return _ostree_verify_metadata_object (objtype, sha256, metadata, error); } static gboolean diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 29c90ea7..5dc5bde0 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -1700,21 +1700,29 @@ install_deployment_kernel (OstreeSysroot *sysroot, g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->kernel_namever, NULL); ostree_bootconfig_parser_set (bootconfig, "linux", boot_relpath); + val = ostree_bootconfig_parser_get (bootconfig, "options"); + g_autoptr(OstreeKernelArgs) kargs = _ostree_kernel_args_from_string (val); + if (kernel_layout->initramfs_namever) { g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->initramfs_namever, NULL); ostree_bootconfig_parser_set (bootconfig, "initrd", boot_relpath); } - - val = ostree_bootconfig_parser_get (bootconfig, "options"); + else + { + g_autofree char *prepare_root_arg = NULL; + prepare_root_arg = g_strdup_printf ("init=/ostree/boot.%d/%s/%s/%d/usr/lib/ostree/ostree-prepare-root", + new_bootversion, osname, bootcsum, + ostree_deployment_get_bootserial (deployment)); + _ostree_kernel_args_replace_take (kargs, g_steal_pointer (&prepare_root_arg)); + } /* Note this is parsed in ostree-impl-system-generator.c */ g_autofree char *ostree_kernel_arg = g_strdup_printf ("ostree=/ostree/boot.%d/%s/%s/%d", new_bootversion, osname, bootcsum, ostree_deployment_get_bootserial (deployment)); - g_autoptr(OstreeKernelArgs) kargs = _ostree_kernel_args_from_string (val); - _ostree_kernel_args_replace_take (kargs, ostree_kernel_arg); - ostree_kernel_arg = NULL; + _ostree_kernel_args_replace_take (kargs, g_steal_pointer (&ostree_kernel_arg)); + g_autofree char *options_key = _ostree_kernel_args_to_string (kargs); ostree_bootconfig_parser_set (bootconfig, "options", options_key); diff --git a/src/libostree/ostree-version.h b/src/libostree/ostree-version.h index 7b9522a2..25a511ad 100644 --- a/src/libostree/ostree-version.h +++ b/src/libostree/ostree-version.h @@ -34,7 +34,7 @@ * * Since: 2017.4 */ -#define OSTREE_YEAR_VERSION (2017) +#define OSTREE_YEAR_VERSION (2018) /** * OSTREE_RELEASE_VERSION: @@ -43,7 +43,7 @@ * * Since: 2017.4 */ -#define OSTREE_RELEASE_VERSION (15) +#define OSTREE_RELEASE_VERSION (1) /** * OSTREE_VERSION @@ -52,7 +52,7 @@ * * Since: 2017.4 */ -#define OSTREE_VERSION (2017.15) +#define OSTREE_VERSION (2018.1) /** * OSTREE_VERSION_S: @@ -62,7 +62,7 @@ * * Since: 2017.4 */ -#define OSTREE_VERSION_S "2017.15" +#define OSTREE_VERSION_S "2018.1" #define OSTREE_ENCODE_VERSION(year,release) \ ((year) << 16 | (release)) diff --git a/src/ostree/ot-admin-builtin-deploy.c b/src/ostree/ot-admin-builtin-deploy.c index 83550331..8da9dbc3 100644 --- a/src/ostree/ot-admin-builtin-deploy.c +++ b/src/ostree/ot-admin-builtin-deploy.c @@ -40,6 +40,7 @@ static char **opt_kernel_argv_append; static gboolean opt_kernel_proc_cmdline; static char *opt_osname; static char *opt_origin_path; +static gboolean opt_kernel_arg_none; /* ATTENTION: * Please remember to update the bash-completion script (bash/ostree) and @@ -56,6 +57,7 @@ static GOptionEntry options[] = { { "karg-proc-cmdline", 0, 0, G_OPTION_ARG_NONE, &opt_kernel_proc_cmdline, "Import current /proc/cmdline", NULL }, { "karg", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv, "Set kernel argument, like root=/dev/sda1; this overrides any earlier argument with the same name", "NAME=VALUE" }, { "karg-append", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv_append, "Append kernel argument; useful with e.g. console= that can be used multiple times", "NAME=VALUE" }, + { "karg-none", 0, 0, G_OPTION_ARG_NONE, &opt_kernel_arg_none, "Do not import kernel arguments", NULL }, { NULL } }; @@ -79,6 +81,12 @@ ot_admin_builtin_deploy (int argc, char **argv, OstreeCommandInvocation *invocat return FALSE; } + if (opt_kernel_proc_cmdline && opt_kernel_arg_none) + { + ot_util_usage_error (context, "Can't specify both --karg-proc-cmdline and --karg-none", error); + return FALSE; + } + const char *refspec = argv[1]; OstreeRepo *repo = ostree_sysroot_repo (sysroot); @@ -130,7 +138,7 @@ ot_admin_builtin_deploy (int argc, char **argv, OstreeCommandInvocation *invocat if (!_ostree_kernel_args_append_proc_cmdline (kargs, cancellable, error)) return FALSE; } - else if (merge_deployment) + else if (merge_deployment && !opt_kernel_arg_none) { OstreeBootconfigParser *bootconfig = ostree_deployment_get_bootconfig (merge_deployment); g_auto(GStrv) previous_args = g_strsplit (ostree_bootconfig_parser_get (bootconfig, "options"), " ", -1); diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c index 9c05428e..5e5cddd1 100644 --- a/src/ostree/ot-builtin-commit.c +++ b/src/ostree/ot-builtin-commit.c @@ -45,6 +45,7 @@ static char *opt_skiplist_file; static char **opt_metadata_strings; static char **opt_metadata_variants; static char **opt_detached_metadata_strings; +static char **opt_metadata_keep; static gboolean opt_link_checkout_speedup; static gboolean opt_skip_if_unchanged; static gboolean opt_tar_autocreate_parents; @@ -96,6 +97,7 @@ static GOptionEntry options[] = { { "tree", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_trees, "Overlay the given argument as a tree", "dir=PATH or tar=TARFILE or ref=COMMIT" }, { "add-metadata-string", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_metadata_strings, "Add a key/value pair to metadata", "KEY=VALUE" }, { "add-metadata", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_metadata_variants, "Add a key/value pair to metadata, where the KEY is a string, an VALUE is g_variant_parse() formatted", "KEY=VALUE" }, + { "keep-metadata", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_metadata_keep, "Keep metadata KEY and its associated VALUE from parent", "KEY" }, { "add-detached-metadata-string", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_detached_metadata_strings, "Add a key/value pair to detached metadata", "KEY=VALUE" }, { "owner-uid", 0, 0, G_OPTION_ARG_INT, &opt_owner_uid, "Set file ownership user id", "UID" }, { "owner-gid", 0, 0, G_OPTION_ARG_INT, &opt_owner_gid, "Set file ownership group id", "GID" }, @@ -466,7 +468,47 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio goto out; } - if (opt_metadata_strings || opt_metadata_variants) + if (!(opt_branch || opt_orphan)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "A branch must be specified with --branch, or use --orphan"); + goto out; + } + + if (opt_parent) + { + if (g_str_equal (opt_parent, "none")) + parent = NULL; + else + { + if (!ostree_validate_checksum_string (opt_parent, error)) + goto out; + parent = g_strdup (opt_parent); + } + } + else if (!opt_orphan) + { + if (!ostree_repo_resolve_rev (repo, opt_branch, TRUE, &parent, error)) + { + if (g_error_matches (*error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY)) + { + /* A folder exists with the specified ref name, + * which is handled by _ostree_repo_write_ref */ + g_clear_error (error); + } + else goto out; + } + } + + if (!parent && opt_metadata_keep) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Either --branch or --parent must be specified when using " + "--keep-metadata"); + goto out; + } + + if (opt_metadata_strings || opt_metadata_variants || opt_metadata_keep) { g_autoptr(GVariantBuilder) builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); @@ -479,6 +521,31 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio !parse_keyvalue_strings (builder, opt_metadata_variants, TRUE, error)) goto out; + if (opt_metadata_keep) + { + g_assert (parent); + + g_autoptr(GVariant) parent_commit = NULL; + if (!ostree_repo_load_commit (repo, parent, &parent_commit, NULL, error)) + goto out; + + g_auto(GVariantDict) dict; + g_variant_dict_init (&dict, g_variant_get_child_value (parent_commit, 0)); + for (char **keyp = opt_metadata_keep; keyp && *keyp; keyp++) + { + const char *key = *keyp; + g_autoptr(GVariant) val = g_variant_dict_lookup_value (&dict, key, NULL); + if (!val) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Missing metadata key '%s' from commit '%s'", key, parent); + goto out; + } + + g_variant_builder_add (builder, "{sv}", key, val); + } + } + metadata = g_variant_ref_sink (g_variant_builder_end (builder)); } @@ -493,13 +560,6 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio detached_metadata = g_variant_ref_sink (g_variant_builder_end (builder)); } - if (!(opt_branch || opt_orphan)) - { - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "A branch must be specified with --branch, or use --orphan"); - goto out; - } - if (opt_no_xattrs) flags |= OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS; if (opt_consume) @@ -543,31 +603,6 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio } } - if (opt_parent) - { - if (g_str_equal (opt_parent, "none")) - parent = NULL; - else - { - if (!ostree_validate_checksum_string (opt_parent, error)) - goto out; - parent = g_strdup (opt_parent); - } - } - else if (!opt_orphan) - { - if (!ostree_repo_resolve_rev (repo, opt_branch, TRUE, &parent, error)) - { - if (g_error_matches (*error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY)) - { - /* A folder exists with the specified ref name, - * which is handled by _ostree_repo_write_ref */ - g_clear_error (error); - } - else goto out; - } - } - if (opt_editor) { if (!commit_editor (repo, opt_branch, &opt_subject, &commit_body, cancellable, error)) diff --git a/src/ostree/ot-builtin-find-remotes.c b/src/ostree/ot-builtin-find-remotes.c index b15bce8d..b99f6e6a 100644 --- a/src/ostree/ot-builtin-find-remotes.c +++ b/src/ostree/ot-builtin-find-remotes.c @@ -30,12 +30,14 @@ #include "ostree-remote-private.h" static gchar *opt_cache_dir = NULL; +static gchar *opt_finders = NULL; static gboolean opt_disable_fsync = FALSE; static gboolean opt_pull = FALSE; static GOptionEntry options[] = { { "cache-dir", 0, 0, G_OPTION_ARG_FILENAME, &opt_cache_dir, "Use custom cache dir", NULL }, + { "finders", 0, 0, G_OPTION_ARG_STRING, &opt_finders, "Use the specified comma separated list of finders (e.g. config,lan,mount)", "FINDERS" }, { "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL }, { "pull", 0, 0, G_OPTION_ARG_NONE, &opt_pull, "Pull the updates after finding them", NULL }, { NULL } @@ -116,6 +118,52 @@ collection_ref_free0 (OstreeCollectionRef *ref) ostree_collection_ref_free (ref); } +static gboolean +validate_finders_list (char **finders, + GOptionContext *context, + GError **error) +{ + typedef struct { + gchar *finder_name; + gboolean already_used; + } Finder; + Finder valid_finders[] = { + {.finder_name = "config", .already_used = FALSE}, + {.finder_name = "lan", .already_used = FALSE}, + {.finder_name = "mount", .already_used = FALSE} + }; + + if (finders == NULL || *finders == NULL) + { + ot_util_usage_error (context, "List of finders in --finders option must not be empty", error); + return FALSE; + } + + for (char **iter = finders; iter && *iter; iter++) + { + gboolean is_valid_finder = FALSE; + for (int i = 0; i < 3; i++) + { + if (valid_finders[i].already_used == TRUE) + continue; + if (g_strcmp0 (*iter, valid_finders[i].finder_name) == 0) + { + is_valid_finder = TRUE; + valid_finders[i].already_used = TRUE; + } + } + if (!is_valid_finder) + { + g_autofree gchar *error_msg = NULL; + error_msg = g_strdup_printf ("Unknown or duplicate finder type given in --finders option: ā€˜%s’", *iter); + ot_util_usage_error (context, error_msg, error); + return FALSE; + } + } + + return TRUE; +} + /* TODO: Add a man page. */ gboolean ostree_builtin_find_remotes (int argc, @@ -127,12 +175,17 @@ ostree_builtin_find_remotes (int argc, g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; g_autoptr(GPtrArray) refs = NULL; /* (element-type OstreeCollectionRef) */ + g_autoptr(GPtrArray) finders = NULL; /* (element-type OstreeRepoFinder) */ + g_autoptr(OstreeRepoFinder) finder_config = NULL; + g_autoptr(OstreeRepoFinder) finder_mount = NULL; + g_autoptr(OstreeRepoFinder) finder_avahi = NULL; g_autoptr(OstreeAsyncProgress) progress = NULL; gsize i; g_autoptr(GAsyncResult) find_result = NULL, pull_result = NULL; g_auto(OstreeRepoFinderResultv) results = NULL; g_auto(GLnxConsoleRef) console = { 0, }; g_autoptr(GHashTable) refs_found = NULL; /* set (element-type OstreeCollectionRef) */ + g_auto(GStrv) finders_strings = NULL; context = g_option_context_new ("COLLECTION-ID REF [COLLECTION-ID REF...]"); @@ -176,18 +229,65 @@ ostree_builtin_find_remotes (int argc, g_ptr_array_add (refs, NULL); + /* Build the array of OstreeRepoFinder instances */ + if (opt_finders != NULL) + { + g_auto(GStrv) finders_strings = NULL; + + finders_strings = g_strsplit (opt_finders, ",", 0); + if (!validate_finders_list (finders_strings, context, error)) + return FALSE; + + finders = g_ptr_array_new (); + for (char **iter =finders_strings; iter && *iter; iter++) + { + if (g_strcmp0 (*iter, "config") == 0) + { + finder_config = OSTREE_REPO_FINDER (ostree_repo_finder_config_new ()); + g_ptr_array_add (finders, finder_config); + } + else if (g_strcmp0 (*iter, "mount") == 0) + { + finder_mount = OSTREE_REPO_FINDER (ostree_repo_finder_mount_new (NULL)); + g_ptr_array_add (finders, finder_mount); + } + else if (g_strcmp0 (*iter, "lan") == 0) + { +#ifdef HAVE_AVAHI + GMainContext *main_context = g_main_context_get_thread_default (); + g_autoptr(GError) local_error = NULL; + + finder_avahi = OSTREE_REPO_FINDER (ostree_repo_finder_avahi_new (main_context)); + ostree_repo_finder_avahi_start (OSTREE_REPO_FINDER_AVAHI (finder_avahi), &local_error); + + if (local_error != NULL) + { + g_warning ("Avahi finder failed; removing it: %s", local_error->message); + g_clear_object (&finder_avahi); + } + else + g_ptr_array_add (finders, finder_avahi); +#else + ot_util_usage_error (context, "LAN repo finder requested but ostree was compiled without Avahi support", error); + return FALSE; +#endif /* HAVE_AVAHI */ + } + else + g_assert_not_reached (); + } + g_ptr_array_add (finders, NULL); + } + /* Run the operation. */ glnx_console_lock (&console); if (console.is_tty) progress = ostree_async_progress_new_and_connect (ostree_repo_pull_default_console_progress_changed, &console); - /* FIXME: Eventually some command line options for customising the finders - * list would be good. */ ostree_repo_find_remotes_async (repo, (const OstreeCollectionRef * const *) refs->pdata, NULL /* no options */, - NULL /* default finders */, + finders != NULL ? (OstreeRepoFinder **) finders->pdata : NULL, progress, cancellable, get_result_cb, &find_result); diff --git a/src/ostree/ot-builtin-remote.c b/src/ostree/ot-builtin-remote.c index dfb07d03..b89e8ba3 100644 --- a/src/ostree/ot-builtin-remote.c +++ b/src/ostree/ot-builtin-remote.c @@ -41,7 +41,7 @@ static OstreeCommand remote_subcommands[] = { { "gpg-import", OSTREE_BUILTIN_FLAG_NONE, ot_remote_builtin_gpg_import, "Import GPG keys" }, -#ifdef HAVE_LIBSOUP +#ifdef HAVE_LIBCURL_OR_LIBSOUP { "add-cookie", OSTREE_BUILTIN_FLAG_NONE, ot_remote_builtin_add_cookie, "Add a cookie to remote" }, diff --git a/src/ostree/ot-remote-builtins.h b/src/ostree/ot-remote-builtins.h index ce788524..60f4165e 100644 --- a/src/ostree/ot-remote-builtins.h +++ b/src/ostree/ot-remote-builtins.h @@ -31,7 +31,7 @@ BUILTINPROTO(add); BUILTINPROTO(delete); BUILTINPROTO(gpg_import); BUILTINPROTO(list); -#ifdef HAVE_LIBSOUP +#ifdef HAVE_LIBCURL_OR_LIBSOUP BUILTINPROTO(add_cookie); BUILTINPROTO(list_cookies); BUILTINPROTO(delete_cookie); diff --git a/src/rofiles-fuse/Makefile-inc.am b/src/rofiles-fuse/Makefile-inc.am index 5510a2bd..6754aa70 100644 --- a/src/rofiles-fuse/Makefile-inc.am +++ b/src/rofiles-fuse/Makefile-inc.am @@ -19,5 +19,7 @@ bin_PROGRAMS += rofiles-fuse rofiles_fuse_SOURCES = src/rofiles-fuse/main.c -rofiles_fuse_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 $(BUILDOPT_FUSE_CFLAGS) $(OT_INTERNAL_GIO_UNIX_CFLAGS) -I$(srcdir)/libglnx $(NULL) -rofiles_fuse_LDADD = libglnx.la $(BUILDOPT_FUSE_LIBS) $(OT_INTERNAL_GIO_UNIX_LIBS) +rofiles_fuse_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 $(BUILDOPT_FUSE_CFLAGS) \ + $(OT_INTERNAL_GIO_UNIX_CFLAGS) -I $(srcdir)/src/libostree -I $(builddir)/src/libostree \ + -I$(srcdir)/libglnx +rofiles_fuse_LDADD = libglnx.la $(BUILDOPT_FUSE_LIBS) $(OT_INTERNAL_GIO_UNIX_LIBS) libostree-1.la diff --git a/src/rofiles-fuse/main.c b/src/rofiles-fuse/main.c index 9e04274b..77c2f3d7 100644 --- a/src/rofiles-fuse/main.c +++ b/src/rofiles-fuse/main.c @@ -35,9 +35,14 @@ #include #include "libglnx.h" +#include "ostree.h" // Global to store our read-write path static int basefd = -1; +/* Whether or not to automatically "copyup" (in overlayfs terms). + * What we're really doing is breaking hardlinks. + */ +static gboolean opt_copyup; static inline const char * ENSURE_RELPATH (const char *path) @@ -200,52 +205,103 @@ callback_link (const char *from, const char *to) /* Check whether @stbuf refers to a hardlinked regfile or symlink, and if so * return -EROFS. Otherwise return 0. */ -static int -can_write_stbuf (struct stat *stbuf) +static gboolean +can_write_stbuf (const struct stat *stbuf) { /* If it's not a regular file or symlink, ostree won't hardlink it, so allow * writes - it might be a FIFO or device that somehow * ended up underneath our mount. */ if (!(S_ISREG (stbuf->st_mode) || S_ISLNK (stbuf->st_mode))) - return 0; + return TRUE; /* If the object isn't hardlinked, it's OK to write */ if (stbuf->st_nlink <= 1) - return 0; + return TRUE; /* Otherwise, it's a hardlinked file or symlink; it must be * immutable. */ - return -EROFS; + return FALSE; } -/* Check whether @path refers to a hardlinked regfile or symlink, and if so - * return -EROFS. Otherwise return 0. - */ static int -can_write (const char *path) +gioerror_to_errno (GIOErrorEnum e) { - struct stat stbuf; - if (fstatat (basefd, path, &stbuf, AT_SYMLINK_NOFOLLOW) == -1) + /* It's obviously crappy to have to do this but + * we also don't want to try to have "raw errno" versions + * of everything down in ostree_break_hardlink() so... + * let's just reverse map a few ones I think are going to be common. + */ + switch (e) { - if (errno == ENOENT) - return 0; - else - return -errno; + case G_IO_ERROR_NOT_FOUND: + return ENOENT; + case G_IO_ERROR_IS_DIRECTORY: + return EISDIR; + case G_IO_ERROR_PERMISSION_DENIED: + return EPERM; + case G_IO_ERROR_NO_SPACE: + return ENOSPC; + default: + return EIO; } - return can_write_stbuf (&stbuf); } -#define VERIFY_WRITE(path) do { \ - int r = can_write (path); \ - if (r != 0) \ - return r; \ +static int +verify_write_or_copyup (const char *path, const struct stat *stbuf, + gboolean *out_did_copyup) +{ + struct stat stbuf_local; + + if (out_did_copyup) + *out_did_copyup = FALSE; + + /* If a stbuf wasn't provided, gather it now */ + if (!stbuf) + { + if (fstatat (basefd, path, &stbuf_local, AT_SYMLINK_NOFOLLOW) == -1) + { + if (errno == ENOENT) + return 0; + else + return -errno; + } + stbuf = &stbuf_local; + } + + /* Verify writability, if that fails, perform copy-up if enabled */ + if (!can_write_stbuf (stbuf)) + { + if (opt_copyup) + { + g_autoptr(GError) tmp_error = NULL; + if (!ostree_break_hardlink (basefd, path, FALSE, NULL, &tmp_error)) + return -gioerror_to_errno ((GIOErrorEnum)tmp_error->code); + if (out_did_copyup) + *out_did_copyup = TRUE; + } + else + return -EROFS; + } + + return 0; +} + +/* Given a path (which is absolute), convert it + * to a relative path (even for the caller) and + * perform either write verification or copy-up. + */ +#define PATH_WRITE_ENTRYPOINT(path) do { \ + path = ENSURE_RELPATH (path); \ + int r = verify_write_or_copyup (path, NULL, NULL); \ + if (r != 0) \ + return r; \ } while (0) static int callback_chmod (const char *path, mode_t mode) { - path = ENSURE_RELPATH (path); - VERIFY_WRITE(path); + PATH_WRITE_ENTRYPOINT (path); + /* Note we can't use AT_SYMLINK_NOFOLLOW yet; * https://marc.info/?l=linux-kernel&m=148830147803162&w=2 * https://marc.info/?l=linux-fsdevel&m=149193779929561&w=2 @@ -258,8 +314,8 @@ callback_chmod (const char *path, mode_t mode) static int callback_chown (const char *path, uid_t uid, gid_t gid) { - path = ENSURE_RELPATH (path); - VERIFY_WRITE(path); + PATH_WRITE_ENTRYPOINT (path); + if (fchownat (basefd, path, uid, gid, AT_SYMLINK_NOFOLLOW) != 0) return -errno; return 0; @@ -268,12 +324,9 @@ callback_chown (const char *path, uid_t uid, gid_t gid) static int callback_truncate (const char *path, off_t size) { - glnx_autofd int fd = -1; + PATH_WRITE_ENTRYPOINT (path); - path = ENSURE_RELPATH (path); - VERIFY_WRITE(path); - - fd = openat (basefd, path, O_NOFOLLOW|O_WRONLY); + glnx_autofd int fd = openat (basefd, path, O_NOFOLLOW|O_WRONLY); if (fd == -1) return -errno; @@ -286,6 +339,9 @@ callback_truncate (const char *path, off_t size) static int callback_utimens (const char *path, const struct timespec tv[2]) { + /* This one isn't write-verified, we support changing times + * even for hardlinked files. + */ path = ENSURE_RELPATH (path); if (utimensat (basefd, path, tv, AT_SYMLINK_NOFOLLOW) == -1) @@ -324,20 +380,39 @@ do_open (const char *path, mode_t mode, struct fuse_file_info *finfo) return -errno; } - int r = can_write_stbuf (&stbuf); + gboolean did_copyup; + int r = verify_write_or_copyup (path, &stbuf, &did_copyup); if (r != 0) { (void) close (fd); return r; } - /* Handle O_TRUNC here only after verifying hardlink state */ - if (finfo->flags & O_TRUNC) + /* In the copyup case, we need to re-open */ + if (did_copyup) { - if (ftruncate (fd, 0) == -1) + (void) close (fd); + /* Note that unlike the initial open, we will pass through + * O_TRUNC. More ideally in this copyup case we'd avoid copying + * the whole file in the first place, but eh. It's not like we're + * high performance anyways. + */ + fd = openat (basefd, path, finfo->flags & ~(O_EXCL|O_CREAT), mode); + if (fd == -1) + return -errno; + } + else + { + /* In the non-copyup case we handle O_TRUNC here, after we've verified + * the hardlink state above with verify_write_or_copyup(). + */ + if (finfo->flags & O_TRUNC) { - (void) close (fd); - return -errno; + if (ftruncate (fd, 0) == -1) + { + (void) close (fd); + return -errno; + } } } } @@ -521,6 +596,7 @@ struct fuse_operations callback_oper = { enum { KEY_HELP, KEY_VERSION, + KEY_COPYUP, }; static void @@ -565,6 +641,9 @@ rofs_parse_opt (void *data, const char *arg, int key, case KEY_HELP: usage (outargs->argv[0]); exit (EXIT_SUCCESS); + case KEY_COPYUP: + opt_copyup = TRUE; + return 0; default: fprintf (stderr, "see `%s -h' for usage\n", outargs->argv[0]); exit (EXIT_FAILURE); @@ -577,6 +656,7 @@ static struct fuse_opt rofs_opts[] = { FUSE_OPT_KEY ("--help", KEY_HELP), FUSE_OPT_KEY ("-V", KEY_VERSION), FUSE_OPT_KEY ("--version", KEY_VERSION), + FUSE_OPT_KEY ("--copyup", KEY_COPYUP), FUSE_OPT_END }; diff --git a/src/switchroot/ostree-prepare-root.c b/src/switchroot/ostree-prepare-root.c index 9b8c3381..43e15fcc 100644 --- a/src/switchroot/ostree-prepare-root.c +++ b/src/switchroot/ostree-prepare-root.c @@ -102,10 +102,16 @@ main(int argc, char *argv[]) struct stat stbuf; int we_mounted_proc = 0; - if (argc < 2) - root_arg = "/"; + if (getpid() == 1) + { + root_arg = "/"; + } else - root_arg = argv[1]; + { + if (argc < 2) + err (EXIT_FAILURE, "usage: ostree-prepare-root SYSROOT"); + root_arg = argv[1]; + } if (stat ("/proc/cmdline", &stbuf) < 0) { diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 87cb9fa2..9c8771e5 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..$((78 + ${extra_basic_tests:-0}))" +echo "1..$((79 + ${extra_basic_tests:-0}))" CHECKOUT_U_ARG="" CHECKOUT_H_ARGS="-H" @@ -759,14 +759,38 @@ $OSTREE show --print-metadata-key=FOO test2 > test2-meta assert_file_has_content test2-meta "BAR" $OSTREE show --print-metadata-key=KITTENS test2 > test2-meta assert_file_has_content test2-meta "CUTE" + $OSTREE show --print-metadata-key=SOMENUM test2 > test2-meta -assert_file_has_content test2-meta "uint64 3026418949592973312" +case "$("${test_builddir}/get-byte-order")" in + (4321) + assert_file_has_content test2-meta "uint64 42" + ;; + (1234) + assert_file_has_content test2-meta "uint64 3026418949592973312" + ;; + (*) + fatal "neither little-endian nor big-endian?" + ;; +esac + $OSTREE show -B --print-metadata-key=SOMENUM test2 > test2-meta assert_file_has_content test2-meta "uint64 42" $OSTREE show --print-detached-metadata-key=SIGNATURE test2 > test2-meta assert_file_has_content test2-meta "HANCOCK" echo "ok metadata commit with strings" +$OSTREE commit ${COMMIT_ARGS} -b test2 --tree=ref=test2 \ + --add-detached-metadata-string=SIGNATURE=HANCOCK \ + --keep-metadata=KITTENS --keep-metadata=SOMENUM +if $OSTREE show --print-metadata-key=FOO test2; then + assert_not_reached "FOO was kept without explicit --keep-metadata?" +fi +$OSTREE show --print-metadata-key=KITTENS test2 > test2-meta +assert_file_has_content test2-meta "CUTE" +$OSTREE show -B --print-metadata-key=SOMENUM test2 > test2-meta +assert_file_has_content test2-meta "uint64 42" +echo "ok keep metadata from parent" + cd ${test_tmpdir} $OSTREE show --print-metadata-key=ostree.ref-binding test2 > test2-ref-binding assert_file_has_content test2-ref-binding 'test2' diff --git a/tests/get-byte-order.c b/tests/get-byte-order.c new file mode 100644 index 00000000..7e7ba31b --- /dev/null +++ b/tests/get-byte-order.c @@ -0,0 +1,12 @@ +/* Helper for OSTree tests: return host byte order */ + +#include "config.h" + +#include + +int +main (void) +{ + g_print ("%d\n", G_BYTE_ORDER); + return 0; +} diff --git a/tests/libtest-core.sh b/tests/libtest-core.sh index 2144e1ac..7223f4d2 100644 --- a/tests/libtest-core.sh +++ b/tests/libtest-core.sh @@ -112,9 +112,12 @@ assert_file_has_content () { } assert_file_has_content_literal () { - if ! grep -q -F -e "$2" "$1"; then - _fatal_print_file "$1" "File '$1' doesn't match fixed string list '$2'" - fi + fpath=$1; shift + for s in "$@"; do + if ! grep -q -F -e "$s" "$fpath"; then + _fatal_print_file "$fpath" "File '$fpath' doesn't match fixed string list '$s'" + fi + done } assert_file_has_mode () { diff --git a/tests/ostree-grub-generator b/tests/ostree-grub-generator index 82e66bd7..97ef4d69 100644 --- a/tests/ostree-grub-generator +++ b/tests/ostree-grub-generator @@ -1,7 +1,6 @@ #!/bin/sh -# To use a custrom script for generating grub.cfg, set the --with-grub2-mkconfig=no -# configure switch when configuring and building OSTree. +# The builtin grub.cfg generator. # # This script is called by ostree/src/libostree/ostree-bootloader-grub2.c whenever # boot loader configuration file needs to be updated. It can be used as a template @@ -28,7 +27,7 @@ entries_path=$(dirname $new_grub2_cfg)/entries read_config() { - config_file=${entries_path}/${1} + config_file=${1} title="" initrd="" options="" @@ -67,11 +66,13 @@ populate_menu() else boot_prefix="${OSTREE_BOOT_PARTITION}" fi - for config in $(ls ${entries_path}); do + for config in $(ls $entries_path/*.conf); do read_config ${config} menu="${menu}menuentry '${title}' {\n" menu="${menu}\t linux ${boot_prefix}${linux} ${options}\n" - menu="${menu}\t initrd ${boot_prefix}${initrd}\n" + if [ -n "${initrd}" ] ; then + menu="${menu}\t initrd ${boot_prefix}${initrd}\n" + fi menu="${menu}}\n\n" done # The printf command seems to be more reliable across shells for special character (\n, \t) evaluation diff --git a/tests/ostree-path-traverse.tar.gz b/tests/ostree-path-traverse.tar.gz new file mode 100644 index 00000000..9dec3b73 Binary files /dev/null and b/tests/ostree-path-traverse.tar.gz differ diff --git a/tests/pull-test.sh b/tests/pull-test.sh index e6317fbf..8018e91a 100644 --- a/tests/pull-test.sh +++ b/tests/pull-test.sh @@ -52,7 +52,7 @@ function verify_initial_contents() { assert_file_has_content baz/cow '^moo$' } -echo "1..33" +echo "1..34" # Try both syntaxes repo_init --no-gpg-verify @@ -217,6 +217,24 @@ else echo "ok corruption (skipped)" fi + +cd ${test_tmpdir}/ostree-srv +tar xf ${test_srcdir}/ostree-path-traverse.tar.gz +cd ${test_tmpdir} +rm corruptrepo -rf +ostree_repo_init corruptrepo --mode=archive +${CMD_PREFIX} ostree --repo=corruptrepo remote add --set=gpg-verify=false pathtraverse $(cat httpd-address)/ostree/ostree-path-traverse/repo +if ${CMD_PREFIX} ostree --repo=corruptrepo pull pathtraverse pathtraverse-test 2>err.txt; then + fatal "Pulled a repo with path traversal in dirtree" +fi +assert_file_has_content_literal err.txt 'ae9a5d2701a02740aa2ee317ba53b13e3efb0f29609cd4896e1bafeee4caddb5.dirtree: Invalid / in filename ../afile' +# And verify we didn't write the object into the staging directory even +find corruptrepo/tmp -name '9a5d2701a02740aa2ee317ba53b13e3efb0f29609cd4896e1bafeee4caddb5.dirtree' >find.txt +assert_not_file_has_content find.txt '9a5d2701a02740aa2ee317ba53b13e3efb0f29609cd4896e1bafeee4caddb5' +rm corruptrepo -rf +echo "ok path traversal checked on pull" + + cd ${test_tmpdir} rm mirrorrepo/refs/remotes/* -rf ${CMD_PREFIX} ostree --repo=mirrorrepo prune --refs-only diff --git a/tests/test-basic-user.sh b/tests/test-basic-user.sh index 7f970b5c..6987e4ad 100755 --- a/tests/test-basic-user.sh +++ b/tests/test-basic-user.sh @@ -104,18 +104,20 @@ cd ${test_tmpdir} rm -rf test2-checkout $OSTREE checkout -H -U test2 test2-checkout # With --link-checkout-speedup, specifying --owner-uid should "win" by default. -myid=$(id -u) -newid=$((${myid} + 1)) -$OSTREE commit ${COMMIT_ARGS} --owner-uid ${newid} --owner-gid ${newid} \ +myuid=$(id -u) +mygid=$(id -g) +newuid=$((${myuid} + 1)) +newgid=$((${mygid} + 1)) +$OSTREE commit ${COMMIT_ARGS} --owner-uid ${newuid} --owner-gid ${newgid} \ --link-checkout-speedup -b test2-linkcheckout-test --tree=dir=test2-checkout $OSTREE ls test2-linkcheckout-test /baz/cow > ls.txt -assert_file_has_content ls.txt "^-006.. ${newid} ${newid} .*/baz/cow" +assert_file_has_content ls.txt "^-006.. ${newuid} ${newgid} .*/baz/cow" # But --devino-canonical should override that -$OSTREE commit ${COMMIT_ARGS} --owner-uid ${newid} --owner-gid ${newid} \ +$OSTREE commit ${COMMIT_ARGS} --owner-uid ${newuid} --owner-gid ${newgid} \ -I -b test2-devino-test --tree=dir=test2-checkout $OSTREE ls test2-devino-test /baz/cow > ls.txt -assert_file_has_content ls.txt "^-006.. ${myid} ${myid} .*/baz/cow" +assert_file_has_content ls.txt "^-006.. ${myuid} ${mygid} .*/baz/cow" $OSTREE refs --delete test2-{linkcheckout,devino}-test echo "ok commit with -I" diff --git a/tests/test-corruption.sh b/tests/test-corruption.sh index cb5e9c09..74ce8e83 100755 --- a/tests/test-corruption.sh +++ b/tests/test-corruption.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..4" +echo "1..6" . $(dirname $0)/libtest.sh @@ -72,3 +72,18 @@ fi assert_file_has_content_literal err.txt "Loading commit for ref test2: No such metadata object" echo "ok missing commit" + +cd ${test_tmpdir} +tar xf ${test_srcdir}/ostree-path-traverse.tar.gz +if ${CMD_PREFIX} ostree --repo=ostree-path-traverse/repo fsck -q 2>err.txt; then + fatal "fsck unexpectedly succeeded" +fi +assert_file_has_content_literal err.txt '.dirtree: Invalid / in filename ../afile' +echo "ok path traverse fsck" + +cd ${test_tmpdir} +if ${CMD_PREFIX} ostree --repo=ostree-path-traverse/repo checkout pathtraverse-test pathtraverse-test 2>err.txt; then + fatal "checkout with path traversal unexpectedly succeeded" +fi +assert_file_has_content_literal err.txt 'Invalid / in filename ../afile' +echo "ok path traverse checkout" diff --git a/tests/test-find-remotes.sh b/tests/test-find-remotes.sh index 0bbe54f0..bc3888f4 100755 --- a/tests/test-find-remotes.sh +++ b/tests/test-find-remotes.sh @@ -86,7 +86,7 @@ assert_file_has_content local-mirror/refs/mirrors/org.example.OsCollection/os/am for repo in local local-mirror; do # Try finding an update for an existing branch. - ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 > find + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config org.example.AppsCollection app1 > find assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" assert_file_has_content find "^ - (org.example.AppsCollection, app1) = $(cat app1-checksum)$" @@ -94,7 +94,7 @@ for repo in local local-mirror; do assert_not_file_has_content find "^No results.$" # Find several updates for several existing branches. - ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 org.example.OsCollection os/amd64/master > find + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config org.example.AppsCollection app1 org.example.OsCollection os/amd64/master > find assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" assert_file_has_content find "^ - (org.example.AppsCollection, app1) = $(cat app1-checksum)$" @@ -105,7 +105,7 @@ for repo in local local-mirror; do assert_not_file_has_content find "^No results.$" # Find some updates and a new branch. - ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 org.example.AppsCollection app2 org.example.OsCollection os/amd64/master > find + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config org.example.AppsCollection app1 org.example.AppsCollection app2 org.example.OsCollection os/amd64/master > find assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" assert_file_has_content find "^ - (org.example.AppsCollection, app1) = $(cat app1-checksum)$" @@ -117,7 +117,7 @@ for repo in local local-mirror; do assert_not_file_has_content find "^No results.$" # Find an update and a non-existent branch. - ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 org.example.AppsCollection not-an-app > find + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config org.example.AppsCollection app1 org.example.AppsCollection not-an-app > find assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" assert_file_has_content find "^ - (org.example.AppsCollection, not-an-app) = (not found)$" @@ -128,20 +128,20 @@ for repo in local local-mirror; do assert_not_file_has_content find "^No results.$" # Do all the above, but pull this time. - ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 > pull || true + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config --pull org.example.AppsCollection app1 > pull || true assert_file_has_content pull "^1/1 refs were found.$" assert_file_has_content pull "^Pulled 1/1 refs successfully.$" assert_not_file_has_content pull "Failed to pull some refs from the remotes" assert_ref $repo app1 $(cat app1-checksum) - ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 org.example.OsCollection os/amd64/master > pull + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config --pull org.example.AppsCollection app1 org.example.OsCollection os/amd64/master > pull assert_file_has_content pull "^2/2 refs were found.$" assert_file_has_content pull "^Pulled 2/2 refs successfully.$" assert_not_file_has_content pull "Failed to pull some refs from the remotes" assert_ref $repo app1 $(cat app1-checksum) assert_ref $repo os/amd64/master $(cat os-checksum) - ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 org.example.AppsCollection app2 org.example.OsCollection os/amd64/master > pull + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config --pull org.example.AppsCollection app1 org.example.AppsCollection app2 org.example.OsCollection os/amd64/master > pull assert_file_has_content pull "^3/3 refs were found.$" assert_file_has_content pull "^Pulled 3/3 refs successfully.$" assert_not_file_has_content pull "Failed to pull some refs from the remotes" @@ -149,7 +149,7 @@ for repo in local local-mirror; do assert_ref $repo app2 $(cat app2-checksum) assert_ref $repo os/amd64/master $(cat os-checksum) - ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 org.example.AppsCollection not-an-app > pull + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config --pull org.example.AppsCollection app1 org.example.AppsCollection not-an-app > pull assert_file_has_content pull "^1/2 refs were found.$" assert_not_file_has_content pull "Failed to pull some refs from the remotes" assert_ref $repo app1 $(cat app1-checksum) @@ -164,7 +164,7 @@ ${CMD_PREFIX} ostree --repo=os-collection summary --update --gpg-homedir=${TEST_ for repo in local-mirror; do # Try finding an update for that branch. - ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.OsCollection os/amd64/master > find + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config org.example.OsCollection os/amd64/master > find assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-2)$" @@ -172,7 +172,7 @@ for repo in local-mirror; do assert_not_file_has_content find "^No results.$" # Pull it. - ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.OsCollection os/amd64/master > pull || true + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config --pull org.example.OsCollection os/amd64/master > pull || true assert_file_has_content pull "^1/1 refs were found.$" assert_file_has_content pull "^Pulled 1/1 refs successfully.$" assert_not_file_has_content pull "Failed to pull some refs from the remotes" @@ -191,7 +191,7 @@ ${CMD_PREFIX} ostree --repo=local remote add os-remote-local-mirror file://$(pwd for repo in local; do # Try finding an update for that branch. - ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.OsCollection os/amd64/master > find + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config org.example.OsCollection os/amd64/master > find assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-2)$" @@ -202,7 +202,7 @@ for repo in local; do assert_not_file_has_content find "^No results.$" # Pull it. - ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.OsCollection os/amd64/master > pull || true + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config --pull org.example.OsCollection os/amd64/master > pull || true assert_file_has_content pull "^1/1 refs were found.$" assert_file_has_content pull "^Pulled 1/1 refs successfully.$" assert_not_file_has_content pull "Failed to pull some refs from the remotes" @@ -218,7 +218,7 @@ ${CMD_PREFIX} ostree --repo=os-collection summary --update --gpg-homedir=${TEST_ for repo in local; do # Try finding an update for that branch. - ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.OsCollection os/amd64/master > find + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config org.example.OsCollection os/amd64/master > find assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-3)$" @@ -226,7 +226,7 @@ for repo in local; do assert_not_file_has_content find "^No results.$" # Pull it. - ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.OsCollection os/amd64/master > pull || true + ${CMD_PREFIX} ostree --repo=$repo find-remotes --finders=config --pull org.example.OsCollection os/amd64/master > pull || true assert_file_has_content pull "^1/1 refs were found.$" assert_file_has_content pull "^Pulled 1/1 refs successfully.$" assert_not_file_has_content pull "Failed to pull some refs from the remotes" diff --git a/tests/test-no-initramfs.sh b/tests/test-no-initramfs.sh new file mode 100755 index 00000000..7c23a3e7 --- /dev/null +++ b/tests/test-no-initramfs.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +. $(dirname $0)/libtest.sh + +echo "1..7" + +setup_os_repository "archive-z2" "uboot" + +cd ${test_tmpdir} + +${CMD_PREFIX} ostree --repo=sysroot/ostree/repo remote add --set=gpg-verify=false testos $(cat httpd-address)/ostree/testos-repo +${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull testos testos/buildmaster/x86_64-runtime +${CMD_PREFIX} ostree admin deploy --karg=root=LABEL=rootfs --os=testos testos:testos/buildmaster/x86_64-runtime + +assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'root=LABEL=rootfs' +assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'init=' + +echo "ok deployment with initramfs" + +pull_test_tree() { + kernel_contents=$1 + initramfs_contents=$2 + + printf "TEST SETUP:\n kernel: %s\n initramfs: %s\n layout: %s\n" \ + "$kernel_contents" "$initramfs_contents" "$layout" + + rm -rf ${test_tmpdir}/osdata/usr/lib/modules/3.6.0/{initramfs.img,vmlinuz} \ + ${test_tmpdir}/osdata/usr/lib/ostree-boot \ + ${test_tmpdir}/osdata/boot + if [ "$layout" = "/usr/lib/modules" ]; then + # Fedora compatible layout + cd ${test_tmpdir}/osdata/usr/lib/modules/3.6.0 + echo -n "$kernel_contents" > vmlinuz + [ -n "$initramfs_contents" ] && echo -n "$initramfs_contents" > initramfs.img + elif [ "$layout" = "/usr/lib/ostree-boot" ] || [ "$layout" = "/boot" ]; then + # "Legacy" layout + mkdir -p "${test_tmpdir}/osdata/$layout" + cd "${test_tmpdir}/osdata/$layout" + bootcsum=$(echo -n "$kernel_contents$initramfs_contents" \ + | sha256sum | cut -f 1 -d ' ') + echo -n "$kernel_contents" > vmlinuz-${bootcsum} + [ -n "$initramfs_contents" ] && echo -n "$initramfs_contents" > initramfs-${bootcsum} + else + exit 1 + fi + cd - + ${CMD_PREFIX} ostree --repo=${test_tmpdir}/testos-repo commit --tree=dir=osdata/ -b testos/buildmaster/x86_64-runtime + ${CMD_PREFIX} ostree pull testos:testos/buildmaster/x86_64-runtime +} + +get_key_from_bootloader_conf() { + conffile=$1 + key=$2 + + assert_file_has_content "$conffile" "^$key" + awk "/^$key/ { print \$2 }" "$conffile" +} + +for layout in /usr/lib/modules /usr/lib/ostree-boot /boot; +do + pull_test_tree "the kernel only" + ${CMD_PREFIX} ostree admin deploy --os=testos --karg=root=/dev/sda2 --karg=rootwait testos:testos/buildmaster/x86_64-runtime + assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'rootwait' + assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'init=' + assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'initrd' + + echo "ok switching to bootdir with no initramfs layout=$layout" + + pull_test_tree "the kernel" "initramfs to assist the kernel" + ${CMD_PREFIX} ostree admin deploy --os=testos --karg-none --karg=root=LABEL=rootfs testos:testos/buildmaster/x86_64-runtime + assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'initrd' + assert_file_has_content sysroot/boot/$(get_key_from_bootloader_conf sysroot/boot/loader/entries/ostree-testos-0.conf "initrd") "initramfs to assist the kernel" + assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'root=LABEL=rootfs' + assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'rootwait' + assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'init=' + + echo "ok switching from no initramfs to initramfs enabled sysroot layout=$layout" +done diff --git a/tests/test-pull-untrusted.sh b/tests/test-pull-untrusted.sh index 247a34f9..5e35c1c3 100755 --- a/tests/test-pull-untrusted.sh +++ b/tests/test-pull-untrusted.sh @@ -1,6 +1,7 @@ #!/bin/bash # # Copyright (C) 2014 Alexander Larsson +# Copyright (C) 2018 Red Hat, Inc. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -22,7 +23,7 @@ set -euo pipefail . $(dirname $0)/libtest.sh -echo '1..3' +echo '1..4' setup_test_repository "bare" @@ -60,10 +61,20 @@ else fi rm -rf repo2 -mkdir repo2 ostree_repo_init repo2 --mode="bare" if ${CMD_PREFIX} ostree --repo=repo2 pull-local --untrusted repo; then assert_not_reached "corrupted untrusted pull unexpectedly failed!" else echo "ok untrusted pull with corruption failed" fi + + +cd ${test_tmpdir} +tar xf ${test_srcdir}/ostree-path-traverse.tar.gz +rm -rf repo2 +ostree_repo_init repo2 --mode=archive +if ${CMD_PREFIX} ostree --repo=repo2 pull-local --untrusted ostree-path-traverse/repo pathtraverse-test 2>err.txt; then + fatal "pull-local unexpectedly succeeded" +fi +assert_file_has_content_literal err.txt 'Invalid / in filename ../afile' +echo "ok untrusted pull-local path traversal" diff --git a/tests/test-repo-finder-mount-integration.sh b/tests/test-repo-finder-mount-integration.sh index 9ce34cb2..33959af2 100755 --- a/tests/test-repo-finder-mount-integration.sh +++ b/tests/test-repo-finder-mount-integration.sh @@ -109,12 +109,12 @@ for fs_type in ext4 vfat; do ostree_repo_init peer-repo_$fs_type ${CMD_PREFIX} ostree --repo=peer-repo_$fs_type remote add remote1 file://just-here-for-the-keyring --collection-id org.example.Collection1 --gpg-import="${test_tmpdir}/gpghome/key1.asc" - ${CMD_PREFIX} ostree --repo=peer-repo_$fs_type find-remotes org.example.Collection1 test-1 > find-results + ${CMD_PREFIX} ostree --repo=peer-repo_$fs_type find-remotes --finders=mount org.example.Collection1 test-1 > find-results assert_not_file_has_content find-results "^No results.$" assert_file_has_content find-results "^Result 0: file://${usb_mount}" assert_file_has_content find-results "(org.example.Collection1, test-1) = $(cat ref1-checksum)$" - ${CMD_PREFIX} ostree --repo=peer-repo_$fs_type find-remotes --pull org.example.Collection1 test-1 > pull-results + ${CMD_PREFIX} ostree --repo=peer-repo_$fs_type find-remotes --finders=mount --pull org.example.Collection1 test-1 > pull-results assert_file_has_content pull-results "^Pulled 1/1 refs successfully.$" ${CMD_PREFIX} ostree --repo=peer-repo_$fs_type refs --collections > refs diff --git a/tests/test-rofiles-fuse.sh b/tests/test-rofiles-fuse.sh index 6222929e..1c91a5cd 100755 --- a/tests/test-rofiles-fuse.sh +++ b/tests/test-rofiles-fuse.sh @@ -26,7 +26,7 @@ skip_without_user_xattrs setup_test_repository "bare" -echo "1..8" +echo "1..11" cd ${test_tmpdir} mkdir mnt @@ -117,3 +117,58 @@ echo "ok checkout copy fallback" # check that O_RDONLY|O_CREAT is handled correctly; used by flock(1) at least flock mnt/nonexistent-file echo "ok create file in ro mode" +echo "ok flock" + +# And now with --copyup enabled + +copyup_reset() { + cd ${test_tmpdir} + fusermount -u mnt + rm checkout-test2 -rf + $OSTREE checkout -H test2 checkout-test2 + rofiles-fuse --copyup checkout-test2 mnt +} + +assert_test_file() { + t=$1 + f=$2 + if ! test ${t} "${f}"; then + ls -al "${f}" + fatal "Failed test ${t} ${f}" + fi +} + +copyup_reset +assert_file_has_content mnt/firstfile first +echo "ok copyup mount" + +# Test O_TRUNC directly +firstfile_orig_inode=$(stat -c %i checkout-test2/firstfile) +echo -n truncating > mnt/firstfile +assert_streq "$(cat mnt/firstfile)" truncating +firstfile_new_inode=$(stat -c %i checkout-test2/firstfile) +assert_not_streq "${firstfile_orig_inode}" "${firstfile_new_inode}" +assert_test_file -f checkout-test2/firstfile + +copyup_reset +firstfile_link_orig_inode=$(stat -c %i checkout-test2/firstfile-link) +firstfile_orig_inode=$(stat -c %i checkout-test2/firstfile) +# Now write via the symlink +echo -n truncating > mnt/firstfile-link +assert_streq "$(cat mnt/firstfile)" truncating +firstfile_new_inode=$(stat -c %i checkout-test2/firstfile) +firstfile_link_new_inode=$(stat -c %i checkout-test2/firstfile-link) +assert_not_streq "${firstfile_orig_inode}" "${firstfile_new_inode}" +assert_streq "${firstfile_link_orig_inode}" "${firstfile_link_new_inode}" +assert_test_file -f checkout-test2/firstfile +# Verify we didn't replace the link with a regfile somehow +assert_test_file -L checkout-test2/firstfile-link + +# These both end up creating new files; in the sed case we'll then do a rename() +copyup_reset +echo "hello new file" > mnt/a-new-non-copyup-file +assert_file_has_content_literal mnt/a-new-non-copyup-file "hello new file" +sed -i -e s,first,second, mnt/firstfile +assert_file_has_content_literal mnt/firstfile "second" + +echo "ok copyup" diff --git a/tests/test-symbols.sh b/tests/test-symbols.sh index 51137d6c..02facd2c 100755 --- a/tests/test-symbols.sh +++ b/tests/test-symbols.sh @@ -52,7 +52,7 @@ echo 'ok documented symbols' # ONLY update this checksum in release commits! cat > released-sha256.txt <