Killswitch Patch



Hi all --

This patch adds support for HAL's new killswitch functionality.  It is 
somewhat rudimentary and needs a bit of work (little things, nothing major), 
but I do not have the hardware to test the functionality.  Can somebody test 
this?

HAL should support killswitchs on Dell and VAIO laptops.

Thanks!

-- Benjamin Kreuter
Index: src/NetworkManager.c
===================================================================
--- src/NetworkManager.c	(revision 2587)
+++ src/NetworkManager.c	(working copy)
@@ -298,7 +298,79 @@
 	}
 }
 
+/*
+ * nm_add_killswitch_device
+ *
+ * Adds a killswitch device to the list
+ *
+ */
+void nm_add_killswitch_device(NMData * data, char * udi)
+{
+// 	g_return_val_if_fail (data != NULL, NULL);
+// 	g_return_val_if_fail (udi  != NULL, NULL);
+	/* Attempt to acquire mutex for killswitch list addition.  If acquire fails,
+	 * just ignore the device addition entirely.
+	 */
+	if (nm_try_acquire_mutex (data->killswitch_list_mutex, __FUNCTION__))
+	{
+		data->killswitch_list = g_slist_append (data->killswitch_list, udi);
+// 		nm_device_deactivate (dev);
 
+		nm_unlock_mutex (data->killswitch_list_mutex, __FUNCTION__);
+
+// 		nm_policy_schedule_device_change_check (data);
+// 		nm_dbus_schedule_device_status_change_signal (data, dev, NULL, DEVICE_ADDED);
+	}
+	else
+	{
+		/* If we couldn't add the killswitch to our list, free its data. */
+		nm_warning ("could not acquire killswitch list mutex." );
+// 		g_object_unref (G_OBJECT (dev));
+// 		dev = NULL;
+	}
+}
+
+void nm_poll_killswitchs(gpointer _data)
+{
+	NMData * data = (NMData *)_data;
+	DBusMessage * message;
+	DBusConnection * connection = data->dbus_connection;
+	DBusError error;
+	GSList * elt;
+	NMDevice * dev;
+
+	while(1)
+	{
+// 		char * killswitchPower = libhal_device_get_property_string(ctx, udi, "killswitch.GetPower", NULL);
+		nm_lock_mutex (data->killswitch_list_mutex, __FUNCTION__);
+		for (elt = data->killswitch_list; elt; elt = g_slist_next (elt))
+		{
+			int status;
+			message = dbus_message_new_method_call("org.freedesktop.Hal.Device.KillSwitch", elt->data, "org.freedesktop.Hal.Device.KillSwitch", "GetPower");
+			message = dbus_connection_send_with_reply_and_block(connection, message, 500, &error);
+			if(dbus_error_is_set(&error))
+			{
+				nm_warning("Could not poll killswitch: ", error.message);
+				dbus_error_free(&error);
+			}
+			else
+			{
+				dbus_message_get_args(message, &error, DBUS_TYPE_UINT32, &status, DBUS_TYPE_INVALID);
+				if(status > 0)
+				{
+					// Switch is on, deactivate device
+					dev = nm_get_device_interface_from_hal(data->hal_ctx, elt->data);
+					nm_device_deactivate(dev);
+				}
+			}
+		}
+		nm_unlock_mutex (data->killswitch_list_mutex, __FUNCTION__);
+		g_usleep(500000);
+	}
+}
+
+GThread * polling_thread;
+
 /*
  * nm_add_initial_devices
  *
@@ -308,7 +380,9 @@
 void nm_add_initial_devices (NMData *data)
 {
 	char **	net_devices;
+	char ** killswitchs;
 	int		num_net_devices;
+	int num_killswitch_devices;
 	int		i;
 	DBusError	error;
 
@@ -338,6 +412,29 @@
 	}
 
 	libhal_free_string_array (net_devices);
+
+	/* Now, grab a list of killswitch devices... */
+	killswitchs = libhal_find_device_by_capability(data->hal_ctx, "killswitch", &num_killswitch_devices, &error);
+	if(dbus_error_is_set(&error))
+	{
+		nm_warning("could not find killswitch devices: %s", error.message);
+		dbus_error_free(&error);
+	}
+
+	if(killswitchs)
+	{
+		for(i = 0; i < num_killswitch_devices; i++)
+		{
+			char * dev;
+			if((dev = nm_get_device_interface_from_hal(data->hal_ctx, killswitchs[i])))
+			{
+				nm_add_killswitch_device(data, killswitchs[i]);
+				g_free(dev);
+			}
+		}
+		// TODO: Start polling thread...
+		polling_thread = g_thread_create(nm_poll_killswitchs, data, 0, NULL);
+	}
 }
 
 
Index: src/NetworkManagerMain.h
===================================================================
--- src/NetworkManagerMain.h	(revision 2587)
+++ src/NetworkManagerMain.h	(working copy)
@@ -90,6 +90,10 @@
 	GSList *				dialup_list;
 	GMutex *				dialup_list_mutex;
 
+	/* Killswitch list */
+	GSList * killswitch_list;
+	GMutex * killswitch_list_mutex;
+
 	struct NMAccessPointList	*allowed_ap_list;
 	struct NMAccessPointList	*invalid_ap_list;
 } NMData;

Attachment: pgpBu8fFw2hdJ.pgp
Description: PGP signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]