summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-09-11 12:28:12 -0500
committerDan Williams <dcbw@redhat.com>2014-09-11 12:28:12 -0500
commit3382d3e1a2d5bf893ad5721eedad3a554e04f995 (patch)
tree5568b0451a3355f550f0711006158188e7035c88
parent053c8fa5df1b2df552d83d90ac75a3bfff3fa869 (diff)
parent005cb2fc35e2c3d343e33de05a09e53fad608dc5 (diff)
downloadNetworkManager-3382d3e1a2d5bf893ad5721eedad3a554e04f995.tar.gz
merge: consolidate searching for helper programs (bgo #734131)
https://bugzilla.gnome.org/show_bug.cgi?id=734131
-rw-r--r--configure.ac6
-rw-r--r--src/Makefile.am1
-rw-r--r--src/NetworkManagerUtils.c50
-rw-r--r--src/NetworkManagerUtils.h4
-rw-r--r--src/devices/nm-device.c40
-rw-r--r--src/devices/team/nm-device-team.c21
-rw-r--r--src/dhcp-manager/nm-dhcp-dhclient.c39
-rw-r--r--src/dhcp-manager/nm-dhcp-dhclient.h2
-rw-r--r--src/dhcp-manager/nm-dhcp-dhcpcd.c40
-rw-r--r--src/dhcp-manager/nm-dhcp-dhcpcd.h2
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.c27
-rw-r--r--src/dns-manager/nm-dns-dnsmasq.c30
-rw-r--r--src/dnsmasq-manager/nm-dnsmasq-manager.c43
-rw-r--r--src/nm-dcb.c39
-rw-r--r--src/ppp-manager/nm-ppp-manager.c46
15 files changed, 149 insertions, 241 deletions
diff --git a/configure.ac b/configure.ac
index 23898c3bbb..4add1fd65e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -643,10 +643,16 @@ if test "$with_dhclient" = "no" -a "$with_dhcpcd" = "no"; then
fi
# Add substitutions
if test "$with_dhclient" != "no"; then
+ AC_DEFINE(WITH_DHCLIENT, TRUE, [Define if you have dhclient])
AC_SUBST(DHCLIENT_PATH, $with_dhclient)
+else
+ AC_DEFINE(WITH_DHCLIENT, FALSE, [Define if you have dhclient])
fi
if test "$with_dhcpcd" != "no"; then
+ AC_DEFINE(WITH_DHCPCD, TRUE, [Define if you have dhcpcd])
AC_SUBST(DHCPCD_PATH, $with_dhcpcd)
+else
+ AC_DEFINE(WITH_DHCPCD, FALSE, [Define if you have dhcpcd])
fi
# resolvconf and netconfig support
diff --git a/src/Makefile.am b/src/Makefile.am
index 1d9ba94435..ae4f26768e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -40,6 +40,7 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/libnm-core \
-I$(top_builddir)/libnm-core \
-I$(top_srcdir)/callouts \
+ -DPREFIX=\"$(prefix)\" \
-DG_LOG_DOMAIN=\""NetworkManager"\" \
-DNETWORKMANAGER_COMPILATION \
-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index 525154009e..b665984fe0 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -589,6 +589,56 @@ out:
#undef LOG_NAME_FMT
#undef LOG_NAME_ARGS
+/**
+ * nm_utils_find_helper:
+ * @progname: the helper program name, like "iptables"
+ * @try_first: a custom path to try first before searching
+ * @error: on failure, a "not found" error using @error_domain and @error_code
+ *
+ * Searches for the @progname in common system paths.
+ *
+ * Returns: the full path to the helper, if found, or %NULL if not found.
+ */
+const char *
+nm_utils_find_helper (const char *progname,
+ const char *try_first,
+ GError **error)
+{
+ static const char *paths[] = {
+ PREFIX "/sbin/",
+ PREFIX "/bin/",
+ "/sbin/",
+ "/usr/sbin/",
+ "/usr/local/sbin/",
+ "/usr/bin/",
+ "/usr/local/bin/",
+ };
+ guint i;
+ GString *tmp;
+ const char *ret;
+
+ if (error)
+ g_return_val_if_fail (*error == NULL, NULL);
+
+ if (try_first && try_first[0] && g_file_test (try_first, G_FILE_TEST_EXISTS))
+ return g_intern_string (try_first);
+
+ tmp = g_string_sized_new (50);
+ for (i = 0; i < G_N_ELEMENTS (paths); i++) {
+ g_string_append_printf (tmp, "%s%s", paths[i], progname);
+ if (g_file_test (tmp->str, G_FILE_TEST_EXISTS)) {
+ ret = g_intern_string (tmp->str);
+ g_string_free (tmp, TRUE);
+ return ret;
+ }
+ g_string_set_size (tmp, 0);
+ }
+ g_string_free (tmp, TRUE);
+
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Could not find %s binary", progname);
+ return NULL;
+}
+
/******************************************************************************************/
gboolean
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index c1c65faa06..9a31053326 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -62,6 +62,10 @@ gboolean nm_utils_kill_child_sync (pid_t pid, int sig, guint64 log_domain, const
int *child_status, guint32 wait_before_kill_msec,
guint32 sleep_duration_msec);
+const char *nm_utils_find_helper (const char *progname,
+ const char *try_first,
+ GError **error);
+
gboolean nm_match_spec_string (const GSList *specs, const char *string);
gboolean nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr);
gboolean nm_match_spec_s390_subchannels (const GSList *specs, const char *subchannels);
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 18b0ad21c7..8bcdadf518 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2508,27 +2508,17 @@ static NMActStageReturn
aipd_start (NMDevice *self, NMDeviceStateReason *reason)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- char *argv[6], *cmdline;
- const char **aipd_binary = NULL;
- static const char *aipd_paths[] = {
- "/usr/sbin/avahi-autoipd",
- "/usr/local/sbin/avahi-autoipd",
- NULL
- };
+ const char *argv[6];
+ char *cmdline;
+ const char *aipd_binary;
int i = 0;
GError *error = NULL;
aipd_cleanup (self);
/* Find avahi-autoipd */
- aipd_binary = aipd_paths;
- while (*aipd_binary != NULL) {
- if (g_file_test (*aipd_binary, G_FILE_TEST_EXISTS))
- break;
- aipd_binary++;
- }
-
- if (!*aipd_binary) {
+ aipd_binary = nm_utils_find_helper ("avahi-autoipd", NULL, NULL);
+ if (!aipd_binary) {
_LOGW (LOGD_DEVICE | LOGD_AUTOIP4,
"Activation: Stage 3 of 5 (IP Configure Start) failed"
" to start avahi-autoipd: not found");
@@ -2536,20 +2526,20 @@ aipd_start (NMDevice *self, NMDeviceStateReason *reason)
return NM_ACT_STAGE_RETURN_FAILURE;
}
- argv[i++] = (char *) (*aipd_binary);
+ argv[i++] = aipd_binary;
argv[i++] = "--script";
- argv[i++] = (char *) nm_device_autoipd_helper_path;
+ argv[i++] = nm_device_autoipd_helper_path;
if (nm_logging_enabled (LOGL_DEBUG, LOGD_AUTOIP4))
argv[i++] = "--debug";
- argv[i++] = (char *) nm_device_get_ip_iface (self);
+ argv[i++] = nm_device_get_ip_iface (self);
argv[i++] = NULL;
- cmdline = g_strjoinv (" ", argv);
+ cmdline = g_strjoinv (" ", (char **) argv);
_LOGD (LOGD_AUTOIP4, "running: %s", cmdline);
g_free (cmdline);
- if (!g_spawn_async ("/", argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
+ if (!g_spawn_async ("/", (char **) argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
&aipd_child_setup, NULL, &(priv->aipd_pid), &error)) {
_LOGW (LOGD_DEVICE | LOGD_AUTOIP4,
"Activation: Stage 3 of 5 (IP Configure Start) failed"
@@ -4520,7 +4510,7 @@ start_sharing (NMDevice *self, NMIP4Config *config)
static void
send_arps (NMDevice *self, const char *mode_arg)
{
- const char *argv[] = { "/sbin/arping", mode_arg, "-q", "-I", nm_device_get_ip_iface (self), "-c", "1", NULL, NULL };
+ const char *argv[] = { NULL, mode_arg, "-q", "-I", nm_device_get_ip_iface (self), "-c", "1", NULL, NULL };
int ip_arg = G_N_ELEMENTS (argv) - 2;
NMConnection *connection;
NMSettingIP4Config *s_ip4;
@@ -4536,6 +4526,14 @@ send_arps (NMDevice *self, const char *mode_arg)
if (!s_ip4)
return;
num = nm_setting_ip4_config_get_num_addresses (s_ip4);
+ if (num == 0)
+ return;
+
+ argv[0] = nm_utils_find_helper ("arping", NULL, NULL);
+ if (!argv[0]) {
+ _LOGW (LOGD_DEVICE | LOGD_IP4, "arping could not be found; no ARPs will be sent");
+ return;
+ }
for (i = 0; i < num; i++) {
gs_free char *tmp_str = NULL;
diff --git a/src/devices/team/nm-device-team.c b/src/devices/team/nm-device-team.c
index b524ba7efd..40055961bd 100644
--- a/src/devices/team/nm-device-team.c
+++ b/src/devices/team/nm-device-team.c
@@ -422,12 +422,7 @@ teamd_start (NMDevice *device, NMSettingTeam *s_team)
const char *iface = nm_device_get_ip_iface (device);
char *tmp_str = NULL;
const char *config;
- const char **teamd_binary = NULL;
- static const char *teamd_paths[] = {
- "/usr/bin/teamd",
- "/usr/local/bin/teamd",
- NULL
- };
+ const char *teamd_binary;
GPtrArray *argv;
GError *error = NULL;
gboolean ret;
@@ -443,21 +438,15 @@ teamd_start (NMDevice *device, NMSettingTeam *s_team)
return TRUE;
}
- teamd_binary = teamd_paths;
- while (*teamd_binary != NULL) {
- if (g_file_test (*teamd_binary, G_FILE_TEST_EXISTS))
- break;
- teamd_binary++;
- }
-
- if (!*teamd_binary) {
+ teamd_binary = nm_utils_find_helper ("teamd", NULL, NULL);
+ if (!teamd_binary) {
_LOGW (LOGD_TEAM, "Activation: (team) failed to start teamd: teamd binary not found");
return FALSE;
}
/* Kill teamd for same named device first if it is there */
argv = g_ptr_array_new ();
- g_ptr_array_add (argv, (gpointer) *teamd_binary);
+ g_ptr_array_add (argv, (gpointer) teamd_binary);
g_ptr_array_add (argv, (gpointer) "-k");
g_ptr_array_add (argv, (gpointer) "-t");
g_ptr_array_add (argv, (gpointer) iface);
@@ -472,7 +461,7 @@ teamd_start (NMDevice *device, NMSettingTeam *s_team)
/* Start teamd now */
argv = g_ptr_array_new ();
- g_ptr_array_add (argv, (gpointer) *teamd_binary);
+ g_ptr_array_add (argv, (gpointer) teamd_binary);
g_ptr_array_add (argv, (gpointer) "-o");
g_ptr_array_add (argv, (gpointer) "-n");
g_ptr_array_add (argv, (gpointer) "-U");
diff --git a/src/dhcp-manager/nm-dhcp-dhclient.c b/src/dhcp-manager/nm-dhcp-dhclient.c
index d5ea6a5486..74b416a7bb 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient.c
+++ b/src/dhcp-manager/nm-dhcp-dhclient.c
@@ -42,13 +42,13 @@
#include "nm-dhcp-dhclient-utils.h"
#include "nm-dhcp-manager.h"
#include "nm-posix-signals.h"
+#include "NetworkManagerUtils.h"
G_DEFINE_TYPE (NMDhcpDhclient, nm_dhcp_dhclient, NM_TYPE_DHCP_CLIENT)
#define NM_DHCP_DHCLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP_DHCLIENT, NMDhcpDhclientPrivate))
typedef struct {
- const char *path;
char *conf_file;
const char *def_leasefile;
char *lease_file;
@@ -56,27 +56,13 @@ typedef struct {
} NMDhcpDhclientPrivate;
const char *
-nm_dhcp_dhclient_get_path (const char *try_first)
+nm_dhcp_dhclient_get_path (void)
{
- static const char *dhclient_paths[] = {
- "/sbin/dhclient",
- "/usr/sbin/dhclient",
- "/usr/pkg/sbin/dhclient",
- "/usr/local/sbin/dhclient",
- NULL
- };
- const char **path = dhclient_paths;
-
- if (strlen (try_first) && g_file_test (try_first, G_FILE_TEST_EXISTS))
- return try_first;
-
- while (*path != NULL) {
- if (g_file_test (*path, G_FILE_TEST_EXISTS))
- break;
- path++;
- }
+ const char *path = NULL;
- return *path;
+ if (WITH_DHCLIENT)
+ path = nm_utils_find_helper ("dhclient", DHCLIENT_PATH, NULL);
+ return path;
}
/**
@@ -335,7 +321,7 @@ dhclient_start (NMDhcpClient *client,
GPtrArray *argv = NULL;
pid_t pid;
GError *error = NULL;
- const char *iface, *uuid, *system_bus_address;
+ const char *iface, *uuid, *system_bus_address, *dhclient_path = NULL;
char *binary_name, *cmd_str, *pid_file = NULL, *system_bus_address_env = NULL;
gboolean ipv6, success;
guint log_domain;
@@ -349,8 +335,9 @@ dhclient_start (NMDhcpClient *client,
log_domain = ipv6 ? LOGD_DHCP6 : LOGD_DHCP4;
- if (!g_file_test (priv->path, G_FILE_TEST_EXISTS)) {
- nm_log_warn (log_domain, "%s does not exist.", priv->path);
+ dhclient_path = nm_dhcp_dhclient_get_path ();
+ if (!dhclient_path) {
+ nm_log_warn (log_domain, "dhclient could not be found");
return FALSE;
}
@@ -359,7 +346,7 @@ dhclient_start (NMDhcpClient *client,
iface);
/* Kill any existing dhclient from the pidfile */
- binary_name = g_path_get_basename (priv->path);
+ binary_name = g_path_get_basename (dhclient_path);
nm_dhcp_client_stop_existing (pid_file, binary_name);
g_free (binary_name);
@@ -411,7 +398,7 @@ dhclient_start (NMDhcpClient *client,
}
argv = g_ptr_array_new ();
- g_ptr_array_add (argv, (gpointer) priv->path);
+ g_ptr_array_add (argv, (gpointer) dhclient_path);
g_ptr_array_add (argv, (gpointer) "-d");
@@ -608,8 +595,6 @@ nm_dhcp_dhclient_init (NMDhcpDhclient *self)
NMDhcpDhclientPrivate *priv = NM_DHCP_DHCLIENT_GET_PRIVATE (self);
const char **iter = &def_leasefiles[0];
- priv->path = nm_dhcp_dhclient_get_path (DHCLIENT_PATH);
-
while (iter && *iter) {
if (g_file_test (*iter, G_FILE_TEST_EXISTS)) {
priv->def_leasefile = *iter;
diff --git a/src/dhcp-manager/nm-dhcp-dhclient.h b/src/dhcp-manager/nm-dhcp-dhclient.h
index 8192a599b1..6c58826241 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient.h
+++ b/src/dhcp-manager/nm-dhcp-dhclient.h
@@ -45,7 +45,7 @@ GSList *nm_dhcp_dhclient_get_lease_ip_configs (const char *iface,
const char *uuid,
gboolean ipv6);
-const char *nm_dhcp_dhclient_get_path (const char *try_first);
+const char *nm_dhcp_dhclient_get_path (void);
#endif /* __NETWORKMANAGER_DHCP_DHCLIENT_H__ */
diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.c b/src/dhcp-manager/nm-dhcp-dhcpcd.c
index 8345034b84..98b54b10f4 100644
--- a/src/dhcp-manager/nm-dhcp-dhcpcd.c
+++ b/src/dhcp-manager/nm-dhcp-dhcpcd.c
@@ -37,38 +37,24 @@
#include "nm-utils.h"
#include "nm-logging.h"
#include "nm-posix-signals.h"
+#include "NetworkManagerUtils.h"
G_DEFINE_TYPE (NMDhcpDhcpcd, nm_dhcp_dhcpcd, NM_TYPE_DHCP_CLIENT)
#define NM_DHCP_DHCPCD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP_DHCPCD, NMDhcpDhcpcdPrivate))
typedef struct {
- const char *path;
char *pid_file;
} NMDhcpDhcpcdPrivate;
const char *
-nm_dhcp_dhcpcd_get_path (const char *try_first)
+nm_dhcp_dhcpcd_get_path (void)
{
- static const char *dhcpcd_paths[] = {
- "/sbin/dhcpcd",
- "/usr/sbin/dhcpcd",
- "/usr/pkg/sbin/dhcpcd",
- "/usr/local/sbin/dhcpcd",
- NULL
- };
- const char **path = dhcpcd_paths;
-
- if (strlen (try_first) && g_file_test (try_first, G_FILE_TEST_EXISTS))
- return try_first;
-
- while (*path != NULL) {
- if (g_file_test (*path, G_FILE_TEST_EXISTS))
- break;
- path++;
- }
+ const char *path = NULL;
- return *path;
+ if (WITH_DHCPCD)
+ path = nm_utils_find_helper ("dhcpcd", DHCPCD_PATH, NULL);
+ return path;
}
static void
@@ -96,7 +82,7 @@ ip4_start (NMDhcpClient *client,
pid_t pid = -1;
GError *error = NULL;
char *pid_contents = NULL, *binary_name, *cmd_str;
- const char *iface;
+ const char *iface, *dhcpcd_path = NULL;
g_return_val_if_fail (priv->pid_file == NULL, FALSE);
@@ -107,18 +93,19 @@ ip4_start (NMDhcpClient *client,
*/
priv->pid_file = g_strdup_printf (RUNDIR "/dhcpcd-%s.pid", iface);
- if (!g_file_test (priv->path, G_FILE_TEST_EXISTS)) {
- nm_log_warn (LOGD_DHCP4, "%s does not exist.", priv->path);
+ dhcpcd_path = nm_dhcp_dhcpcd_get_path ();
+ if (!dhcpcd_path) {
+ nm_log_warn (LOGD_DHCP4, "dhcpcd could not be found");
return FALSE;
}
/* Kill any existing dhcpcd from the pidfile */
- binary_name = g_path_get_basename (priv->path);
+ binary_name = g_path_get_basename (dhcpcd_path);
nm_dhcp_client_stop_existing (priv->pid_file, binary_name);
g_free (binary_name);
argv = g_ptr_array_new ();
- g_ptr_array_add (argv, (gpointer) priv->path);
+ g_ptr_array_add (argv, (gpointer) dhcpcd_path);
g_ptr_array_add (argv, (gpointer) "-B"); /* Don't background on lease (disable fork()) */
@@ -202,9 +189,6 @@ stop (NMDhcpClient *client, gboolean release, const GByteArray *duid)
static void
nm_dhcp_dhcpcd_init (NMDhcpDhcpcd *self)
{
- NMDhcpDhcpcdPrivate *priv = NM_DHCP_DHCPCD_GET_PRIVATE (self);
-
- priv->path = nm_dhcp_dhcpcd_get_path (DHCPCD_PATH);
}
static void
diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.h b/src/dhcp-manager/nm-dhcp-dhcpcd.h
index 6dfe0dda97..4e3502ab5a 100644
--- a/src/dhcp-manager/nm-dhcp-dhcpcd.h
+++ b/src/dhcp-manager/nm-dhcp-dhcpcd.h
@@ -41,7 +41,7 @@ typedef struct {
GType nm_dhcp_dhcpcd_get_type (void);
-const char *nm_dhcp_dhcpcd_get_path (const char *try_first);
+const char *nm_dhcp_dhcpcd_get_path (void);
#endif /* __NETWORKMANAGER_DHCP_DHCPCD_H__ */
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c
index a1bbbef50f..f24aad8dcc 100644
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -285,23 +285,16 @@ dis_connection_cb (NMDBusManager *mgr,
static GType
get_client_type (const char *client, GError **error)
{
- const char *dhclient_path = NULL;
- const char *dhcpcd_path = NULL;
+ gboolean use_dhclient, use_dhcpcd;
- /* If a client was disabled at build-time, its *_PATH define will be
- * an empty string.
- */
- /* coverity[array_null] */
- if (DHCLIENT_PATH && strlen (DHCLIENT_PATH))
- dhclient_path = nm_dhcp_dhclient_get_path (DHCLIENT_PATH);
- /* coverity[array_null] */
- if (DHCPCD_PATH && strlen (DHCPCD_PATH))
- dhcpcd_path = nm_dhcp_dhcpcd_get_path (DHCPCD_PATH);
+ /* If a client was disabled at build-time, these will return FALSE */
+ use_dhclient = !!nm_dhcp_dhclient_get_path ();
+ use_dhcpcd = !!nm_dhcp_dhcpcd_get_path ();
if (!client) {
- if (dhclient_path)
+ if (use_dhclient)
return NM_TYPE_DHCP_DHCLIENT;
- else if (dhcpcd_path)
+ else if (use_dhcpcd)
return NM_TYPE_DHCP_DHCPCD;
else {
g_set_error_literal (error,
@@ -312,20 +305,20 @@ get_client_type (const char *client, GError **error)
}
if (!strcmp (client, "dhclient")) {
- if (!dhclient_path) {
+ if (!use_dhclient) {
g_set_error_literal (error,
NM_DHCP_MANAGER_ERROR, NM_DHCP_MANAGER_ERROR_BAD_CLIENT,
- _("'dhclient' could be found."));
+ _("'dhclient' could not be found or was disabled."));
return G_TYPE_INVALID;
}
return NM_TYPE_DHCP_DHCLIENT;
}
if (!strcmp (client, "dhcpcd")) {
- if (!dhcpcd_path) {
+ if (!use_dhcpcd) {
g_set_error_literal (error,
NM_DHCP_MANAGER_ERROR, NM_DHCP_MANAGER_ERROR_BAD_CLIENT,
- _("'dhcpcd' could be found."));
+ _("'dhcpcd' could not be found or was disabled."));
return G_TYPE_INVALID;
}
return NM_TYPE_DHCP_DHCPCD;
diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c
index 8367693da7..416cfe3b01 100644
--- a/src/dns-manager/nm-dns-dnsmasq.c
+++ b/src/dns-manager/nm-dns-dnsmasq.c
@@ -35,6 +35,7 @@
#include "nm-ip4-config.h"
#include "nm-ip6-config.h"
#include "nm-dns-utils.h"
+#include "NetworkManagerUtils.h"
G_DEFINE_TYPE (NMDnsDnsmasq, nm_dns_dnsmasq, NM_TYPE_DNS_PLUGIN)
@@ -50,26 +51,6 @@ typedef struct {
/*******************************************/
-static inline const char *
-find_dnsmasq (void)
-{
- static const char *paths[] = {
- DNSMASQ_PATH,
- "/usr/local/sbin/dnsmasq",
- "/usr/sbin/dnsmasq",
- "/sbin/dnsmasq",
- NULL
- };
- const char **binary = paths;
-
- while (*binary != NULL) {
- if (**binary && g_file_test (*binary, G_FILE_TEST_EXISTS))
- return *binary;
- binary++;
- }
- return NULL;
-}
-
static gboolean
add_ip4_config (GString *str, NMIP4Config *ip4, gboolean split)
{
@@ -225,6 +206,7 @@ update (NMDnsPlugin *plugin,
const char *hostname)
{
NMDnsDnsmasq *self = NM_DNS_DNSMASQ (plugin);
+ const char *dm_binary;
GString *conf;
GSList *iter;
const char *argv[15];
@@ -240,6 +222,12 @@ update (NMDnsPlugin *plugin,
*/
nm_dns_plugin_child_kill (plugin);
+ dm_binary = nm_utils_find_helper ("dnsmasq", DNSMASQ_PATH, NULL);
+ if (!dm_binary) {
+ nm_log_warn (LOGD_DNS, "Could not find dnsmasq binary");
+ return FALSE;
+ }
+
/* Build up the new dnsmasq config file */
conf = g_string_sized_new (150);
@@ -281,7 +269,7 @@ update (NMDnsPlugin *plugin,
nm_log_dbg (LOGD_DNS, "dnsmasq local caching DNS configuration:");
nm_log_dbg (LOGD_DNS, "%s", conf->str);
- argv[idx++] = find_dnsmasq ();
+ argv[idx++] = dm_binary;
argv[idx++] = "--no-resolv"; /* Use only commandline */
argv[idx++] = "--keep-in-foreground";
argv[idx++] = "--no-hosts"; /* don't use /etc/hosts to resolve */
diff --git a/src/dnsmasq-manager/nm-dnsmasq-manager.c b/src/dnsmasq-manager/nm-dnsmasq-manager.c
index c76b5fe5c5..7d6337e914 100644
--- a/src/dnsmasq-manager/nm-dnsmasq-manager.c
+++ b/src/dnsmasq-manager/nm-dnsmasq-manager.c
@@ -169,27 +169,6 @@ nm_cmd_line_add_string (NMCmdLine *cmd, const char *str)
/*******************************************/
-static inline const char *
-nm_find_dnsmasq (void)
-{
- static const char *dnsmasq_binary_paths[] = {
- DNSMASQ_PATH,
- "/usr/local/sbin/dnsmasq",
- "/usr/sbin/dnsmasq",
- "/sbin/dnsmasq",
- NULL
- };
- const char **dnsmasq_binary = dnsmasq_binary_paths;
-
- while (*dnsmasq_binary != NULL) {
- if (**dnsmasq_binary && g_file_test (*dnsmasq_binary, G_FILE_TEST_EXISTS))
- break;
- dnsmasq_binary++;
- }
-
- return *dnsmasq_binary;
-}
-
static void
dm_exit_code (guint dm_exit_status)
{
@@ -250,7 +229,6 @@ create_dm_cmd_line (const char *iface,
const char *pidfile,
GError **error)
{
- const char *dm_binary;
NMCmdLine *cmd;
GString *s;
const NMPlatformIP4Address *tmp;
@@ -258,16 +236,11 @@ create_dm_cmd_line (const char *iface,
char last[INET_ADDRSTRLEN];
char localaddr[INET_ADDRSTRLEN];
char *error_desc = NULL;
+ const char *dm_binary;
- dm_binary = nm_find_dnsmasq ();
- if (!dm_binary) {
- g_set_error_literal (error, NM_DNSMASQ_MANAGER_ERROR, NM_DNSMASQ_MANAGER_ERROR_NOT_FOUND,
- "Could not find dnsmasq binary.");
+ dm_binary = nm_utils_find_helper ("dnsmasq", DNSMASQ_PATH, error);
+ if (!dm_binary)
return NULL;
- }
-
- /* Find the IP4 address to use */
- tmp = nm_ip4_config_get_address (ip4_config, 0);
/* Create dnsmasq command line */
cmd = nm_cmd_line_new ();
@@ -298,6 +271,9 @@ create_dm_cmd_line (const char *iface,
*/
nm_cmd_line_add_string (cmd, "--strict-order");
+ /* Find the IP4 address to use */
+ tmp = nm_ip4_config_get_address (ip4_config, 0);
+
s = g_string_new ("--listen-address=");
nm_utils_inet4_ntop (tmp->address, localaddr);
g_string_append (s, localaddr);
@@ -311,7 +287,8 @@ create_dm_cmd_line (const char *iface,
error_desc);
nm_log_warn (LOGD_SHARING, "Failed to find DHCP address ranges: %s", error_desc);
g_free (error_desc);
- goto error;
+ nm_cmd_line_destroy (cmd);
+ return NULL;
}
s = g_string_new ("--dhcp-range=");
@@ -332,10 +309,6 @@ create_dm_cmd_line (const char *iface,
g_string_free (s, TRUE);
return cmd;
-
-error:
- nm_cmd_line_destroy (cmd);
- return NULL;
}
static void
diff --git a/src/nm-dcb.c b/src/nm-dcb.c
index 3bdbf7d5ed..3829e1a2e9 100644
--- a/src/nm-dcb.c
+++ b/src/nm-dcb.c
@@ -296,47 +296,20 @@ _fcoe_cleanup (const char *iface,
return do_helper (NULL, FCOEADM, run_func, user_data, error, "-d %s", iface);
}
-
-static const char *dcbpaths[] = {
- "/sbin/dcbtool",
- "/usr/sbin/dcbtool",
- "/usr/local/sbin/dcbtool",
- NULL
-};
-static const char *fcoepaths[] = {
- "/sbin/fcoeadm",
- "/usr/sbin/fcoeadm",
- "/usr/local/sbin/fcoeadm",
- NULL
-};
-
-
static gboolean
run_helper (char **argv, guint which, gpointer user_data, GError **error)
{
- static const char *helper_path[2] = { NULL, NULL };
+ const char *helper_path;
int exit_status = 0;
gboolean success;
char *errmsg = NULL, *outmsg = NULL;
- const char **iter;
char *cmdline;
- if (G_UNLIKELY (helper_path[which] == NULL)) {
- iter = (which == DCBTOOL) ? dcbpaths : fcoepaths;
- while (*iter) {
- if (g_file_test (*iter, G_FILE_TEST_EXISTS))
- helper_path[which] = *iter;
- iter++;
- }
- if (!helper_path[which]) {
- g_set_error (error, NM_DCB_ERROR, NM_DCB_ERROR_HELPER_NOT_FOUND,
- "%s not found",
- which == DCBTOOL ? "dcbtool" : "fcoadm");
- return FALSE;
- }
- }
+ helper_path = nm_utils_find_helper ((which == DCBTOOL) ? "dcbtool" : "fcoeadm", NULL, error);
+ if (!helper_path)
+ return FALSE;
- argv[0] = (char *) helper_path[which];
+ argv[0] = (char *) helper_path;
cmdline = g_strjoinv (" ", argv);
nm_log_dbg (LOGD_DCB, "%s", cmdline);
@@ -359,9 +332,9 @@ run_helper (char **argv, guint which, gpointer user_data, GError **error)
success = FALSE;
}
}
+
g_free (outmsg);
g_free (errmsg);
-
g_free (cmdline);
return success;
}
diff --git a/src/ppp-manager/nm-ppp-manager.c b/src/ppp-manager/nm-ppp-manager.c
index 2c9d1c3d04..0b8481d419 100644
--- a/src/ppp-manager/nm-ppp-manager.c
+++ b/src/ppp-manager/nm-ppp-manager.c
@@ -751,36 +751,6 @@ nm_cmd_line_add_int (NMCmdLine *cmd, int i)
/*******************************************/
-static const char *pppd_binary_paths[] = {
- PPPD_PATH,
- "/usr/local/sbin/pppd",
- "/usr/sbin/pppd",
- "/sbin/pppd",
- NULL
-};
-
-static const char *pppoe_binary_paths[] = {
- PPPOE_PATH,
- "/usr/local/sbin/pppoe",
- "/usr/sbin/pppoe",
- "/sbin/pppoe",
- NULL
-};
-
-static inline const char *
-nm_find_binary (const char *paths[])
-{
- const char **binary = paths;
-
- while (*binary != NULL) {
- if (**binary && g_file_test (*binary, G_FILE_TEST_EXISTS))
- break;
- binary++;
- }
-
- return *binary;
-}
-
static void
ppp_exit_code (guint pppd_exit_status, GPid pid)
{
@@ -900,27 +870,21 @@ create_pppd_cmd_line (NMPPPManager *self,
GError **err)
{
NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (self);
- const char *pppd_binary, *pppoe_binary = NULL;
+ const char *pppd_binary = NULL, *pppoe_binary = NULL;
NMCmdLine *cmd;
gboolean ppp_debug;
g_return_val_if_fail (setting != NULL, NULL);
- pppd_binary = nm_find_binary (pppd_binary_paths);
- if (!pppd_binary) {
- g_set_error (err, NM_PPP_MANAGER_ERROR, NM_PPP_MANAGER_ERROR,
- "Could not find pppd binary.");
+ pppd_binary = nm_utils_find_helper ("pppd", NULL, err);
+ if (!pppd_binary)
return NULL;
- }
if ( pppoe
|| (adsl && strcmp (nm_setting_adsl_get_protocol (adsl), NM_SETTING_ADSL_PROTOCOL_PPPOE))) {
- pppoe_binary = nm_find_binary (pppoe_binary_paths);
- if (!pppoe_binary) {
- g_set_error (err, NM_PPP_MANAGER_ERROR, NM_PPP_MANAGER_ERROR,
- "Could not find pppoe binary.");
+ pppoe_binary = nm_utils_find_helper ("pppoe", NULL, err);
+ if (!pppoe_binary)
return NULL;
- }
}
/* Create pppd command line */