1. 26 Sep, 2019 13 commits
    • Beniamino Galvani's avatar
      dhcp: systemd: support DHCPv6 prefix delegation · 57211a06
      Beniamino Galvani authored
      Add support to the internal DHCP client for requesting a prefix and
      distributing it to interfaces with 'shared' IPv6 mode.
      
      The systemd-networkd API currently allows to request only a single
      prefix and so there will be issues when the number of downstream
      interfaces is greater than the number of /64 subnets available in the
      returned prefix; but this is still an improvement over the previous
      situation when no prefix was requested at all.
      
      #247
      57211a06
    • Thomas Haller's avatar
      clients/tests: skip client tests with python 3.8-beta · d7b99066
      Thomas Haller authored
      It's unclear how to workaround this issue, so that the tests
      work with older python versions and 3.8-beta.
      
      Let's wait whether this will really be released as 3.8 and
      for now just skip the test.
      d7b99066
    • Thomas Haller's avatar
      dns: merge branch 'th/dnsmasq-rework' · 35c83138
      Thomas Haller authored
      !254
      35c83138
    • Thomas Haller's avatar
      dns: move ratelimiting and restart from NMDnsManager to NMDnsDnsmasq · 93d5efb4
      Thomas Haller authored
      Note that the only DNS plugin that actually emits the FAILED signal was
      NMDnsDnsmasq. Let's not handle restart, retry and rate-limiting by
      NMDnsManager but by NMDnsDnsmasq itself.
      
      There are three goals here:
      
      (1) we want that when dnsmasq (infrequently) crashes, that we always keep
        retrying. A random crash should be automatically resolved and
        eventually dnsmasq should be working again.
        Note that we anyway cannot fully detect whether something is wrong.
        OK, we detect crashes, but if dnsmasq just gets catatonic, it's just
        as broken. Point being: our ability to detect non-working dnsmasq is limited.
      
      (2) when dnsmasq keeps crashing all the time, then rate limit the retry.
        Of course, at this point there is already something seriously wrong,
        but we shouldn't kill the system by respawning the process without rate
        limiting.
      
      (3) previously, when NMDnsManager noticed that the pluging was broken
        (and rate-limiting kicked in), it would temporarily disable the plugin.
        Basically, that meant to write the real name servers to /etc/resolv.conf
        directly, instead of setting localhost. This partly conflicts with
        (1), because we want to retry and recover automatically. So what good
        is it to notice a problem, resort to plain /etc/resolv.conf for a
        short time, and then run into the issues again? If something is really
        broken, there is no way but to involve the user to investigate and
        fix the issue. Hence, we don't need to concern NMDnsManager with this either.
        The only thing that the manager notices is when the dnsmasq binary is not
        available. In that case, update() fails right away, and the manager falls back
        to configure the name servers in /etc/resolv.conf directly.
      
      Also, change the backoff time from 5 minutes to 1 minute (twice the
      burst interval). There is not particularly strong reason for either
      choice, I think that if the ratelimit kicks in, then something is
      already so wrong that it doesn't matter either way. Anyway, also 60
      seconds is long enough to not kill the machine otherwise.
      93d5efb4
    • Thomas Haller's avatar
      dns/dnsmasq: refactor tracking of dnsmasq process · a780b048
      Thomas Haller authored
      Several points.
      
      - We spawn the dnsmasq process directly. That has several downsides:
      
        - The lifetime of the process is tied to NetworkManager's. When
          stopping NetworkManager, we usually also stop dnsmasq. Or we keep
          the process running, but later the process is no longer a child process
          of NetworkManager and we can only kill it using the pidfile.
      
        - We don't do special sandboxing of the dnsmasq process.
      
      - Note that we want to ensure that only one dnsmasq process is running
      at any time. We should track that in a singletone. Note that NMDnsDnsmasq
      is not a singleton. While there is only one instance active at any time,
      the DNS plugin can be swapped (e.g. during SIGHUP). Hence, don't track the
      process per-NMDnsDnsmasq instance, but in a global variable "gl_pid".
      
      - Usually, when NetworkManager quits, it also stops the dnsmasq process.
      Previously, we would always try to terminate the process based on the
      pidfile. That is wrong. Most of the time, NetworkManager spawned the
      process itself, as a child process. Hence, the PID is known and NetworkManager
      will get a signal when dnsmasq exits. The only moment when NetworkManager should
      use the pidfile, is the first time when checking to kill the previous instance.
      That is: only once at the beginning, to kill instances that were
      intentionally or unintentionally (crash) left running earlier.
      This is now done by _gl_pid_kill_external().
      
      - Previously, before starting a new dnsmasq instance we would kill a
      possibly already running one, and block while waiting for the process to
      disappear. We should never block. Especially, since we afterwards start
      the process also in non-blocking way, there is no reason to kill the
      existing process in a blocking way. For the most part, starting dnsmasq
      is already asynchronous and so should be the killing of the dnsmasq
      process.
      
      - Drop GDBusProxy and only use GDBusConnection. It fully suffices.
      
      - When we kill a dnsmasq instance, we actually don't have to wait at
      all. That can happen fully in background. The only pecularity is that
      when we restart a new instance before the previous instance is killed,
      then we must wait for the previous process to terminate first. Also, if
      we are about to exit while killing the dnsmasq instance, we must register
      nm_shutdown_wait_obj_*() to wait until the process is fully gone.
      a780b048
    • Thomas Haller's avatar
      dns: move PID handling from NMDnsPlugin to NMDnsDnsmasq implementation · b288ea13
      Thomas Haller authored
      We only have two real DNS plugins: "dnsmasq" and "systemd-resolved" (the "unbound"
      plugin is very incomplete and should eventually be dropped).
      
      Of these two, only "dnsmasq" spawns a child process. A lot of the logic
      for that is in the parent class NMDnsPlugin, with the purpose for that
      logic to be reusable.
      
      However:
      
       - We are unlikely to add more DNS plugins. Especially because
         systemd-resolved seems the way forward.
      
       - If we happen to add more plugins, then probably NetworkManager
         should not spawn the process itself. That causes problems with
         restarting the service. Rather, we should let the service manager
         handle the lifetime of such "child" processes. Aside separating
         the lifetime of the DNS plugin process from NetworkManager's,
         this also would allow to sandbox NetworkManager and the DNS plugin
         differently. Currently, NetworkManager itself may might need
         capabilities only to pass them on to the DNS plugin, or (more likely)
         NetworkManager would want to drop additional capabilities for the
         DNS plugin (which we would rather not implement ourself, since that
         seems job of the service management already).
      
       - The current implementation is far from beautiful. For example,
         it does synchronous (blocking) killing of the running process
         from the PID file, and it uses PID fils. This is not something
         we would want to reuse for other plugins. Also, note that
         dnsmasq already spawns the service asynchronosly (of course).
         Hence, we should also kill it asynchronously, but that is complicated
         by having the logic separated in two different classes while
         providing an abstract API between the two.
      
      Move the code to NMDnsDnsmasq. This is the only place that cares about
      this. Also, that makes it actually clearer what is happening, by seeing
      the lifetime handling of the child proceess all in one place.
      b288ea13
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      dns: return error reason from nm_dns_plugin_update() · 2223fcd9
      Thomas Haller authored
      For logging, if the plugin fails with update, it should return a reason
      that we can log.
      
      Note that both dnsmasq and system-resolved plugins do the update asynchronously
      (of course). Hence, usually they never fail right away, and there isn't really
      possibility to handle the failure later. Still, we should print something sensible
      for that we need information what went wrong.
      2223fcd9
    • Thomas Haller's avatar
      dns: drop get_name() and is_caching() virtual functions for klass variables · 807fd682
      Thomas Haller authored
      The plugin name and whether a plugin is caching only depends on the type,
      it does not require a virtual function where types would decided depending
      on other reasons.
      
      Convert the virtual functions into fields of the class.
      807fd682
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      core: extend nm_shutdown_wait_obj_*() to support waiting with explicit unregister · 8d890e27
      Thomas Haller authored
      The previous to wait-types (NM_SHUTDOWN_WAIT_TYPE_OBJECT and
      NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE) both required a GObject/GCancellable,
      and the shutdown was automatically unblocked when the object got
      destroyed.
      
      Add another wait type NM_SHUTDOWN_WAIT_TYPE_HANDLE, which does not take
      an object to wait. Instead, shutdown is indefinitely blocked, until the
      user unregisters the handle again. While other wait-types allow to
      ignore the handle, this wait-type only makes sense if the user keeps
      track of the handle.
      8d890e27
    • Thomas Haller's avatar
      shared: add compat macro for G_PID_FORMAT · b6acec0f
      Thomas Haller authored
      Having G_PID_FORMAT macro is useful, but it's only available in
      recent glib versions. Add a compat implementation and a test that
      our assumptions hold.
      b6acec0f
    • Thomas Haller's avatar
      release: bump version to 1.21.2-dev · e2846081
      Thomas Haller authored
      e2846081
  2. 25 Sep, 2019 16 commits
    • Thomas Haller's avatar
      supplicant: fix rework condition in nm_supplicant_config_add_bgscan() · a4b7b053
      Thomas Haller authored
      Ups, sorry.
      
      Fixes: 6fc37cb7 ('supplicant: rework condition in nm_supplicant_config_add_bgscan()')
      a4b7b053
    • Thomas Haller's avatar
      supplicant: rework condition in nm_supplicant_config_add_bgscan() · 6fc37cb7
      Thomas Haller authored
      Avoid the duplicate condition.
      
      Also, fix indentation/whitespace.
      
      No change in behavior.
      6fc37cb7
    • Lubomir Rintel's avatar
    • Kristian Klausen's avatar
      wifi: roam aggressively if we on a multi-AP network · 0f320333
      Kristian Klausen authored
      A multi-AP network isn't always WPA Enterprise or Dynamic WEP.
      I have seen multi-AP WPA-PSK networks, so lets try to detect them
      and use a shorter bgscan interval. We can detect them by checking
      if seen-bssids > 1.
      
      !279
      #248
      0f320333
    • Thomas Haller's avatar
      18f890d4
    • Thomas Haller's avatar
      gitlab-ci: add building on Fedora 31 · b40a3aa7
      Thomas Haller authored
      And don't build Fedora 28 by default. It's aleady end of life.
      But for now keep it, so it can be triggered manually.
      b40a3aa7
    • Thomas Haller's avatar
      build/meson: use python3 interpreter for "generate-setting-docs.py" · 7c7ad978
      Thomas Haller authored
      Fedora 32 drops "python" from the path. Hence "/usr/bin/env python" won't
      work anymore. Of course, who needs a way to invoke the interpreter that works
      accross different distributions! WTF.
      
      In this case, easy to work around. We run it from meson, so we have access to
      the Python 3 binary. Just call python explicitly, like we do with autotools.
      7c7ad978
    • Thomas Haller's avatar
      contrib/rpm: drop BuildRequires to deprecated "wireless-tools-devel" · 9fc44905
      Thomas Haller authored
      "wireless-tools-devel" is long depreacted and not used by
      NetworkManager, not even for WEXT.
      
      Drop it from the build dependencies.
      9fc44905
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      tests: don't install unnecessary package in gitlab-ci tests · 1a2a5b37
      Thomas Haller authored
      REQUIRED_PACKAGES has two uses:
      
       - to setup a system for developing NetworkManager. This installs
         convenience packages like "cscope".
      
       - to install the packages required for unit testing in gitlab-ci.
      
      For gitlab-ci we should only install the packages that we actually
      need.
      1a2a5b37
    • Thomas Haller's avatar
      tests: fix failure installing non-existing packages in REQUIRED_PACKAGES · 18556755
      Thomas Haller authored
      Previously, dnf/yum used to ignore packages that didn't exist.
      In Fedora 32, dnf starts to fail the entire command:
      
        No match for argument: python-gobject-base
        Error: Unable to find a match: python-gobject-base
      
      Since this script is supposed to work with different RHEL/Fedora
      versions, it's expected that not all packages are available everywhere.
      
      Fix that, by installing packages that we know that they might be missing
      one by one (and ignore the error).
      18556755
    • Thomas Haller's avatar
      tests: fix "clients/tests/test-client.py" concatenating binary for Python 3 · 97646d81
      Thomas Haller authored
      Python 3 doesn't like this:
      
          ======================================================================
          ERROR: test_001 (__main__.TestNmcli)
          ----------------------------------------------------------------------
          Traceback (most recent call last):
            File "./clients/tests/test-client.py", line 785, in f
              self._nm_test_post()
            File "./clients/tests/test-client.py", line 767, in _nm_test_post
              content_new = ''.join([r['content'] for r in results])
          TypeError: sequence item 0: expected str instance, bytes found
      97646d81
    • Thomas Haller's avatar
      tests: don't compare string literal with "is" in "clients/tests/test-client.py" · 989b26a8
      Thomas Haller authored
      Recent Python versions warn about this:
      
        ./clients/tests/test-client.py:569: SyntaxWarning: "is" with a literal. Did you mean "=="?
          elif lang is de:
        ./clients/tests/test-client.py:572: SyntaxWarning: "is" with a literal. Did you mean "=="?
          elif lang is pl:
      
      And rightly so: https://bugs.python.org/issue34850
      989b26a8
    • Thomas Haller's avatar
      tests: avoid deprecated GLib.IOChannel.add_watch() in "test-networkmanager-service.py" · ceae05cc
      Thomas Haller authored
      test_001 (__main__.TestNmcli) ... /tmp/NetworkManager/tools/test-networkmanager-service.py:2346: PyGIDeprecationWarning: add_watch is deprecated; use GLib.io_add_watch() instead
        id1 = GLib.IOChannel(0).add_watch(GLib.IOCondition.HUP,
      ceae05cc
    • Thomas Haller's avatar
      systemd: merge branch systemd into master · 85bdf421
      Thomas Haller authored
      85bdf421
    • Thomas Haller's avatar
      systemd: update code from upstream (2019-09-24) · 503b5f44
      Thomas Haller authored
      This is a direct dump from systemd git.
      
      ======
      
      SYSTEMD_DIR=../systemd
      COMMIT=a007d6fc2a2b9c19bafd6465fb4f00910b824c36
      
      (
        cd "$SYSTEMD_DIR"
        git checkout "$COMMIT"
        git reset --hard
        git clean -fdx
      )
      
      git ls-files -z :/src/systemd/src/ \
                      :/shared/systemd/src/ \
                      :/shared/nm-utils/unaligned.h | \
        xargs -0 rm -f
      
      nm_copy_sd_shared() {
          mkdir -p "./shared/systemd/$(dirname "$1")"
          cp "$SYSTEMD_DIR/$1" "./shared/systemd/$1"
      }
      
      nm_copy_sd_core() {
          mkdir -p "./src/systemd/$(dirname "$1")"
          cp "$SYSTEMD_DIR/$1" "./src/systemd/$1"
      }
      
      nm_copy_sd_nmutils() {
          mkdir -p "./shared/nm-utils/"
          cp "$SYSTEMD_DIR/$1" "./shared/nm-utils/${1##*/}"
      }
      
      nm_copy_sd_core "src/libsystemd-network/arp-util.c"
      nm_copy_sd_core "src/libsystemd-network/arp-util.h"
      nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.c"
      nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.h"
      nm_copy_sd_core "src/libsystemd-network/dhcp-internal.h"
      nm_copy_sd_core "src/libsystemd-network/dhcp-lease-internal.h"
      nm_copy_sd_core "src/libsystemd-network/dhcp-network.c"
      nm_copy_sd_core "src/libsystemd-network/dhcp-option.c"
      nm_copy_sd_core "src/libsystemd-network/dhcp-packet.c"
      nm_copy_sd_core "src/libsystemd-network/dhcp-protocol.h"
      nm_copy_sd_core "src/libsystemd-network/dhcp6-internal.h"
      nm_copy_sd_core "src/libsystemd-network/dhcp6-lease-internal.h"
      nm_copy_sd_core "src/libsystemd-network/dhcp6-network.c"
      nm_copy_sd_core "src/libsystemd-network/dhcp6-option.c"
      nm_copy_sd_core "src/libsystemd-network/dhcp6-protocol.h"
      nm_copy_sd_core "src/libsystemd-network/lldp-internal.h"
      nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.c"
      nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.h"
      nm_copy_sd_core "src/libsystemd-network/lldp-network.c"
      nm_copy_sd_core "src/libsystemd-network/lldp-network.h"
      nm_copy_sd_core "src/libsystemd-network/network-internal.c"
      nm_copy_sd_core "src/libsystemd-network/network-internal.h"
      nm_copy_sd_core "src/libsystemd-network/sd-dhcp-client.c"
      nm_copy_sd_core "src/libsystemd-network/sd-dhcp-lease.c"
      nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-client.c"
      nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-lease.c"
      nm_copy_sd_core "src/libsystemd-network/sd-ipv4acd.c"
      nm_copy_sd_core "src/libsystemd-network/sd-ipv4ll.c"
      nm_copy_sd_core "src/libsystemd-network/sd-lldp.c"
      nm_copy_sd_core "src/libsystemd/sd-event/event-source.h"
      nm_copy_sd_core "src/libsystemd/sd-event/event-util.c"
      nm_copy_sd_core "src/libsystemd/sd-event/event-util.h"
      nm_copy_sd_core "src/libsystemd/sd-event/sd-event.c"
      nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.c"
      nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.h"
      nm_copy_sd_core "src/libsystemd/sd-id128/sd-id128.c"
      nm_copy_sd_core "src/systemd/_sd-common.h"
      nm_copy_sd_core "src/systemd/sd-dhcp-client.h"
      nm_copy_sd_core "src/systemd/sd-dhcp-lease.h"
      nm_copy_sd_core "src/systemd/sd-dhcp6-client.h"
      nm_copy_sd_core "src/systemd/sd-dhcp6-lease.h"
      nm_copy_sd_core "src/systemd/sd-event.h"
      nm_copy_sd_core "src/systemd/sd-id128.h"
      nm_copy_sd_core "src/systemd/sd-ipv4acd.h"
      nm_copy_sd_core "src/systemd/sd-ipv4ll.h"
      nm_copy_sd_core "src/systemd/sd-lldp.h"
      nm_copy_sd_core "src/systemd/sd-ndisc.h"
      nm_copy_sd_nmutils "src/basic/unaligned.h"
      nm_copy_sd_shared "src/basic/alloc-util.c"
      nm_copy_sd_shared "src/basic/alloc-util.h"
      nm_copy_sd_shared "src/basic/async.h"
      nm_copy_sd_shared "src/basic/env-file.c"
      nm_copy_sd_shared "src/basic/env-file.h"
      nm_copy_sd_shared "src/basic/env-util.c"
      nm_copy_sd_shared "src/basic/env-util.h"
      nm_copy_sd_shared "src/basic/errno-util.h"
      nm_copy_sd_shared "src/basic/escape.c"
      nm_copy_sd_shared "src/basic/escape.h"
      nm_copy_sd_shared "src/basic/ether-addr-util.c"
      nm_copy_sd_shared "src/basic/ether-addr-util.h"
      nm_copy_sd_shared "src/basic/extract-word.c"
      nm_copy_sd_shared "src/basic/extract-word.h"
      nm_copy_sd_shared "src/basic/fd-util.c"
      nm_copy_sd_shared "src/basic/fd-util.h"
      nm_copy_sd_shared "src/basic/fileio.c"
      nm_copy_sd_shared "src/basic/fileio.h"
      nm_copy_sd_shared "src/basic/format-util.c"
      nm_copy_sd_shared "src/basic/format-util.h"
      nm_copy_sd_shared "src/basic/fs-util.c"
      nm_copy_sd_shared "src/basic/fs-util.h"
      nm_copy_sd_shared "src/basic/hash-funcs.c"
      nm_copy_sd_shared "src/basic/hash-funcs.h"
      nm_copy_sd_shared "src/basic/hashmap.c"
      nm_copy_sd_shared "src/basic/hashmap.h"
      nm_copy_sd_shared "src/basic/hexdecoct.c"
      nm_copy_sd_shared "src/basic/hexdecoct.h"
      nm_copy_sd_shared "src/basic/hostname-util.c"
      nm_copy_sd_shared "src/basic/hostname-util.h"
      nm_copy_sd_shared "src/basic/in-addr-util.c"
      nm_copy_sd_shared "src/basic/in-addr-util.h"
      nm_copy_sd_shared "src/basic/io-util.c"
      nm_copy_sd_shared "src/basic/io-util.h"
      nm_copy_sd_shared "src/basic/list.h"
      nm_copy_sd_shared "src/basic/log.h"
      nm_copy_sd_shared "src/basic/macro.h"
      nm_copy_sd_shared "src/basic/memory-util.c"
      nm_copy_sd_shared "src/basic/memory-util.h"
      nm_copy_sd_shared "src/basic/mempool.c"
      nm_copy_sd_shared "src/basic/mempool.h"
      nm_copy_sd_shared "src/basic/missing_fcntl.h"
      nm_copy_sd_shared "src/basic/missing_socket.h"
      nm_copy_sd_shared "src/basic/missing_stat.h"
      nm_copy_sd_shared "src/basic/missing_type.h"
      nm_copy_sd_shared "src/basic/parse-util.c"
      nm_copy_sd_shared "src/basic/parse-util.h"
      nm_copy_sd_shared "src/basic/path-util.c"
      nm_copy_sd_shared "src/basic/path-util.h"
      nm_copy_sd_shared "src/basic/prioq.c"
      nm_copy_sd_shared "src/basic/prioq.h"
      nm_copy_sd_shared "src/basic/process-util.c"
      nm_copy_sd_shared "src/basic/process-util.h"
      nm_copy_sd_shared "src/basic/random-util.c"
      nm_copy_sd_shared "src/basic/random-util.h"
      nm_copy_sd_shared "src/basic/set.h"
      nm_copy_sd_shared "src/basic/signal-util.h"
      nm_copy_sd_shared "src/basic/siphash24.h"
      nm_copy_sd_shared "src/basic/socket-util.c"
      nm_copy_sd_shared "src/basic/socket-util.h"
      nm_copy_sd_shared "src/basic/sort-util.h"
      nm_copy_sd_shared "src/basic/sparse-endian.h"
      nm_copy_sd_shared "src/basic/stat-util.c"
      nm_copy_sd_shared "src/basic/stat-util.h"
      nm_copy_sd_shared "src/basic/stdio-util.h"
      nm_copy_sd_shared "src/basic/string-table.c"
      nm_copy_sd_shared "src/basic/string-table.h"
      nm_copy_sd_shared "src/basic/string-util.c"
      nm_copy_sd_shared "src/basic/string-util.h"
      nm_copy_sd_shared "src/basic/strv.c"
      nm_copy_sd_shared "src/basic/strv.h"
      nm_copy_sd_shared "src/basic/strxcpyx.c"
      nm_copy_sd_shared "src/basic/strxcpyx.h"
      nm_copy_sd_shared "src/basic/time-util.c"
      nm_copy_sd_shared "src/basic/time-util.h"
      nm_copy_sd_shared "src/basic/tmpfile-util.c"
      nm_copy_sd_shared "src/basic/tmpfile-util.h"
      nm_copy_sd_shared "src/basic/umask-util.h"
      nm_copy_sd_shared "src/basic/utf8.c"
      nm_copy_sd_shared "src/basic/utf8.h"
      nm_copy_sd_shared "src/basic/util.c"
      nm_copy_sd_shared "src/basic/util.h"
      nm_copy_sd_shared "src/shared/dns-domain.c"
      nm_copy_sd_shared "src/shared/dns-domain.h"
      503b5f44
  3. 24 Sep, 2019 2 commits
    • Beniamino Galvani's avatar
      settings: fix updating agent-owned VPN secrets · 43b7e669
      Beniamino Galvani authored
      property_to_dbus() returns NULL when called with
      NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED and the property is
      not an agent-owned secrets. The function doesn't handle VPN secrets
      correctly, since they are all stored as a hash in the vpn.secrets
      property and the flag for each of them is a matching '*-flags' key in
      the vpn.data property. VPN secrets must be handled differently; do it
      in the VPN setting to_dbus_fcn() function.
      
      Fixes: 71928a3e ('settings: avoid cloning the connection to maintain agent-owned secrets')
      
      #230
      !280
      43b7e669
    • Beniamino Galvani's avatar
      build: avoid target redefinition · a79572c2
      Beniamino Galvani authored
       Makefile.am:3462: warning: $(src_devices_bluetooth_libnm_device_plugin_bluetooth_la_OBJECTS) was already defined in condition TRUE, which includes condition WITH_MODEM_MANAGER_1 ...
       Makefile.am:960: ... '$(src_devices_bluetooth_libnm_device_plugin_bluetooth_la_OBJECTS)' previously defined here
      
      Fixes: 878d4963 ('bluetooth/tests: add "nm-bt-test helper" program for manual testing of bluetooth code')
      a79572c2
  4. 23 Sep, 2019 9 commits