Usually we don't do this kind of fallback, but rather disable the relevant functionality if the lib is not available.
In this case I guess it means making support for .mount units optional. I could imagine someone doing that in very specialised use cases, but maybe it makes more sense to make the library a hard dependency for now... Cheers, Tom On 7 Nov 2014 06:11, "Chris Leech" <cle...@redhat.com> wrote: > This lets libmount add in user options from /run/mount/utab, like > _netdev which is needed to get proper ordering against remote-fs.target > --- > .travis.yml | 2 +- > Makefile.am | 4 +++- > README | 1 + > configure.ac | 13 ++++++++++++ > src/core/build.h | 7 +++++++ > src/core/mount.c | 62 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 6 files changed, 87 insertions(+), 2 deletions(-) > > diff --git a/.travis.yml b/.travis.yml > index 7e5251c..4ea2bc2 100644 > --- a/.travis.yml > +++ b/.travis.yml > @@ -3,7 +3,7 @@ compiler: > - gcc > before_install: > - sudo apt-get update -qq > - - sudo apt-get install autotools-dev automake autoconf libtool > libdbus-1-dev libcap-dev libblkid-dev libpam-dev libcryptsetup-dev > libaudit-dev libacl1-dev libattr1-dev libselinux-dev liblzma-dev > libgcrypt-dev libqrencode-dev libmicrohttpd-dev gtk-doc-tools gperf > python2.7-dev > + - sudo apt-get install autotools-dev automake autoconf libtool > libdbus-1-dev libcap-dev libblkid-dev libmount-dev libpam-dev > libcryptsetup-dev libaudit-dev libacl1-dev libattr1-dev libselinux-dev > liblzma-dev libgcrypt-dev libqrencode-dev libmicrohttpd-dev gtk-doc-tools > gperf python2.7-dev > script: ./autogen.sh && ./configure --enable-gtk-doc --enable-gtk-doc-pdf > && make V=1 && sudo ./systemd-machine-id-setup && make check && make > distcheck > after_failure: cat test-suite.log > notifications: > diff --git a/Makefile.am b/Makefile.am > index 461ffa9..3deffe8 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -1163,6 +1163,7 @@ libsystemd_core_la_CFLAGS = \ > $(KMOD_CFLAGS) \ > $(APPARMOR_CFLAGS) \ > $(SECCOMP_CFLAGS) \ > + $(MOUNT_CFLAGS) \ > -pthread > > libsystemd_core_la_LIBADD = \ > @@ -1177,7 +1178,8 @@ libsystemd_core_la_LIBADD = \ > $(CAP_LIBS) \ > $(KMOD_LIBS) \ > $(APPARMOR_LIBS) \ > - $(SECCOMP_LIBS) > + $(SECCOMP_LIBS) \ > + $(MOUNT_LIBS) > > if HAVE_SECCOMP > libsystemd_core_la_LIBADD += \ > diff --git a/README b/README > index aefb349..89abc3e 100644 > --- a/README > +++ b/README > @@ -108,6 +108,7 @@ REQUIREMENTS: > libcap > libseccomp >= 1.0.0 (optional) > libblkid >= 2.20 (from util-linux) (optional) > + libmount >= 2.20 (from util-linux) (optional) > libkmod >= 15 (optional) > PAM >= 1.1.2 (optional) > libcryptsetup (optional) > diff --git a/configure.ac b/configure.ac > index 05fc00d..85ff053 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -426,6 +426,18 @@ fi > AM_CONDITIONAL(HAVE_BLKID, [test "$have_blkid" = "yes"]) > > # > ------------------------------------------------------------------------------ > +have_libmount=no > +AC_ARG_ENABLE(libmount, AS_HELP_STRING([--disable-libmount], [disable > libmount support])) > +if test "x$enable_libmount" != "xno"; then > + PKG_CHECK_MODULES(MOUNT, [ mount >= 2.20 ], > + [AC_DEFINE(HAVE_LIBMOUNT, 1, [Define if libmount is > available]) have_libmount=yes], have_libmount=no) > + if test "x$have_libmount" = xno -a "x$enable_libmount" = xyes; > then > + AC_MSG_ERROR([*** libmount support requested but > libraries not found]) > + fi > +fi > +AM_CONDITIONAL(HAVE_LIBMOUNT, [test "$have_libmount" = "yes"]) > + > +# > ------------------------------------------------------------------------------ > have_seccomp=no > AC_ARG_ENABLE(seccomp, AS_HELP_STRING([--disable-seccomp], [Disable > optional SECCOMP support])) > if test "x$enable_seccomp" != "xno"; then > @@ -1374,6 +1386,7 @@ AC_MSG_RESULT([ > efi: ${have_efi} > kmod: ${have_kmod} > blkid: ${have_blkid} > + libmount: ${have_libmount} > dbus: ${have_dbus} > nss-myhostname: ${have_myhostname} > gudev: ${enable_gudev} > diff --git a/src/core/build.h b/src/core/build.h > index d5e5550..5644693 100644 > --- a/src/core/build.h > +++ b/src/core/build.h > @@ -117,6 +117,12 @@ > #define _BLKID_FEATURE_ "-BLKID" > #endif > > +#ifdef HAVE_LIBMOUNT > +#define _LIBMOUNT_FEATURE_ "+LIBMOUNT" > +#else > +#define _LIBMOUNT_FEATURE_ "-LIBMOUNT" > +#endif > + > #ifdef HAVE_ELFUTILS > #define _ELFUTILS_FEATURE_ "+ELFUTILS" > #else > @@ -152,6 +158,7 @@ > _LZ4_FEATURE_ " " \ > _SECCOMP_FEATURE_ " " \ > _BLKID_FEATURE_ " " \ > + _LIBMOUNT_FEATURE_ " " \ > _ELFUTILS_FEATURE_ " " \ > _KMOD_FEATURE_ " " \ > _IDN_FEATURE_ " " > diff --git a/src/core/mount.c b/src/core/mount.c > index 8b787f6..a639515 100644 > --- a/src/core/mount.c > +++ b/src/core/mount.c > @@ -25,6 +25,12 @@ > #include <sys/epoll.h> > #include <signal.h> > > +#ifdef HAVE_LIBMOUNT > +#include <libmount.h> > +#else > +#define mnt_init_debug(m) do {} while (0) > +#endif > + > #include "manager.h" > #include "unit.h" > #include "mount.h" > @@ -1492,6 +1498,58 @@ fail: > return r; > } > > +#ifdef HAVE_LIBMOUNT > + > +static inline void mnt_free_table_p(struct libmnt_table **tb) { > + mnt_free_table(*tb); > +} > + > +static inline void mnt_free_iter_p(struct libmnt_iter **itr) { > + mnt_free_iter(*itr); > +} > + > +static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { > + _cleanup_(mnt_free_table_p) struct libmnt_table *tb = NULL; > + _cleanup_(mnt_free_iter_p) struct libmnt_iter *itr = NULL; > + struct libmnt_fs *fs; > + int r = 0; > + > + assert(m); > + > + tb = mnt_new_table(); > + itr = mnt_new_iter(MNT_ITER_FORWARD); > + if (!tb || !itr) > + return log_oom(); > + > + mnt_table_parse_mtab(tb, NULL); > + if (r) > + return r; > + > + while (mnt_table_next_fs(tb, itr, &fs) == 0) { > + const char *device, *path, *options, *fstype; > + _cleanup_free_ const char *d = NULL, *p = NULL; > + int k; > + > + device = mnt_fs_get_source(fs); > + path = mnt_fs_get_target(fs); > + options = mnt_fs_get_options(fs); > + fstype = mnt_fs_get_fstype(fs); > + > + d = cunescape(device); > + p = cunescape(path); > + if (!d || !p) > + return log_oom(); > + > + k = mount_add_one(m, d, p, options, fstype, set_flags); > + if (k < 0) > + r = k; > + } > + > + return r; > +} > + > +#else > + > static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { > int r = 0; > unsigned i; > @@ -1548,6 +1606,8 @@ static int mount_load_proc_self_mountinfo(Manager > *m, bool set_flags) { > return r; > } > > +#endif > + > static void mount_shutdown(Manager *m) { > assert(m); > > @@ -1577,6 +1637,8 @@ static int mount_enumerate(Manager *m) { > int r; > assert(m); > > + mnt_init_debug(0); > + > if (!m->proc_self_mountinfo) { > m->proc_self_mountinfo = fopen("/proc/self/mountinfo", > "re"); > if (!m->proc_self_mountinfo) > -- > 1.9.3 > > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel >
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel