dhcp: drop dhcpcanon support

Drop support for the "dhcpcanon" DHCP client. It's unmantained, as the
last code change was in 2018:

  https://github.com/juga0/dhcpcanon/commits

There is no need to first deprecate it because it was still marked as
"experimental" in NM. Also, it's not packaged by any recent distro, so
we can assume that nobody will miss it.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2112
This commit is contained in:
Beniamino Galvani
2025-01-15 16:44:37 +01:00
parent 79219553be
commit 98b124a661
11 changed files with 3 additions and 256 deletions

1
NEWS
View File

@@ -31,6 +31,7 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE!
DNS over TLS name servers.
* The initrd-generator understands the "rd.net.dns" option to configure
global name servers.
* Drop support for the "dhcpcanon" DHCP client.
=============================================
NetworkManager-1.50

View File

@@ -4,9 +4,6 @@
/* Define to path of dhclient binary */
#mesondefine DHCLIENT_PATH
/* Define to path of dhcpcanon binary */
#mesondefine DHCPCANON_PATH
/* Define to path of dhcpcd binary */
#mesondefine DHCPCD_PATH
@@ -224,9 +221,6 @@
/* Define if you have dhclient */
#mesondefine WITH_DHCLIENT
/* Define if you have dhcpcanon */
#mesondefine WITH_DHCPCANON
/* Define if you have dhcpcd */
#mesondefine WITH_DHCPCD

View File

@@ -602,7 +602,6 @@ Preferably use nmcli instead.
%else
-Ddhclient=no \
%endif
-Ddhcpcanon=no \
-Ddhcpcd=no \
-Dcrypto=gnutls \
%if %{with debug}

View File

@@ -369,7 +369,6 @@ meson setup\
-Dnft="${D_SBINDIR}/nft" \
-Diptables="${D_SBINDIR}/iptables" \
-Ddhclient="${D_SBINDIR}/dhclient" \
-Ddhcpcanon=no \
-Ddhcpcd=no \
-Dconfig_dhcp_default="$P_DHCP_DEFAULT" \
"-Dcrypto=$P_CRYPTO" \

View File

@@ -173,7 +173,6 @@ meson setup build \
-D teamdctl=$_WITH_LIBTEAM \
\
-D dhclient=/bin/nowhere/dhclient \
-D dhcpcanon=/bin/nowhere/dhcpcanon \
-D dhcpcd=/bin/nowhere/dhcpd \
\
-D netconfig=/bin/nowhere/netconfig \

View File

@@ -632,7 +632,7 @@ config_h.set10('WITH_OFONO', enable_ofono)
config_dhcp_default = get_option('config_dhcp_default')
config_h.set_quoted('NM_CONFIG_DEFAULT_MAIN_DHCP', config_dhcp_default)
dhcp_summary = ''
foreach client : [ 'dhclient', 'dhcpcd', 'dhcpcanon' ]
foreach client : [ 'dhclient', 'dhcpcd' ]
client_path = get_option(client)
client_enable = (client_path != 'no')
if client_enable

View File

@@ -58,9 +58,8 @@ option('config_dns_rc_manager_default', type: 'combo', choices: ['auto', 'symlin
# dhcp clients
option('dhclient', type: 'string', value: 'no', description: 'Enable dhclient support (deprecated)')
option('dhcpcanon', type: 'string', value: '', description: 'Enable dhcpcanon support (experimental)')
option('dhcpcd', type: 'string', value: '', description: 'Enable dhcpcd support')
option('config_dhcp_default', type: 'combo', choices: ['dhcpcanon', 'dhclient', 'dhcpcd', 'internal', 'nettools'], value: 'internal', description: 'Default configuration option for main.dhcp setting, used as fallback if the configuration option is unset')
option('config_dhcp_default', type: 'combo', choices: ['dhclient', 'dhcpcd', 'internal', 'nettools'], value: 'internal', description: 'Default configuration option for main.dhcp setting, used as fallback if the configuration option is unset')
# miscellaneous
option('introspection', type: 'boolean', value: true, description: 'Enable introspection for this build')

View File

@@ -311,7 +311,6 @@ typedef struct {
GType nm_dhcp_nettools_get_type(void);
extern const NMDhcpClientFactory _nm_dhcp_client_factory_dhcpcanon;
extern const NMDhcpClientFactory _nm_dhcp_client_factory_dhclient;
extern const NMDhcpClientFactory _nm_dhcp_client_factory_dhcpcd;
extern const NMDhcpClientFactory _nm_dhcp_client_factory_internal;

View File

@@ -1,239 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2017 juga <juga at riseup dot net>
*/
#include "src/core/nm-default-daemon.h"
#if WITH_DHCPCANON
#include <stdlib.h>
#include <unistd.h>
#include "nm-utils.h"
#include "nm-dhcp-manager.h"
#include "NetworkManagerUtils.h"
#include "nm-dhcp-listener.h"
#include "nm-dhcp-client-logging.h"
#define NM_TYPE_DHCP_DHCPCANON (nm_dhcp_dhcpcanon_get_type())
#define NM_DHCP_DHCPCANON(obj) \
(_NM_G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanon))
#define NM_DHCP_DHCPCANON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanonClass))
#define NM_IS_DHCP_DHCPCANON(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DHCP_DHCPCANON))
#define NM_IS_DHCP_DHCPCANON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DHCP_DHCPCANON))
#define NM_DHCP_DHCPCANON_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_DHCPCANON, NMDhcpDhcpcanonClass))
typedef struct _NMDhcpDhcpcanon NMDhcpDhcpcanon;
typedef struct _NMDhcpDhcpcanonClass NMDhcpDhcpcanonClass;
static GType nm_dhcp_dhcpcanon_get_type(void);
/*****************************************************************************/
typedef struct {
char *conf_file;
const char *def_leasefile;
char *lease_file;
char *pid_file;
NMDhcpListener *dhcp_listener;
} NMDhcpDhcpcanonPrivate;
struct _NMDhcpDhcpcanon {
NMDhcpClient parent;
NMDhcpDhcpcanonPrivate _priv;
};
struct _NMDhcpDhcpcanonClass {
NMDhcpClientClass parent;
};
G_DEFINE_TYPE(NMDhcpDhcpcanon, nm_dhcp_dhcpcanon, NM_TYPE_DHCP_CLIENT)
#define NM_DHCP_DHCPCANON_GET_PRIVATE(self) \
_NM_GET_PRIVATE(self, NMDhcpDhcpcanon, NM_IS_DHCP_DHCPCANON)
/*****************************************************************************/
static const char *
nm_dhcp_dhcpcanon_get_path(void)
{
return nm_utils_find_helper("dhcpcanon", DHCPCANON_PATH, NULL);
}
static gboolean
dhcpcanon_start(NMDhcpClient *client,
const char *mode_opt,
GBytes *duid,
gboolean release,
pid_t *out_pid,
guint needed_prefixes,
GError **error)
{
NMDhcpDhcpcanon *self = NM_DHCP_DHCPCANON(client);
NMDhcpDhcpcanonPrivate *priv = NM_DHCP_DHCPCANON_GET_PRIVATE(self);
gs_unref_ptrarray GPtrArray *argv = NULL;
pid_t pid;
gs_free_error GError *local = NULL;
const char *iface;
const char *system_bus_address;
const char *dhcpcanon_path;
gs_free char *binary_name = NULL;
gs_free char *pid_file = NULL;
gs_free char *system_bus_address_env = NULL;
int addr_family;
g_return_val_if_fail(!priv->pid_file, FALSE);
iface = nm_dhcp_client_get_iface(client);
addr_family = nm_dhcp_client_get_addr_family(client);
dhcpcanon_path = nm_dhcp_dhcpcanon_get_path();
if (!dhcpcanon_path) {
nm_utils_error_set_literal(error, NM_UTILS_ERROR_UNKNOWN, "dhcpcanon binary not found");
return FALSE;
}
_LOGD("dhcpcanon_path: %s", dhcpcanon_path);
pid_file = g_strdup_printf(RUNSTATEDIR "/dhcpcanon%c-%s.pid",
nm_utils_addr_family_to_char(addr_family),
iface);
_LOGD("pid_file: %s", pid_file);
/* Kill any existing dhcpcanon from the pidfile */
binary_name = g_path_get_basename(dhcpcanon_path);
nm_dhcp_client_stop_existing(pid_file, binary_name);
argv = g_ptr_array_new();
g_ptr_array_add(argv, (gpointer) dhcpcanon_path);
g_ptr_array_add(argv, (gpointer) "-sf"); /* Set script file */
g_ptr_array_add(argv, (gpointer) nm_dhcp_helper_path);
g_ptr_array_add(argv, (gpointer) "-pf"); /* Set pid file */
g_ptr_array_add(argv, (gpointer) pid_file);
if (priv->conf_file) {
g_ptr_array_add(argv, (gpointer) "-cf"); /* Set interface config file */
g_ptr_array_add(argv, (gpointer) priv->conf_file);
}
/* Usually the system bus address is well-known; but if it's supposed
* to be something else, we need to push it to dhcpcanon, since dhcpcanon
* sanitizes the environment it gives the action scripts.
*/
system_bus_address = getenv("DBUS_SYSTEM_BUS_ADDRESS");
if (system_bus_address) {
system_bus_address_env = g_strdup_printf("DBUS_SYSTEM_BUS_ADDRESS=%s", system_bus_address);
g_ptr_array_add(argv, (gpointer) "-e");
g_ptr_array_add(argv, (gpointer) system_bus_address_env);
}
g_ptr_array_add(argv, (gpointer) iface);
g_ptr_array_add(argv, NULL);
if (!g_spawn_async(NULL,
(char **) argv->pdata,
NULL,
G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_STDOUT_TO_DEV_NULL
| G_SPAWN_STDERR_TO_DEV_NULL,
nm_utils_setpgid,
NULL,
&pid,
&local)) {
nm_utils_error_set(error,
NM_UTILS_ERROR_UNKNOWN,
"dhcpcanon failed to start: %s",
local->message);
return FALSE;
}
nm_assert(pid > 0);
_LOGI("dhcpcanon started with pid %d", pid);
nm_dhcp_client_watch_child(client, pid);
priv->pid_file = g_steal_pointer(&pid_file);
return TRUE;
}
static gboolean
ip4_start(NMDhcpClient *client, GError **error)
{
return dhcpcanon_start(client, NULL, NULL, FALSE, NULL, 0, error);
}
static void
stop(NMDhcpClient *client, gboolean release)
{
NMDhcpDhcpcanon *self = NM_DHCP_DHCPCANON(client);
NMDhcpDhcpcanonPrivate *priv = NM_DHCP_DHCPCANON_GET_PRIVATE(self);
int errsv;
NM_DHCP_CLIENT_CLASS(nm_dhcp_dhcpcanon_parent_class)->stop(client, release);
if (priv->pid_file) {
if (remove(priv->pid_file) == -1) {
errsv = errno;
_LOGD("could not remove dhcp pid file \"%s\": %d (%s)",
priv->pid_file,
errsv,
nm_strerror_native(errsv));
}
g_free(priv->pid_file);
priv->pid_file = NULL;
}
}
/*****************************************************************************/
static void
nm_dhcp_dhcpcanon_init(NMDhcpDhcpcanon *self)
{
NMDhcpDhcpcanonPrivate *priv = NM_DHCP_DHCPCANON_GET_PRIVATE(self);
priv->dhcp_listener = g_object_ref(nm_dhcp_listener_get());
g_signal_connect(priv->dhcp_listener,
NM_DHCP_LISTENER_EVENT,
G_CALLBACK(nm_dhcp_client_handle_event),
self);
}
static void
dispose(GObject *object)
{
NMDhcpDhcpcanonPrivate *priv = NM_DHCP_DHCPCANON_GET_PRIVATE(object);
if (priv->dhcp_listener) {
g_signal_handlers_disconnect_by_func(priv->dhcp_listener,
G_CALLBACK(nm_dhcp_client_handle_event),
NM_DHCP_DHCPCANON(object));
g_clear_object(&priv->dhcp_listener);
}
nm_clear_g_free(&priv->pid_file);
G_OBJECT_CLASS(nm_dhcp_dhcpcanon_parent_class)->dispose(object);
}
static void
nm_dhcp_dhcpcanon_class_init(NMDhcpDhcpcanonClass *dhcpcanon_class)
{
NMDhcpClientClass *client_class = NM_DHCP_CLIENT_CLASS(dhcpcanon_class);
GObjectClass *object_class = G_OBJECT_CLASS(dhcpcanon_class);
object_class->dispose = dispose;
client_class->ip4_start = ip4_start;
client_class->stop = stop;
}
const NMDhcpClientFactory _nm_dhcp_client_factory_dhcpcanon = {
.name = "dhcpcanon",
.get_type_4 = nm_dhcp_dhcpcanon_get_type,
.get_path = nm_dhcp_dhcpcanon_get_path,
};
#endif /* WITH_DHCPCANON */

View File

@@ -31,9 +31,6 @@ const NMDhcpClientFactory *const _nm_dhcp_manager_factories[6] = {
* the first available plugin. */
&_nm_dhcp_client_factory_internal,
#if WITH_DHCPCANON
&_nm_dhcp_client_factory_dhcpcanon,
#endif
#if WITH_DHCPCD
&_nm_dhcp_client_factory_dhcpcd,
#endif

View File

@@ -120,7 +120,6 @@ libNetworkManager = static_library(
'devices/nm-lldp-listener.c',
'dhcp/nm-dhcp-dhclient.c',
'dhcp/nm-dhcp-dhclient-utils.c',
'dhcp/nm-dhcp-dhcpcanon.c',
'dhcp/nm-dhcp-dhcpcd.c',
'dhcp/nm-dhcp-listener.c',
'dns/nm-dns-dnsmasq.c',