Index: network-manager-0.6.6/src/NetworkManagerDbus.c =================================================================== --- network-manager-0.6.6.orig/src/NetworkManagerDbus.c 2008-09-25 22:50:04.000000000 +0800 +++ network-manager-0.6.6/src/NetworkManagerDbus.c 2008-09-28 00:20:14.000000000 +0800 @@ -311,6 +311,9 @@ if (data->always_online == TRUE) return NM_STATE_CONNECTED; + if (data->unmanaged_active) + return NM_STATE_CONNECTED; + act_dev = nm_get_active_device (data); if (!act_dev && !data->modem_active) return NM_STATE_DISCONNECTED; Index: network-manager-0.6.6/src/NetworkManagerMain.h =================================================================== --- network-manager-0.6.6.orig/src/NetworkManagerMain.h 2008-09-25 22:50:04.000000000 +0800 +++ network-manager-0.6.6/src/NetworkManagerMain.h 2008-09-28 00:19:20.000000000 +0800 @@ -85,6 +85,7 @@ gboolean hw_rf_enabled; gboolean wireless_enabled; gboolean modem_active; + guint unmanaged_active; gboolean asleep; gboolean disconnected; gboolean always_online; Index: network-manager-0.6.6/src/nm-dbus-nm.c =================================================================== --- network-manager-0.6.6.orig/src/nm-dbus-nm.c 2008-09-25 22:49:59.000000000 +0800 +++ network-manager-0.6.6/src/nm-dbus-nm.c 2008-09-28 00:19:27.000000000 +0800 @@ -626,6 +626,7 @@ nm_lock_mutex (app_data->dialup_list_mutex, __FUNCTION__); nm_system_deactivate_all_dialup (app_data->dialup_list); app_data->modem_active = FALSE; + app_data->unmanaged_active = 0; nm_unlock_mutex (app_data->dialup_list_mutex, __FUNCTION__); } Index: network-manager-0.6.6/src/nm-device.c =================================================================== --- network-manager-0.6.6.orig/src/nm-device.c 2008-09-25 22:50:04.000000000 +0800 +++ network-manager-0.6.6/src/nm-device.c 2008-09-28 00:26:45.000000000 +0800 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -2068,3 +2069,49 @@ } return type; } + +void +nm_device_update_unmanaged (struct NMData *data, + const char *ifname, + gboolean is_connected) +{ + struct ifreq if_req; + int fd; + + if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { + nm_debug("unable to open AF_INET socket: %s", g_strerror (errno)); + return; + } + + if_req.ifr_addr.sa_family = AF_INET; + + strncpy (if_req.ifr_name, ifname, IF_NAMESIZE - 1); + if_req.ifr_name [IF_NAMESIZE - 1] = '\0'; + + if (ioctl (fd, SIOCGIFFLAGS, &if_req) != 0) { + nm_error("unable to get flags for %s: %s", ifname, g_strerror(errno)); + close(fd); + return; + } + + if (if_req.ifr_flags & IFF_LOOPBACK) { + close(fd); + return; + } + + if (ioctl (fd, SIOCGIFADDR, &if_req) != 0) { + nm_debug("%s: no ip address: %s", ifname, g_strerror(errno)); + close(fd); + return; + } + close(fd); + + nm_debug("%s: %s(%d)", ifname, (inet_ntoa (((struct sockaddr_in *) &if_req.ifr_addr)->sin_addr)), is_connected); + + if (is_connected) { + ++data->unmanaged_active; + } else { + --data->unmanaged_active; + } + nm_dbus_signal_state_change (data->dbus_connection, data); +} Index: network-manager-0.6.6/src/nm-device.h =================================================================== --- network-manager-0.6.6.orig/src/nm-device.h 2008-09-25 22:49:59.000000000 +0800 +++ network-manager-0.6.6/src/nm-device.h 2008-09-28 00:15:59.000000000 +0800 @@ -200,6 +200,9 @@ gboolean nm_device_can_interrupt_activation (NMDevice *self); +void nm_device_update_unmanaged (struct NMData *data, const char *ifname, gboolean is_connected); + + G_END_DECLS #endif /* NM_DEVICE_H */ Index: network-manager-0.6.6/src/nm-netlink-monitor.c =================================================================== --- network-manager-0.6.6.orig/src/nm-netlink-monitor.c 2008-09-25 22:50:04.000000000 +0800 +++ network-manager-0.6.6/src/nm-netlink-monitor.c 2008-09-28 00:15:45.000000000 +0800 @@ -43,6 +43,7 @@ #include "nm-netlink-monitor.h" #include "nm-utils.h" #include "nm-marshal.h" +#include "nm-device.h" #define NM_NETLINK_MONITOR_EVENT_CONDITIONS \ ((GIOCondition) (G_IO_IN | G_IO_PRI)) @@ -740,6 +741,8 @@ 0, dev); } g_object_unref (G_OBJECT (dev)); + } else { + nm_device_update_unmanaged(monitor->priv->app_data, iface, is_connected); } } g_free (iface); Index: network-manager-0.6.6/src/NetworkManager.c =================================================================== --- network-manager-0.6.6.orig/src/NetworkManager.c 2008-09-28 00:25:50.000000000 +0800 +++ network-manager-0.6.6/src/NetworkManager.c 2008-09-28 00:25:54.000000000 +0800 @@ -705,6 +705,7 @@ data->enable_test_devices = enable_test_devices; data->wireless_enabled = TRUE; + data->unmanaged_active = 0; return data; }