summary refs log tree commit diff
path: root/src/devices/nm-arping-manager.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2017-01-17 20:25:09 +0100
committerMichael Biebl <biebl@debian.org>2017-01-17 20:25:09 +0100
commit58f8be580039b0575b197b9573a1c92745d96d30 (patch)
tree2c226233f623a0dcb529be0eb8cdf97e4a2ae0c0 /src/devices/nm-arping-manager.c
parent45cb5bb3c0e6edb887cf69b417fcaf7053814a9b (diff)
New upstream version 1.5.90 upstream/1.5.90
Diffstat (limited to 'src/devices/nm-arping-manager.c')
-rw-r--r--src/devices/nm-arping-manager.c114
1 files changed, 69 insertions, 45 deletions
diff --git a/src/devices/nm-arping-manager.c b/src/devices/nm-arping-manager.c
index dfb20b4b..7b765844 100644
--- a/src/devices/nm-arping-manager.c
+++ b/src/devices/nm-arping-manager.c
@@ -16,15 +16,18 @@
 
 #include "nm-default.h"
 
+#include "nm-arping-manager.h"
+
 #include <netinet/in.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 
-#include "nm-arping-manager.h"
-#include "nm-platform.h"
+#include "platform/nm-platform.h"
 #include "nm-utils.h"
 #include "NetworkManagerUtils.h"
 
+/*****************************************************************************/
+
 typedef enum {
 	STATE_INIT,
 	STATE_PROBING,
@@ -33,15 +36,6 @@ typedef enum {
 } State;
 
 typedef struct {
-	int            ifindex;
-	State          state;
-	GHashTable    *addresses;
-	guint          completed;
-	guint          timer;
-	guint          round2_id;
-} NMArpingManagerPrivate;
-
-typedef struct {
 	in_addr_t address;
 	GPid pid;
 	guint watch;
@@ -49,15 +43,38 @@ typedef struct {
 	NMArpingManager *manager;
 } AddressInfo;
 
+/*****************************************************************************/
+
 enum {
 	PROBE_TERMINATED,
 	LAST_SIGNAL,
 };
+
 static guint signals[LAST_SIGNAL] = { 0 };
 
+typedef struct {
+	int            ifindex;
+	State          state;
+	GHashTable    *addresses;
+	guint          completed;
+	guint          timer;
+	guint          round2_id;
+} NMArpingManagerPrivate;
+
+struct _NMArpingManager {
+	GObject parent;
+	NMArpingManagerPrivate _priv;
+};
+
+struct _NMArpingManagerClass {
+	GObjectClass parent;
+};
+
 G_DEFINE_TYPE (NMArpingManager, nm_arping_manager, G_TYPE_OBJECT)
 
-#define NM_ARPING_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ARPING_MANAGER, NMArpingManagerPrivate))
+#define NM_ARPING_MANAGER_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMArpingManager, NM_IS_ARPING_MANAGER)
+
+/*****************************************************************************/
 
 #define _NMLOG_DOMAIN         LOGD_IP4
 #define _NMLOG_PREFIX_NAME    "arping"
@@ -74,6 +91,8 @@ G_DEFINE_TYPE (NMArpingManager, nm_arping_manager, G_TYPE_OBJECT)
                 _NM_UTILS_MACRO_REST (__VA_ARGS__)); \
     } G_STMT_END
 
+/*****************************************************************************/
+
 /**
  * nm_arping_manager_add_address:
  * @self: a #NMArpingManager
@@ -174,7 +193,7 @@ arping_timeout_cb (gpointer user_data)
  * Start probing IP addresses for duplicates; when the probe terminates a
  * PROBE_TERMINATED signal is emitted.
  *
- * Returns: %TRUE on success, %FALSE on failure
+ * Returns: %TRUE if at least one probe could be started, %FALSE otherwise
  */
 gboolean
 nm_arping_manager_start_probe (NMArpingManager *self, guint timeout, GError **error)
@@ -184,6 +203,7 @@ nm_arping_manager_start_probe (NMArpingManager *self, guint timeout, GError **er
 	GHashTableIter iter;
 	AddressInfo *info;
 	gs_free char *timeout_str = NULL;
+	gboolean success = FALSE;
 
 	g_return_val_if_fail (NM_IS_ARPING_MANAGER (self), FALSE);
 	g_return_val_if_fail (!error || !*error, FALSE);
@@ -217,24 +237,29 @@ nm_arping_manager_start_probe (NMArpingManager *self, guint timeout, GError **er
 
 	while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &info)) {
 		gs_free char *tmp_str = NULL;
-		gboolean success;
 
 		argv[9] = nm_utils_inet4_ntop (info->address, NULL);
 		_LOGD ("run %s", (tmp_str = g_strjoinv (" ", (char **) argv)));
 
-		success = g_spawn_async (NULL, (char **) argv, NULL,
-		                         G_SPAWN_STDOUT_TO_DEV_NULL |
-		                         G_SPAWN_STDERR_TO_DEV_NULL |
-		                         G_SPAWN_DO_NOT_REAP_CHILD,
-		                         NULL, NULL, &info->pid, NULL);
-
-		info->watch = g_child_watch_add (info->pid, arping_watch_cb, info);
+		if (g_spawn_async (NULL, (char **) argv, NULL,
+		                   G_SPAWN_STDOUT_TO_DEV_NULL |
+		                   G_SPAWN_STDERR_TO_DEV_NULL |
+		                   G_SPAWN_DO_NOT_REAP_CHILD,
+		                   NULL, NULL, &info->pid, NULL)) {
+			info->watch = g_child_watch_add (info->pid, arping_watch_cb, info);
+			success = TRUE;
+		}
 	}
 
-	priv->timer = g_timeout_add (timeout, arping_timeout_cb, self);
-	priv->state = STATE_PROBING;
+	if (success) {
+		priv->timer = g_timeout_add (timeout, arping_timeout_cb, self);
+		priv->state = STATE_PROBING;
+	} else {
+		g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
+		                     "could not spawn arping process");
+	}
 
-	return TRUE;
+	return success;
 }
 
 /**
@@ -350,7 +375,7 @@ send_announcements (NMArpingManager *self, const char *mode_arg)
 static gboolean
 arp_announce_round2 (gpointer self)
 {
-	NMArpingManagerPrivate *priv = NM_ARPING_MANAGER_GET_PRIVATE (self);
+	NMArpingManagerPrivate *priv = NM_ARPING_MANAGER_GET_PRIVATE ((NMArpingManager *) self);
 
 	priv->round2_id = 0;
 	send_announcements (self, "-U");
@@ -395,18 +420,7 @@ destroy_address_info (gpointer data)
 	g_slice_free (AddressInfo, info);
 }
 
-static void
-dispose (GObject *object)
-{
-	NMArpingManager *self = NM_ARPING_MANAGER (object);
-	NMArpingManagerPrivate *priv = NM_ARPING_MANAGER_GET_PRIVATE (self);
-
-	nm_clear_g_source (&priv->timer);
-	nm_clear_g_source (&priv->round2_id);
-	g_clear_pointer (&priv->addresses, g_hash_table_destroy);
-
-	G_OBJECT_CLASS (nm_arping_manager_parent_class)->dispose (object);
-}
+/*****************************************************************************/
 
 static void
 nm_arping_manager_init (NMArpingManager *self)
@@ -427,23 +441,33 @@ nm_arping_manager_new (int ifindex)
 	self = g_object_new (NM_TYPE_ARPING_MANAGER, NULL);
 	priv = NM_ARPING_MANAGER_GET_PRIVATE (self);
 	priv->ifindex = ifindex;
-
 	return self;
 }
 
 static void
+dispose (GObject *object)
+{
+	NMArpingManager *self = NM_ARPING_MANAGER (object);
+	NMArpingManagerPrivate *priv = NM_ARPING_MANAGER_GET_PRIVATE (self);
+
+	nm_clear_g_source (&priv->timer);
+	nm_clear_g_source (&priv->round2_id);
+	g_clear_pointer (&priv->addresses, g_hash_table_destroy);
+
+	G_OBJECT_CLASS (nm_arping_manager_parent_class)->dispose (object);
+}
+
+static void
 nm_arping_manager_class_init (NMArpingManagerClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-	g_type_class_add_private (klass, sizeof (NMArpingManagerPrivate));
-
 	object_class->dispose = dispose;
 
 	signals[PROBE_TERMINATED] =
-		g_signal_new (NM_ARPING_MANAGER_PROBE_TERMINATED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              0, NULL, NULL, NULL,
-		              G_TYPE_NONE, 0);
+	    g_signal_new (NM_ARPING_MANAGER_PROBE_TERMINATED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 0);
 }