Add support to track network devices that have a configuration
        with a matching interface.name in /etc/network/interfaces


=== modified file 'ChangeLog'
--- a/ChangeLog 2008-10-07 20:40:57 +0000
+++ b/ChangeLog 2008-10-07 20:42:06 +0000
@@ -1,9 +1,31 @@
 2008-10-07  Alexander Sack  <[EMAIL PROTECTED]>
+       Add support to track network devices that have a configuration
+       with a matching interface.name in /etc/network/interfaces
+
+       * system-settings/plugins/ifupdown/plugin.c
+               - (typedef struct SCPluginIfupdownPrivate): add hash table
+                       to track |well_known_udis|
+               - (get_iface_for_udi): helper function to get interface.name
+                       for a udi
+               - (hal_device_added_cb, hal_device_removed_cb): callbacks
+                       that add and remove devices to and from the 
well_known_udis
+                       set depending on whether their |interface.name| matches
+                       any interface definition in /etc/network/interfaces
+               - (SCPluginIfupdown_init): connect callbacks from above with
+                       hal_mgr and setup well_known_udis hashtable
+               - (GObject__dispose): destroy well_known_udis hashtable
+               - (hal_device_added_cb2): implement wrapper callback with GFunc
+                       signature. user_data is supposed to be a triple 
(hal_mgr,
+                       config and devtype)
+               - (SCPluginIfupdown_init): bootstrap wired and wifi devices for
+                       startup and call hal_device_added_cb2
+
+2008-10-07  Alexander Sack  <[EMAIL PROTECTED]>
 
        Remove implementation for not used NMSystemConfigInterface callback 
functions
        in ifupdown plugin
 
        * system-settings/plugins/ifupdown/plugin.c
                - (SCPluginIfupdown_unmanaged_devices_changed) removed
                - (SCPluginIfupdown_connection_added) removed
 

=== modified file 'system-settings/plugins/ifupdown/plugin.c'
--- a/system-settings/plugins/ifupdown/plugin.c 2008-10-07 20:40:57 +0000
+++ b/system-settings/plugins/ifupdown/plugin.c 2008-10-07 20:42:06 +0000
@@ -55,16 +55,18 @@
 typedef struct {
 
        DBusGConnection *g_connection;
        NMSystemConfigHalManager *hal_mgr;
 
        GHashTable *iface_connections;
        gchar* hostname;
 
+       GHashTable *well_known_udis;
+
        gulong inotify_event_id;
        int inotify_system_hostname_wd;
 } SCPluginIfupdownPrivate;
 
 static void
 system_config_interface_init (NMSystemConfigInterface 
*system_config_interface_class);
 
 G_DEFINE_TYPE_EXTENDED (SCPluginIfupdown, sc_plugin_ifupdown, G_TYPE_OBJECT, 0,
@@ -154,31 +156,136 @@ sc_plugin_ifupdown_class_init (SCPluginI
                                          
NM_SYSTEM_CONFIG_INTERFACE_PROP_CAPABILITIES,
                                          
NM_SYSTEM_CONFIG_INTERFACE_CAPABILITIES);
 
        g_object_class_override_property (object_class,
                                          
NM_SYSTEM_CONFIG_INTERFACE_PROP_HOSTNAME,
                                          NM_SYSTEM_CONFIG_INTERFACE_HOSTNAME);
 }
 
+static gchar*
+get_iface_for_udi (DBusGConnection *g_connection,
+                           const gchar* udi,
+                           GError **error)
+{
+       DBusGProxy *dev_proxy;
+       char *iface = NULL;
+       dev_proxy = dbus_g_proxy_new_for_name (g_connection,
+                                                                   
"org.freedesktop.Hal",
+                                                                   udi,
+                                                                   
"org.freedesktop.Hal.Device");
+       if (!dev_proxy)
+               return NULL;
+
+       if (dbus_g_proxy_call_with_timeout (dev_proxy,
+                                                                
"GetPropertyString", 10000, error,
+                                                                G_TYPE_STRING, 
"net.interface", G_TYPE_INVALID,
+                                                                G_TYPE_STRING, 
&iface, G_TYPE_INVALID)) {
+               g_object_unref (dev_proxy);
+               return iface;
+       }
+       g_object_unref (dev_proxy);
+       return NULL;
+}
+
+static void
+hal_device_added_cb (NMSystemConfigHalManager *hal_mgr,
+                                const gchar* udi,
+                                NMDeviceType devtype,
+                                NMSystemConfigInterface *config)
+{
+       SCPluginIfupdownPrivate *priv = SC_PLUGIN_IFUPDOWN_GET_PRIVATE (config);
+       gchar *iface;
+       GError *error = NULL;
+       gpointer exported_iface_connection;
+       NMConnection *iface_connection = NULL;
+
+       iface = get_iface_for_udi (priv->g_connection,
+                                                 udi,
+                                                 &error);
+
+       PLUGIN_PRINT("SCPlugin-Ifupdown",
+                          "devices added (udi: %s, iface: %s)", udi, iface);
+
+       if(!iface)
+               return;
+
+       exported_iface_connection =
+               NM_EXPORTED_CONNECTION (g_hash_table_lookup 
(priv->iface_connections, iface));
+       /* if we have a configured connection for this particular iface
+        * we want to either unmanage the device or lock it
+        */
+       if(!exported_iface_connection)
+               return;
+
+       iface_connection = nm_exported_connection_get_connection 
(exported_iface_connection);
+
+       if(!iface_connection)
+               return;
+
+       g_hash_table_insert (priv->well_known_udis, (gpointer)udi, "nothing");
+}
+
+static void
+hal_device_removed_cb (NMSystemConfigHalManager *hal_mgr,
+                                  const gchar* udi,
+                                  NMDeviceType devtype,
+                                  NMSystemConfigInterface *config)
+{
+       SCPluginIfupdownPrivate *priv = SC_PLUGIN_IFUPDOWN_GET_PRIVATE (config);
+
+       PLUGIN_PRINT("SCPlugin-Ifupdown",
+                          "devices removed (udi: %s)", udi);
+
+       g_hash_table_remove (priv->well_known_udis, udi);
+}
+
+static void
+hal_device_added_cb2 (gpointer data,
+                                 gpointer user_data)
+{
+       NMSystemConfigHalManager *hal_mgr = ((gpointer*)user_data)[0];
+       NMSystemConfigInterface *config = ((gpointer*)user_data)[1];
+       NMDeviceType devtype = GPOINTER_TO_INT(((gpointer*)user_data)[2]);
+       const gchar *udi  = data;
+
+       hal_device_added_cb (hal_mgr,
+                                        udi,
+                                        devtype,
+                                        config);
+}
+
 static void
 SCPluginIfupdown_init (NMSystemConfigInterface *config,
                                   NMSystemConfigHalManager *hal_manager)
 {
        SCPluginIfupdownPrivate *priv = SC_PLUGIN_IFUPDOWN_GET_PRIVATE (config);
        GHashTable *auto_ifaces = g_hash_table_new (g_str_hash, g_str_equal);
        if_block *block = NULL;
        NMInotifyHelper *inotify_helper;
 
        if(!priv->iface_connections)
                priv->iface_connections = g_hash_table_new (g_str_hash, 
g_str_equal);
 
+       if(!priv->well_known_udis)
+               priv->well_known_udis = g_hash_table_new (g_str_hash, 
g_str_equal);
+
        PLUGIN_PRINT("SCPlugin-Ifupdown", "init!");
        priv->hal_mgr = g_object_ref (hal_manager);
 
+       g_signal_connect (G_OBJECT(hal_manager),
+                                  "device-added",
+                                  G_CALLBACK(hal_device_added_cb),
+                                  config);
+
+       g_signal_connect (G_OBJECT(hal_manager),
+                                  "device-removed",
+                                  G_CALLBACK(hal_device_removed_cb),
+                                  config);
+ 
        inotify_helper = nm_inotify_helper_get ();
        priv->inotify_event_id = g_signal_connect (inotify_helper,
                                                                           
"event",
                                                                           
G_CALLBACK (update_system_hostname),
                                                                           
config);
 
        priv->inotify_system_hostname_wd =
                nm_inotify_helper_add_watch (inotify_helper, 
IFUPDOWN_SYSTEM_HOSTNAME_FILE);
@@ -221,16 +328,42 @@ SCPluginIfupdown_init (NMSystemConfigInt
                                g_object_set (setting,
                                                    "autoconnect", TRUE,
                                                    NULL);
                                PLUGIN_PRINT("SCPlugin-Ifupdown", 
"autoconnect");
                        }
                        key_it = key_it -> next;
                }
        }
+
+       {
+               /* init well_known_udis */
+               GSList *wired_devices = 
nm_system_config_hal_manager_get_devices_of_type (hal_manager, 
NM_DEVICE_TYPE_ETHERNET);
+               GSList *wifi_devices = 
nm_system_config_hal_manager_get_devices_of_type (hal_manager, 
NM_DEVICE_TYPE_WIFI);
+               gpointer *user_data;
+
+               /* 3g in /etc/network/interfaces? no clue if thats mappable
+
+               GSList *gsm_devices = 
nm_system_config_hal_manager_get_devices_of_type (hal_manager, 
NM_DEVICE_TYPE_GSM);
+               GSList *cdma_devices = 
nm_system_config_hal_manager_get_devices_of_type (hal_manager, 
NM_DEVICE_TYPE_CDMA);
+               */
+
+               user_data = g_new0 (gpointer, 3);
+               user_data[0] = hal_manager;
+               user_data[1] = config;
+               user_data[2] = GINT_TO_POINTER (NM_DEVICE_TYPE_ETHERNET);
+
+               g_slist_foreach (wired_devices, hal_device_added_cb2, 
user_data);
+
+               user_data[0] = hal_manager;
+               user_data[1] = config;
+               user_data[2] = GINT_TO_POINTER (NM_DEVICE_TYPE_ETHERNET);
+               g_slist_foreach (wifi_devices, hal_device_added_cb2, user_data);
+       }               
+
        g_hash_table_unref(auto_ifaces);
        PLUGIN_PRINT("SCPlugin-Ifupdown", "end _init.");
 }
 
 
 /* Returns the plugins currently known list of connections.  The returned
  * list is freed by the system settings service.
  */
@@ -398,16 +531,19 @@ GObject__dispose (GObject *object)
        SCPluginIfupdownPrivate *priv = SC_PLUGIN_IFUPDOWN_GET_PRIVATE (plugin);
        NMInotifyHelper *inotify_helper = nm_inotify_helper_get ();
 
        g_signal_handler_disconnect (inotify_helper, priv->inotify_event_id);
 
        if (priv->inotify_system_hostname_wd >= 0)
                nm_inotify_helper_remove_watch (inotify_helper, 
priv->inotify_system_hostname_wd);
 
+       if (priv->well_known_udis)
+               g_hash_table_destroy(priv->well_known_udis);
+
        g_object_unref (priv->hal_mgr);
        G_OBJECT_CLASS (sc_plugin_ifupdown_parent_class)->dispose (object);
 }
 
 static void
 GObject__finalize (GObject *object)
 {
        G_OBJECT_CLASS (sc_plugin_ifupdown_parent_class)->finalize (object);



 - Alexander

_______________________________________________
NetworkManager-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to