diff options
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | introspection/nm-device-802-11-wireless.xml | 1 | ||||
-rw-r--r-- | introspection/nm-device.xml | 2 | ||||
-rw-r--r-- | libnm-glib/nm-device-802-11-wireless.c | 17 | ||||
-rw-r--r-- | libnm-glib/nm-device-802-11-wireless.h | 1 | ||||
-rw-r--r-- | libnm-glib/nm-device.c | 17 | ||||
-rw-r--r-- | libnm-glib/nm-device.h | 1 | ||||
-rw-r--r-- | src/NetworkManagerPolicy.c | 2 | ||||
-rw-r--r-- | src/named-manager/nm-named-manager.c | 4 | ||||
-rw-r--r-- | src/nm-device-802-11-wireless.c | 12 | ||||
-rw-r--r-- | src/nm-device-802-11-wireless.h | 1 | ||||
-rw-r--r-- | src/nm-hal-manager.c | 1 | ||||
-rw-r--r-- | src/nm-manager.c | 19 | ||||
-rw-r--r-- | test/Makefile.am | 3 | ||||
-rw-r--r-- | test/nm-tool.c | 610 |
15 files changed, 328 insertions, 389 deletions
@@ -1,5 +1,31 @@ 2007-03-02 Tambet Ingo <tambet@ximian.com> + * libnm-glib/nm-device-802-11-wireless.c + (nm_device_802_11_wireless_get_capabilities): Implement. + + * libnm-glib/nm-device.c (nm_device_get_capabilities): Implement. + + * src/nm-device-802-11-wireless.c: Add "WirelessCapabilities" property. + + * src/named-manager/nm-named-manager.c (remove_one_zone_from_named): Unref the + reply only if it's not NULL. Not sure why this started happening right now. + + * src/nm-manager.c (device_stop_and_free): Remove. No need to have different + code paths for when devices get removed on shutdown or when a device is just + removed. + (finalize): Don't use a g_slist_foreach() when removing devices, the list data + gets freed so any signal from a device (disconnected for instance) would invoke + NMState update which would crash. + (nm_manager_remove_device): Bring the device down when it gets removed. + + * src/NetworkManagerPolicy.c (nm_policy_auto_get_best_device): Remove + the unused dev_type. + + * src/nm-hal-manager.c (create_device_and_add_to_list): Don't keep the + reference to the added device, NMManager will own it (if it wants). + + * test/nm-tool.c: Rewrite using libnm-glib. + * libnm-glib/nm-device-802-11-wireless.c: Cache networks (bssids) list. We get signalled when it changes. diff --git a/introspection/nm-device-802-11-wireless.xml b/introspection/nm-device-802-11-wireless.xml index 1cf8aa76b3..e43e2eec65 100644 --- a/introspection/nm-device-802-11-wireless.xml +++ b/introspection/nm-device-802-11-wireless.xml @@ -18,6 +18,7 @@ <property name="Mode" type="i" access="read"/> <property name="Bitrate" type="i" access="read"/> <property name="ActiveNetwork" type="o" access="read"/> + <property name="WirelessCapabilities" type="u" access="read"/> <signal name="NetworkAdded"> <arg name="network" type="o"/> diff --git a/introspection/nm-device.xml b/introspection/nm-device.xml index b385738566..49d134d76a 100644 --- a/introspection/nm-device.xml +++ b/introspection/nm-device.xml @@ -9,7 +9,7 @@ <property name="Udi" type="s" access="read"/> <property name="Interface" type="s" access="read"/> <property name="Driver" type="s" access="read"/> - <property name="Capabilities" type="i" access="read"/> + <property name="Capabilities" type="u" access="read"/> <property name="Ip4Address" type="i" access="read"/> <property name="State" type="u" access="read"/> <property name="Ip4Config" type="o" access="read"/> diff --git a/libnm-glib/nm-device-802-11-wireless.c b/libnm-glib/nm-device-802-11-wireless.c index 4e6a1e4f2f..d511ab340e 100644 --- a/libnm-glib/nm-device-802-11-wireless.c +++ b/libnm-glib/nm-device-802-11-wireless.c @@ -161,6 +161,23 @@ nm_device_802_11_wireless_get_bitrate (NMDevice80211Wireless *device) return bitrate; } +guint32 +nm_device_802_11_wireless_get_capabilities (NMDevice80211Wireless *device) +{ + guint32 caps = 0; + GValue value = {0,}; + + g_return_val_if_fail (NM_IS_DEVICE (device), 0); + + if (nm_dbus_get_property (DBUS_G_PROXY (device), + NM_DBUS_INTERFACE_DEVICE_WIRELESS, + "WirelessCapabilities", + &value)) + caps = g_value_get_uint (&value); + + return caps; +} + static NMAccessPoint * get_network (NMDevice80211Wireless *device, const char *path, gboolean create_if_not_found) { diff --git a/libnm-glib/nm-device-802-11-wireless.h b/libnm-glib/nm-device-802-11-wireless.h index cb1b5bcba0..17ddacb995 100644 --- a/libnm-glib/nm-device-802-11-wireless.h +++ b/libnm-glib/nm-device-802-11-wireless.h @@ -31,6 +31,7 @@ NMDevice80211Wireless *nm_device_802_11_wireless_new (DBusGConnection *c char *nm_device_802_11_wireless_get_hw_address (NMDevice80211Wireless *device); int nm_device_802_11_wireless_get_mode (NMDevice80211Wireless *device); int nm_device_802_11_wireless_get_bitrate (NMDevice80211Wireless *device); +guint32 nm_device_802_11_wireless_get_capabilities (NMDevice80211Wireless *device); NMAccessPoint *nm_device_802_11_wireless_get_active_network (NMDevice80211Wireless *device); GSList *nm_device_802_11_wireless_get_networks (NMDevice80211Wireless *device); diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c index b130b8f022..40b577408a 100644 --- a/libnm-glib/nm-device.c +++ b/libnm-glib/nm-device.c @@ -161,6 +161,23 @@ nm_device_get_driver (NMDevice *device) } guint32 +nm_device_get_capabilities (NMDevice *device) +{ + guint32 caps = 0; + GValue value = {0,}; + + g_return_val_if_fail (NM_IS_DEVICE (device), 0); + + if (nm_dbus_get_property (DBUS_G_PROXY (device), + NM_DBUS_INTERFACE_DEVICE, + "Capabilities", + &value)) + caps = g_value_get_uint (&value); + + return caps; +} + +guint32 nm_device_get_ip4_address (NMDevice *device) { guint32 address = 0; diff --git a/libnm-glib/nm-device.h b/libnm-glib/nm-device.h index 0ca6845eaf..d948640ef9 100644 --- a/libnm-glib/nm-device.h +++ b/libnm-glib/nm-device.h @@ -34,6 +34,7 @@ void nm_device_deactivate (NMDevice *device); char *nm_device_get_iface (NMDevice *device); char *nm_device_get_udi (NMDevice *device); char *nm_device_get_driver (NMDevice *device); +guint32 nm_device_get_capabilities (NMDevice *device); guint32 nm_device_get_ip4_address (NMDevice *device); NMIP4Config *nm_device_get_ip4_config (NMDevice *device); NMDeviceState nm_device_get_state (NMDevice *device); diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c index a3d854e2d3..fdcb48c46a 100644 --- a/src/NetworkManagerPolicy.c +++ b/src/NetworkManagerPolicy.c @@ -80,13 +80,11 @@ static NMDevice * nm_policy_auto_get_best_device (NMPolicy *policy, NMAccessPoin return NULL; for (elt = nm_manager_get_devices (policy->manager); elt; elt = elt->next) { - guint dev_type; gboolean link_active; guint prio = 0; NMDevice * dev = (NMDevice *)(elt->data); guint32 caps; - dev_type = nm_device_get_device_type (dev); link_active = nm_device_has_active_link (dev); caps = nm_device_get_capabilities (dev); diff --git a/src/named-manager/nm-named-manager.c b/src/named-manager/nm-named-manager.c index 99c561abe8..23498d4f26 100644 --- a/src/named-manager/nm-named-manager.c +++ b/src/named-manager/nm-named-manager.c @@ -498,7 +498,9 @@ remove_one_zone_from_named (NMNamedManager *mgr, const char *zone) out: if (dbus_error_is_set (&error)) dbus_error_free (&error); - dbus_message_unref (reply); + if (reply) + dbus_message_unref (reply); + return success; } diff --git a/src/nm-device-802-11-wireless.c b/src/nm-device-802-11-wireless.c index 93efa47ab9..37d6350217 100644 --- a/src/nm-device-802-11-wireless.c +++ b/src/nm-device-802-11-wireless.c @@ -79,6 +79,7 @@ enum { PROP_MODE, PROP_BITRATE, PROP_ACTIVE_NETWORK, + PROP_CAPABILITIES, LAST_PROP }; @@ -3048,6 +3049,7 @@ get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { NMDevice80211Wireless *device = NM_DEVICE_802_11_WIRELESS (object); + NMDevice80211WirelessPrivate *priv = NM_DEVICE_802_11_WIRELESS_GET_PRIVATE (device); struct ether_addr hw_addr; char hw_addr_buf[20]; NMAccessPoint *ap; @@ -3066,6 +3068,9 @@ get_property (GObject *object, guint prop_id, case PROP_BITRATE: g_value_set_int (value, nm_device_802_11_wireless_get_bitrate (device)); break; + case PROP_CAPABILITIES: + g_value_set_uint (value, priv->capabilities); + break; case PROP_ACTIVE_NETWORK: req = nm_device_get_act_request (NM_DEVICE (device)); if (req && (ap = nm_act_request_get_ap (req))) { @@ -3140,6 +3145,13 @@ nm_device_802_11_wireless_class_init (NMDevice80211WirelessClass *klass) "Currently active network", G_TYPE_OBJECT, G_PARAM_READABLE)); + g_object_class_install_property + (object_class, PROP_CAPABILITIES, + g_param_spec_uint (NM_DEVICE_802_11_WIRELESS_CAPABILITIES, + "Wireless Capabilities", + "Wireless Capabilities", + 0, G_MAXUINT32, NM_802_11_CAP_NONE, + G_PARAM_READABLE)); /* Signals */ signals[NETWORK_ADDED] = diff --git a/src/nm-device-802-11-wireless.h b/src/nm-device-802-11-wireless.h index 9aef92e3b2..412b95dca4 100644 --- a/src/nm-device-802-11-wireless.h +++ b/src/nm-device-802-11-wireless.h @@ -47,6 +47,7 @@ G_BEGIN_DECLS #define NM_DEVICE_802_11_WIRELESS_MODE "mode" #define NM_DEVICE_802_11_WIRELESS_BITRATE "bitrate" #define NM_DEVICE_802_11_WIRELESS_ACTIVE_NETWORK "active-network" +#define NM_DEVICE_802_11_WIRELESS_CAPABILITIES "wireless-capabilities" #ifndef NM_DEVICE_802_11_WIRELESS_DEFINED #define NM_DEVICE_802_11_WIRELESS_DEFINED diff --git a/src/nm-hal-manager.c b/src/nm-hal-manager.c index 0a9e50ad9e..97baf644d2 100644 --- a/src/nm-hal-manager.c +++ b/src/nm-hal-manager.c @@ -130,6 +130,7 @@ create_device_and_add_to_list (NMHalManager *manager, const char *udi, const cha nm_device_get_iface (dev)); nm_manager_add_device (manager->nm_manager, dev); + g_object_unref (dev); } return dev; diff --git a/src/nm-manager.c b/src/nm-manager.c index a43eda6b3e..bcefaeb14a 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -54,23 +54,13 @@ nm_manager_init (NMManager *manager) } static void -device_stop_and_free (gpointer data, gpointer user_data) -{ - NMDevice *device = NM_DEVICE (data); - - nm_device_interface_deactivate (NM_DEVICE_INTERFACE (device)); - g_object_unref (device); -} - -static void finalize (GObject *object) { - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (object); + NMManager *manager = NM_MANAGER (object); + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager); - g_slist_foreach (priv->devices, - device_stop_and_free, - NULL); - g_slist_free (priv->devices); + while (g_slist_length (priv->devices)) + nm_manager_remove_device (manager, NM_DEVICE (priv->devices->data)); G_OBJECT_CLASS (nm_manager_parent_class)->finalize (object); } @@ -283,6 +273,7 @@ nm_manager_remove_device (NMManager *manager, NMDevice *device) g_signal_handlers_disconnect_by_func (device, manager_device_state_changed, manager); + nm_device_bring_down (device, FALSE); manager_device_removed (manager, device); g_object_unref (device); break; diff --git a/test/Makefile.am b/test/Makefile.am index f0024c4a22..8d3402abe3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,6 +1,7 @@ SUBDIRS=test-common libnm-util INCLUDES = -I${top_srcdir} \ + -I${top_srcdir}/libnm-glib \ -I${top_srcdir}/gnome/libnm_glib \ -I${top_srcdir}/utils \ -I${top_srcdir}/include @@ -23,7 +24,7 @@ noinst_PROGRAMS = nm-tool \ nm_tool_SOURCES = nm-tool.c nm_tool_LDADD = $(DBUS_LIBS) $(GTHREAD_LIBS) $(HAL_LIBS) \ - $(top_builddir)/utils/libnmutils.la + $(top_builddir)/libnm-glib/libnm-glib.la nm_online_SOURCES = nm-online.c nm_online_LDADD = $(DBUS_LIBS) $(GTHREAD_LIBS) $(HAL_LIBS) \ diff --git a/test/nm-tool.c b/test/nm-tool.c index bf60351a58..daca46cb30 100644 --- a/test/nm-tool.c +++ b/test/nm-tool.c @@ -28,68 +28,57 @@ #include <iwlib.h> -#include "NetworkManager.h" -#include "nm-utils.h" +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <nm-client.h> +#include <nm-device.h> +#include <nm-device-802-3-ethernet.h> +#include <nm-device-802-11-wireless.h> -static gboolean get_nm_state (DBusConnection *connection) -{ - dbus_uint32_t uint32_state; - char * state_string = NULL; - gboolean success = TRUE; - DBusMessage * message = NULL; - DBusMessage * reply = NULL; - - if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, NM_DBUS_PATH, NM_DBUS_INTERFACE, "state"))) - { - fprintf (stderr, "get_nm_state(): couldn't create new dbus message.\n"); - return FALSE; - } - reply = dbus_connection_send_with_reply_and_block (connection, message, -1, NULL); - dbus_message_unref (message); - if (!reply) - { - fprintf (stderr, "get_nm_state(): didn't get a reply from NetworkManager.\n"); - return FALSE; - } - if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_UINT32, &uint32_state, DBUS_TYPE_INVALID)) - { - fprintf (stderr, "get_nm_state(): unexpected reply from NetworkManager.\n"); - return FALSE; +static gboolean +get_nm_state (NMClient *client) +{ + NMState state; + char *state_string; + gboolean success = TRUE; + + state = nm_client_get_state (client); + + switch (state) { + case NM_STATE_ASLEEP: + state_string = "asleep"; + break; + + case NM_STATE_CONNECTING: + state_string = "connecting"; + break; + + case NM_STATE_CONNECTED: + state_string = "connected"; + break; + + case NM_STATE_DISCONNECTED: + state_string = "disconnected"; + break; + + case NM_STATE_UNKNOWN: + default: + state_string = "unknown"; + success = FALSE; + break; } - switch ((NMState) uint32_state) - { - case NM_STATE_ASLEEP: - state_string = "asleep"; - break; - - case NM_STATE_CONNECTING: - state_string = "connecting"; - break; - - case NM_STATE_CONNECTED: - state_string = "connected"; - break; - - case NM_STATE_DISCONNECTED: - state_string = "disconnected"; - break; - - case NM_STATE_UNKNOWN: - default: - state_string = "unknown"; - success = FALSE; - break; - } printf ("State: %s\n\n", state_string); return success; } -static void print_string (const char *label, const char *data) +static void +print_string (const char *label, const char *data) { #define SPACING 18 int label_len = 0; @@ -110,375 +99,256 @@ static void print_string (const char *label, const char *data) } -static void detail_network (DBusConnection *connection, const char *path, const char *active_path) +static void +detail_network (gpointer data, gpointer user_data) { - DBusMessage * message = NULL; - DBusMessage * reply = NULL; - const char * op = NULL; - const char * essid = NULL; - const char * hw_addr = NULL; - dbus_int32_t strength = -1; - double freq = 0; - dbus_int32_t rate = 0; - dbus_int32_t capabilities = NM_802_11_CAP_NONE; - dbus_uint32_t mode = 0; - gboolean broadcast = TRUE; - - g_return_if_fail (connection != NULL); - g_return_if_fail (path != NULL); - - if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE_DEVICE, "getProperties"))) - { - fprintf (stderr, "detail_network(): couldn't create new dbus message.\n"); - return; + NMAccessPoint *ap = NM_ACCESS_POINT (data); + const char *active_bssid = (const char *) user_data; + GString *str; + gboolean active = FALSE; + guint32 capabilities; + char *essid; + char *tmp; + + capabilities = nm_access_point_get_capabilities (ap); + + if (active_bssid) { + char *current_bssid = nm_access_point_get_hw_address (ap); + if (current_bssid && !strcmp (current_bssid, active_bssid)) + active = TRUE; + + g_free (current_bssid); } - reply = dbus_connection_send_with_reply_and_block (connection, message, -1, NULL); - dbus_message_unref (message); - if (!reply) - { - fprintf (stderr, "detail_network(): didn't get a reply from NetworkManager for device %s.\n", path); - return; - } + str = g_string_new (NULL); + g_string_append_printf (str, + "%s Mode, Freq %.3f MHz, Rate %d Mb/s, Strength %d", + (nm_access_point_get_mode (ap) == IW_MODE_INFRA) ? "Infrastructure" : "Ad-Hoc", + nm_access_point_get_frequency (ap) / 1000000000, + nm_access_point_get_rate (ap) / 1024, + nm_access_point_get_strength (ap)); - if (dbus_message_get_args (reply, NULL, DBUS_TYPE_OBJECT_PATH, &op, - DBUS_TYPE_STRING, &essid, - DBUS_TYPE_STRING, &hw_addr, - DBUS_TYPE_INT32, &strength, - DBUS_TYPE_DOUBLE, &freq, - DBUS_TYPE_INT32, &rate, - DBUS_TYPE_INT32, &mode, - DBUS_TYPE_INT32, &capabilities, - DBUS_TYPE_BOOLEAN, &broadcast, - DBUS_TYPE_INVALID)) - { - char *temp = NULL; - char *temp_essid = NULL; - float flt_freq = freq / 1000000000; - gboolean active = (active_path && !strcmp (active_path, path)) ? TRUE : FALSE; - GString *enc_string = g_string_new (NULL); - - if (capabilities & NM_802_11_CAP_PROTO_WEP) - enc_string = g_string_append (enc_string, "WEP"); - if (capabilities & NM_802_11_CAP_PROTO_WPA) - { - if (enc_string->str && (strlen (enc_string->str) > 0)) - enc_string = g_string_append_c (enc_string, ' '); - enc_string = g_string_append (enc_string, "WPA"); - } - if (capabilities & NM_802_11_CAP_PROTO_WPA2) - { - if (enc_string->str && (strlen (enc_string->str) > 0)) - enc_string = g_string_append_c (enc_string, ' '); - enc_string = g_string_append (enc_string, "WPA2"); - } - if (capabilities & NM_802_11_CAP_KEY_MGMT_802_1X) - { - if (enc_string->str && (strlen (enc_string->str) > 0)) - enc_string = g_string_append_c (enc_string, ' '); - enc_string = g_string_append (enc_string, "Enterprise"); - } - if (enc_string->str && (strlen (enc_string->str) > 0)) - { - enc_string = g_string_prepend (enc_string, ", Encrypted ("); - enc_string = g_string_append (enc_string, ")"); - } + if (nm_access_point_is_encrypted (ap)) + g_string_append (str, ", Encrypted: "); - temp = g_strdup_printf ("%s Mode, Freq %.3f MHz, Rate %d Mb/s, Strength %d%%%s%s", - (mode == IW_MODE_INFRA) ? "Infrastructure" : "Ad-Hoc", - flt_freq, - rate / 1024, - strength, - (enc_string && strlen (enc_string->str)) ? enc_string->str : "", - !broadcast ? ", Hidden" : ""); - temp_essid = g_strdup_printf (" %s%s", active ? "*" : "", essid); - print_string (temp_essid, temp); - g_string_free (enc_string, TRUE); - g_free (temp_essid); - g_free (temp); - } - else - fprintf (stderr, "detail_network(): unexpected reply from NetworkManager for device %s.\n", path); + if (capabilities & NM_802_11_CAP_PROTO_WEP) + g_string_append (str, " WEP"); + if (capabilities & NM_802_11_CAP_PROTO_WPA) + g_string_append (str, " WPA"); + if (capabilities & NM_802_11_CAP_PROTO_WPA2) + g_string_append (str, " WPA2"); + if (capabilities & NM_802_11_CAP_KEY_MGMT_802_1X) + g_string_append (str, " Enterprise"); - dbus_message_unref (reply); -} + /* FIXME: broadcast/hidden */ + essid = nm_access_point_get_essid (ap); + tmp = g_strdup_printf (" %s%s", active ? "*" : "", essid); + g_free (essid); -static char * -get_driver_name (DBusConnection *connection, const char *path) -{ - DBusMessage * message; - DBusMessage * reply; - char * driver = NULL; - DBusError error; + print_string (tmp, str->str); - g_return_val_if_fail (path != NULL, NULL); + g_string_free (str, TRUE); + g_free (tmp); +} - if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE_DEVICE, "getDriver"))) - { - nm_warning ("%s(): Couldn't allocate the dbus message", __func__); - return NULL; - } +static gchar * +ip4_address_as_string (guint32 ip) +{ + struct in_addr tmp_addr; + gchar *ip_string; - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); - dbus_message_unref (message); - if (dbus_error_is_set (&error)) - dbus_error_free (&error); - else if (reply) - { - if (dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &driver, DBUS_TYPE_INVALID)) - driver = g_strdup (driver); - dbus_message_unref (reply); - } + tmp_addr.s_addr = ip; + ip_string = inet_ntoa (tmp_addr); - return driver; + return g_strdup (ip_string); } - -static void detail_device (DBusConnection *connection, const char *path) +static void +detail_device (gpointer data, gpointer user_data) { - DBusMessage * message = NULL; - DBusMessage * reply = NULL; - char * op = NULL; - const char * iface = NULL; - dbus_uint32_t type = 0; - const char * udi = NULL; - dbus_bool_t active = FALSE; - const char * ip4_address = NULL; - const char * broadcast = NULL; - const char * subnetmask = NULL; - const char * hw_addr = NULL; - const char * route = NULL; - const char * primary_dns = NULL; - const char * secondary_dns = NULL; - dbus_uint32_t mode = 0; - dbus_int32_t strength = -1; - char * active_network_path = NULL; - dbus_bool_t link_active = FALSE; - dbus_int32_t speed = 0; - dbus_uint32_t caps = NM_DEVICE_CAP_NONE; - dbus_uint32_t type_caps = NM_DEVICE_CAP_NONE; - char ** networks = NULL; - int num_networks = 0; - NMActStage act_stage = NM_ACT_STAGE_UNKNOWN; - - g_return_if_fail (connection != NULL); - g_return_if_fail (path != NULL); - - if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE_DEVICE, "getProperties"))) - { - fprintf (stderr, "detail_device(): couldn't create new dbus message.\n"); - return; + NMDevice *device = NM_DEVICE (data); + char *tmp; + NMDeviceState state; + int caps; + int speed; + GArray *array; + + state = nm_device_get_state (device); + + tmp = nm_device_get_iface (device); + printf ("- Device: %s ----------------------------------------------------------------\n", tmp); + g_free (tmp); + + /* General information */ + if (NM_IS_DEVICE_802_3_ETHERNET (device)) + print_string ("Type", "Wired"); + else if (NM_IS_DEVICE_802_11_WIRELESS (device)) + print_string ("Type", "802.11 Wireless"); + + tmp = nm_device_get_driver (device); + if (tmp) { + print_string ("Driver", tmp); + g_free (tmp); + } else + print_string ("Driver", "(unknown)"); + + if (state == NM_DEVICE_STATE_ACTIVATED) + print_string ("Active", "yes"); + else + print_string ("Active", "no"); + + tmp = NULL; + if (NM_IS_DEVICE_802_3_ETHERNET (device)) + tmp = nm_device_802_3_ethernet_get_hw_address (NM_DEVICE_802_3_ETHERNET (device)); + else if (NM_IS_DEVICE_802_11_WIRELESS (device)) + tmp = nm_device_802_11_wireless_get_hw_address (NM_DEVICE_802_11_WIRELESS (device)); + + if (tmp) { + print_string ("HW Address", tmp); + g_free (tmp); } - reply = dbus_connection_send_with_reply_and_block (connection, message, -1, NULL); - dbus_message_unref (message); - if (!reply) - { - fprintf (stderr, "detail_device(): didn't get a reply from NetworkManager for device %s.\n", path); - return; + /* Capabilities */ + caps = nm_device_get_capabilities (device); + printf ("\n Capabilities:\n"); + if (caps & NM_DEVICE_CAP_NM_SUPPORTED) + print_string (" Supported", "yes"); + else + print_string (" Supported", "no"); + if (caps & NM_DEVICE_CAP_CARRIER_DETECT) + print_string (" Carrier Detect", "yes"); + + speed = 0; + if (NM_IS_DEVICE_802_3_ETHERNET (device)) + speed = nm_device_802_3_ethernet_get_speed (NM_DEVICE_802_3_ETHERNET (device)); + else if (NM_IS_DEVICE_802_11_WIRELESS (device)) + speed = nm_device_802_11_wireless_get_bitrate (NM_DEVICE_802_11_WIRELESS (device)); + + if (speed) { + char *speed_string; + + speed_string = g_strdup_printf ("%d Mb/s", speed); + print_string (" Speed", speed_string); + g_free (speed_string); } - if (dbus_message_get_args (reply, NULL, DBUS_TYPE_OBJECT_PATH, &op, - DBUS_TYPE_STRING, &iface, - DBUS_TYPE_UINT32, &type, - DBUS_TYPE_STRING, &udi, - DBUS_TYPE_BOOLEAN,&active, - DBUS_TYPE_UINT32, &act_stage, - DBUS_TYPE_STRING, &ip4_address, - DBUS_TYPE_STRING, &subnetmask, - DBUS_TYPE_STRING, &broadcast, - DBUS_TYPE_STRING, &hw_addr, - DBUS_TYPE_STRING, &route, - DBUS_TYPE_STRING, &primary_dns, - DBUS_TYPE_STRING, &secondary_dns, - DBUS_TYPE_INT32, &mode, - DBUS_TYPE_INT32, &strength, - DBUS_TYPE_BOOLEAN,&link_active, - DBUS_TYPE_INT32, &speed, - DBUS_TYPE_UINT32, &caps, - DBUS_TYPE_UINT32, &type_caps, - DBUS_TYPE_STRING, &active_network_path, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &networks, &num_networks, - DBUS_TYPE_INVALID)) - { - char * driver; - - printf ("- Device: %s ----------------------------------------------------------------\n", iface); - - /* General information */ - print_string ("NM Path", op); - if (type == DEVICE_TYPE_802_11_WIRELESS) - print_string ("Type", "802.11 Wireless"); - else if (type == DEVICE_TYPE_802_3_ETHERNET) - print_string ("Type", "Wired"); - - if ((driver = get_driver_name (connection, path))) - print_string ("Driver", driver); - else - print_string ("Driver", "(unknown)"); - - if (active) - print_string ("Active", "yes"); + /* Wireless specific information */ + if ((NM_IS_DEVICE_802_11_WIRELESS (device))) { + guint32 wireless_caps; + NMAccessPoint *active_ap; + char *active_bssid; + GSList *networks; + + printf ("\n Wireless Settings\n"); + + if (caps & NM_DEVICE_CAP_WIRELESS_SCAN) + print_string (" Scanning", "yes"); + + wireless_caps = nm_device_802_11_wireless_get_capabilities (NM_DEVICE_802_11_WIRELESS (device)); + + if (wireless_caps & NM_802_11_CAP_PROTO_WEP) + print_string (" WEP Encryption", "yes"); + if (wireless_caps & NM_802_11_CAP_PROTO_WPA) + print_string (" WPA Encryption", "yes"); + if (wireless_caps & NM_802_11_CAP_PROTO_WPA2) + print_string (" WPA2 Encryption", "yes"); + + active_ap = nm_device_802_11_wireless_get_active_network (NM_DEVICE_802_11_WIRELESS (device)); + active_bssid = active_ap ? nm_access_point_get_hw_address (active_ap) : NULL; + + printf ("\n Wireless Networks%s\n", active_ap ? "(* = Current Network)" : ""); + + networks = nm_device_802_11_wireless_get_networks (NM_DEVICE_802_11_WIRELESS (device)); + g_slist_foreach (networks, detail_network, active_bssid); + g_free (active_bssid); + g_slist_free (networks); + } else if (NM_IS_DEVICE_802_3_ETHERNET (device)) { + printf ("\n Wired Settings\n"); + /* FIXME */ +#if 0 + if (link_active) + print_string (" Hardware Link", "yes"); else - print_string ("Active", "no"); + print_string (" Hardware Link", "no"); +#endif + } - print_string ("HW Address", hw_addr); + /* IP Setup info */ + if (state == NM_DEVICE_STATE_ACTIVATED) { + NMIP4Config *cfg = nm_device_get_ip4_config (device); - /* Capabilities */ - printf ("\n Capabilities:\n"); - if (caps & NM_DEVICE_CAP_NM_SUPPORTED) - print_string (" Supported", "yes"); - else - print_string (" Supported", "no"); - if (caps & NM_DEVICE_CAP_CARRIER_DETECT) - print_string (" Carrier Detect", "yes"); + printf ("\n IP Settings:\n"); - if (speed) - { - char *speed_string; + tmp = ip4_address_as_string (nm_ip4_config_get_address (cfg)); + print_string (" IP Address", tmp); + g_free (tmp); - speed_string = g_strdup_printf ("%d Mb/s", speed); - print_string (" Speed", speed_string); - g_free (speed_string); - } + tmp = ip4_address_as_string (nm_ip4_config_get_netmask (cfg)); + print_string (" Subnet Mask", tmp); + g_free (tmp); - /* Wireless specific information */ - if (type == DEVICE_TYPE_802_11_WIRELESS) - { - int i; - - printf ("\n Wireless Settings\n"); - - if (caps & NM_DEVICE_CAP_WIRELESS_SCAN) - print_string (" Scanning", "yes"); - - if (type_caps & NM_802_11_CAP_PROTO_WEP) - print_string (" WEP Encryption", "yes"); - if (type_caps & NM_802_11_CAP_PROTO_WPA) - print_string (" WPA Encryption", "yes"); - if (type_caps & NM_802_11_CAP_PROTO_WPA2) - print_string (" WPA2 Encryption", "yes"); - - /* - printf ("\n Wireless Settings\n"); - if (mode == IW_MODE_INFRA) - print_string (" Mode", "Infrastructure"); - else if (mode == IW_MODE_ADHOC) - print_string (" Mode", "Ad-Hoc"); - str_strength = g_strdup_printf ("%d%%", strength); - print_string (" Strength", str_strength); - g_free (str_strength); - */ - - printf ("\n Wireless Networks (* = Current Network)\n"); - for (i = 0; i < num_networks; i++) - detail_network (connection, networks[i], active_network_path); - } - else if (type == DEVICE_TYPE_802_3_ETHERNET) - { - printf ("\n Wired Settings\n"); - if (link_active) - print_string (" Hardware Link", "yes"); - else - print_string (" Hardware Link", "no"); - } + tmp = ip4_address_as_string (nm_ip4_config_get_broadcast (cfg)); + print_string (" Broadcast", tmp); + g_free (tmp); - /* IP Setup info */ - if (active) - { - printf ("\n IP Settings:\n"); - print_string (" IP Address", ip4_address); - print_string (" Subnet Mask", subnetmask); - print_string (" Broadcast", broadcast); - print_string (" Gateway", route); - print_string (" Primary DNS", primary_dns); - print_string (" Secondary DNS", secondary_dns); - } - + tmp = ip4_address_as_string (nm_ip4_config_get_gateway (cfg)); + print_string (" Gateway", tmp); + g_free (tmp); - printf ("\n\n"); - dbus_free_string_array (networks); - } - else - fprintf (stderr, "detail_device(): unexpected reply from NetworkManager for device %s.\n", path); + array = nm_ip4_config_get_nameservers (cfg); + if (array) { + int i; - dbus_message_unref (reply); -} + for (i = 0; i < array->len; i++) { + tmp = ip4_address_as_string (g_array_index (array, guint32, i)); + print_string (" DNS", tmp); + g_free (tmp); + } + g_array_free (array, TRUE); + } -static void print_devices (DBusConnection *connection) -{ - DBusMessage * message = NULL; - DBusMessage * reply = NULL; - DBusError error; - char ** paths = NULL; - int num = -1; - int i; - - if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, NM_DBUS_PATH, NM_DBUS_INTERFACE, "getDevices"))) - { - fprintf (stderr, "print_devices(): couldn't create new dbus message.\n"); - return; + g_object_unref (cfg); } - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); - dbus_message_unref (message); - if (!reply) - { - fprintf (stderr, "print_devices(): didn't get a reply from NetworkManager.\n"); - if (dbus_error_is_set (&error)) - { - if (dbus_error_has_name (&error, NM_DBUS_NO_DEVICES_ERROR)) - fprintf (stderr, "There are no available network devices.\n"); - } - else - fprintf (stderr, "print_devices(): NetworkManager returned an error: '%s'\n", error.message); - return; - } + printf ("\n\n"); +} - if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &paths, &num, DBUS_TYPE_INVALID)) - { - fprintf (stderr, "print_devices(): unexpected reply from NetworkManager.\n"); - dbus_message_unref (reply); - return; - } - for (i = 0; i < num; i++) - detail_device (connection, paths[i]); +static void +print_devices (NMClient *client) +{ + GSList *devices; - dbus_free_string_array (paths); - dbus_message_unref (reply); + devices = nm_client_get_devices (client); + g_slist_foreach (devices, detail_device, NULL); + g_slist_free (devices); } -int main( int argc, char *argv[] ) +int +main (int argc, char *argv[]) { - DBusConnection *connection; - DBusError error; + NMClient *client; g_type_init (); - dbus_error_init (&error); - connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error); - if (connection == NULL) - { - fprintf (stderr, "Error connecting to system bus: %s\n", error.message); - dbus_error_free (&error); - return 1; + client = nm_client_new (); + if (!client) { + exit (1); } printf ("\nNetworkManager Tool\n\n"); - if (!get_nm_state (connection)) - { + if (!get_nm_state (client)) { fprintf (stderr, "\n\nNetworkManager appears not to be running (could not get its state).\n"); exit (1); } - print_devices (connection); + print_devices (client); + + g_object_unref (client); return 0; } |