2004-10-21 Dan Williams <dcbw@redhat.com>

* NetworkManager.h
		- New file, now contains commonly used structures and bits
			for the dbus API of NetworkManager

	* Makefile.am
		- Deliver NetworkManager.h to ${includedir}/NetworkManager

	* src/NetworkManager.h
		- Rename -> src/NetworkManagerMain.c

	* Various fixups all around to use NetworkManager.h and new
		src/NetworkManagerMain.h, remove redundant bits that got
		moved into NetworkManager.h

	* src/NetworkManagerDevice.[ch]
	  src/NetworkManagerUtils.[ch]
	  src/NetworkManagerPolicy.c
	  src/NetworkManagerDbus.c
		- Whitelist wireless drivers, and blacklist some wired
			drivers.  Also blacklist cipsec and ethernet-over-usb
			devices at this time (RH #135722, RH #135648)
		- Don't leak unsupported devices out over dbus, or allow
			them to be set as the active device.  Skip over them
			during automatic device picking

	* test/nmclienttest.c
		- Clean up the dbus code a lot


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@261 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2004-10-21 17:42:14 +00:00
parent d8540834b3
commit faae8945db
28 changed files with 774 additions and 670 deletions

View File

@@ -1,3 +1,33 @@
2004-10-21 Dan Williams <dcbw@redhat.com>
* NetworkManager.h
- New file, now contains commonly used structures and bits
for the dbus API of NetworkManager
* Makefile.am
- Deliver NetworkManager.h to ${includedir}/NetworkManager
* src/NetworkManager.h
- Rename -> src/NetworkManagerMain.c
* Various fixups all around to use NetworkManager.h and new
src/NetworkManagerMain.h, remove redundant bits that got
moved into NetworkManager.h
* src/NetworkManagerDevice.[ch]
src/NetworkManagerUtils.[ch]
src/NetworkManagerPolicy.c
src/NetworkManagerDbus.c
- Whitelist wireless drivers, and blacklist some wired
drivers. Also blacklist cipsec and ethernet-over-usb
devices at this time (RH #135722, RH #135648)
- Don't leak unsupported devices out over dbus, or allow
them to be set as the active device. Skip over them
during automatic device picking
* test/nmclienttest.c
- Clean up the dbus code a lot
Tue Oct 19 14:20:29 2004 Jonathan Blandford <jrb@redhat.com>
* configure.in: post release bump.

View File

@@ -1,7 +1,11 @@
SUBDIRS = src dispatcher-daemon $(notification_icon_dir) info-daemon initscript test po
EXTRA_DIST = CONTRIBUTING NetworkManager.pc.in
EXTRA_DIST = CONTRIBUTING NetworkManager.pc.in NetworkManager.h
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = NetworkManager.pc
NetworkManagerincludedir=$(includedir)/NetworkManager
NetworkManagerinclude_HEADERS = NetworkManager.h

102
NetworkManager.h Normal file
View File

@@ -0,0 +1,102 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2004 Red Hat, Inc.
*/
#ifndef NETWORK_MANAGER_H
#define NETWORK_MANAGER_H
/*
* dbus services details
*/
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH_DEVICES "/org/freedesktop/NetworkManager/Devices"
#define NM_DBUS_INTERFACE_DEVICES "org.freedesktop.NetworkManager.Devices"
#define NMI_DBUS_SERVICE "org.freedesktop.NetworkManagerInfo"
#define NMI_DBUS_PATH "/org/freedesktop/NetworkManagerInfo"
#define NMI_DBUS_INTERFACE "org.freedesktop.NetworkManagerInfo"
/*
* Some common errors
*/
#define NM_DBUS_NO_ACTIVE_NET_ERROR "org.freedesktop.NetworkManager.NoActiveNetwork"
#define NM_DBUS_NO_ACTIVE_DEVICE_ERROR "org.freedesktop.NetworkManager.NoActiveDevice"
#define NM_DBUS_NO_NETWORKS_ERROR "org.freedesktop.NetworkManager.NoNetworks"
/*
* Types of NetworkManager devices
*/
typedef enum NMDeviceType
{
DEVICE_TYPE_DONT_KNOW = 0,
DEVICE_TYPE_WIRED_ETHERNET,
DEVICE_TYPE_WIRELESS_ETHERNET
} NMDeviceType;
/*
* Wireless network types
*/
typedef enum
{
NETWORK_TYPE_UNKNOWN = 0,
NETWORK_TYPE_ALLOWED,
NETWORK_TYPE_INVALID,
NETWORK_TYPE_DEVICE
} NMNetworkType;
/*
* Encryption key types
*/
typedef enum NMEncKeyType
{
NM_ENC_TYPE_UNKNOWN = 0,
NM_ENC_TYPE_NONE,
NM_ENC_TYPE_40_BIT_HEX_KEY,
NM_ENC_TYPE_40_BIT_PASSPHRASE,
NM_ENC_TYPE_128_BIT_HEX_KEY,
NM_ENC_TYPE_128_BIT_PASSPHRASE
/* FIXME: WPA and 802.1x support */
} NMEncKeyType;
/*
* Driver support levels
*/
typedef enum NMDriverSupportLevel
{
NM_DRIVER_UNSUPPORTED = 0,
NM_DRIVER_SEMI_SUPPORTED,
NM_DRIVER_FULLY_SUPPORTED
} NMDriverSupportLevel;
/*
* Info-daemon specific preference locations
*/
#define NMI_GCONF_WIRELESS_NETWORKS_PATH "/system/networking/wireless/networks"
#endif

View File

@@ -256,9 +256,9 @@ int main( int argc, char *argv[] )
* get change notifications for our wireless networking data.
*/
app_info->gconf_client = gconf_client_get_default ();
gconf_client_add_dir (app_info->gconf_client, NMI_GCONF_WIRELESS_NETWORKING_PATH,
gconf_client_add_dir (app_info->gconf_client, NMI_GCONF_WIRELESS_NETWORKS_PATH,
GCONF_CLIENT_PRELOAD_NONE, NULL);
notify_id = gconf_client_notify_add (app_info->gconf_client, NMI_GCONF_WIRELESS_NETWORKING_PATH,
notify_id = gconf_client_notify_add (app_info->gconf_client, NMI_GCONF_WIRELESS_NETWORKS_PATH,
nmi_gconf_notify_callback, app_info, NULL, NULL);
/* Create our own dbus service */

View File

@@ -56,7 +56,4 @@ struct NMIAppInfo
};
typedef struct NMIAppInfo NMIAppInfo;
#define NMI_GCONF_WIRELESS_NETWORKING_PATH "/system/networking/wireless"
#define NMI_GCONF_WIRELESS_NETWORKS_PATH "/system/networking/wireless/networks"
#endif

View File

@@ -31,17 +31,6 @@
#include "NetworkManagerInfoDbus.h"
#include "NetworkManagerInfoPassphraseDialog.h"
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH_DEVICES "/org/freedesktop/NetworkManager/Devices"
#define NM_DBUS_INTERFACE_DEVICES "org.freedesktop.NetworkManager.Devices"
#define NMI_DBUS_SERVICE "org.freedesktop.NetworkManagerInfo"
#define NMI_DBUS_PATH "/org/freedesktop/NetworkManagerInfo"
#define NMI_DBUS_INTERFACE "org.freedesktop.NetworkManagerInfo"
/*
* nmi_network_type_valid
@@ -49,7 +38,7 @@
* Helper to validate network types NMI can deal with
*
*/
inline gboolean nmi_network_type_valid (NMINetworkType type)
inline gboolean nmi_network_type_valid (NMNetworkType type)
{
return ((type == NETWORK_TYPE_ALLOWED));
}
@@ -114,7 +103,7 @@ static void nmi_dbus_get_key_for_network (NMIAppInfo *info, DBusMessage *message
*
*/
void nmi_dbus_return_user_key (DBusConnection *connection, const char *device,
const char *network, const char *passphrase, const char *key_type_string)
const char *network, const char *passphrase, const int key_type)
{
DBusMessage *message;
@@ -133,7 +122,7 @@ void nmi_dbus_return_user_key (DBusConnection *connection, const char *device,
if (dbus_message_append_args (message, DBUS_TYPE_STRING, device,
DBUS_TYPE_STRING, network,
DBUS_TYPE_STRING, passphrase,
DBUS_TYPE_STRING, key_type_string,
DBUS_TYPE_INT32, key_type,
DBUS_TYPE_INVALID))
{
if (!dbus_connection_send (connection, message, NULL))
@@ -151,7 +140,7 @@ void nmi_dbus_return_user_key (DBusConnection *connection, const char *device,
* allowed/ignored network.
*
*/
void nmi_dbus_signal_update_network (DBusConnection *connection, const char *network, NMINetworkType type)
void nmi_dbus_signal_update_network (DBusConnection *connection, const char *network, NMNetworkType type)
{
DBusMessage *message;
@@ -191,7 +180,7 @@ static DBusMessage *nmi_dbus_get_networks (NMIAppInfo *info, DBusMessage *messag
DBusMessage *reply_message = NULL;
DBusMessageIter iter;
DBusMessageIter iter_array;
NMINetworkType type;
NMNetworkType type;
g_return_val_if_fail (info != NULL, NULL);
g_return_val_if_fail (message != NULL, NULL);
@@ -275,7 +264,7 @@ static DBusMessage *nmi_dbus_get_network_timestamp (NMIAppInfo *info, DBusMessag
char *network = NULL;
GConfValue *value;
DBusError error;
NMINetworkType type;
NMNetworkType type;
char *escaped_network;
g_return_val_if_fail (info != NULL, NULL);
@@ -329,7 +318,7 @@ static DBusMessage *nmi_dbus_get_network_essid (NMIAppInfo *info, DBusMessage *m
char *network = NULL;
GConfValue *value;
DBusError error;
NMINetworkType type;
NMNetworkType type;
char *escaped_network;
g_return_val_if_fail (info != NULL, NULL);
@@ -384,7 +373,7 @@ static DBusMessage *nmi_dbus_get_network_key (NMIAppInfo *info, DBusMessage *mes
GConfValue *key_value;
GConfValue *key_type_value;
DBusError error;
NMINetworkType type;
NMNetworkType type;
char *escaped_network;
g_return_val_if_fail (info != NULL, NULL);
@@ -416,10 +405,10 @@ static DBusMessage *nmi_dbus_get_network_key (NMIAppInfo *info, DBusMessage *mes
if (key_value && key_type_value)
{
dbus_message_append_args (reply_message, DBUS_TYPE_STRING, gconf_value_get_string (key_value),
DBUS_TYPE_STRING, gconf_value_get_string (key_type_value), DBUS_TYPE_INVALID);
DBUS_TYPE_INT32, gconf_value_get_int (key_type_value), DBUS_TYPE_INVALID);
}
else
dbus_message_append_args (reply_message, DBUS_TYPE_STRING, "", DBUS_TYPE_STRING, "", DBUS_TYPE_INVALID);
dbus_message_append_args (reply_message, DBUS_TYPE_STRING, "", DBUS_TYPE_INT32, -1, DBUS_TYPE_INVALID);
if (key_value)
gconf_value_free (key_value);
@@ -444,7 +433,7 @@ static DBusMessage *nmi_dbus_get_network_trusted (NMIAppInfo *info, DBusMessage
char *network = NULL;
GConfValue *value;
DBusError error;
NMINetworkType type;
NMNetworkType type;
char *escaped_network;
g_return_val_if_fail (info != NULL, NULL);

View File

@@ -26,17 +26,9 @@
#include <glib.h>
#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
#include "NetworkManager.h"
#include "NetworkManagerInfo.h"
/* MUST match MetworkManager NMNetworkType */
typedef enum
{
NETWORK_TYPE_UNKNOWN = 0,
NETWORK_TYPE_ALLOWED,
NETWORK_TYPE_INVALID,
NETWORK_TYPE_DEVICE
} NMINetworkType;
int nmi_dbus_service_init (DBusConnection *dbus_connection, NMIAppInfo *info);
@@ -45,8 +37,8 @@ const char * nmi_dbus_nm_get_network_essid (DBusConnection *connection, const
gboolean nmi_dbus_nm_get_network_encrypted (DBusConnection *connection, const char *ap_path);
void nmi_dbus_return_user_key (DBusConnection *connection, const char *device,
const char *network, const char *passphrase, const char *key_type_string);
const char *network, const char *passphrase, const int key_type);
void nmi_dbus_signal_update_network (DBusConnection *connection, const char *network, NMINetworkType type);
void nmi_dbus_signal_update_network (DBusConnection *connection, const char *network, NMNetworkType type);
#endif

View File

@@ -132,25 +132,25 @@ void nmi_passphrase_dialog_ok_clicked (GtkWidget *ok_button, gpointer user_data)
const char *device = g_object_get_data (G_OBJECT (dialog), "device");
const char *network = g_object_get_data (G_OBJECT (dialog), "network");
char *key = NULL;
char *key_type_string = NULL;
int key_type_return = NM_ENC_TYPE_UNKNOWN;
GConfEntry *gconf_entry;
char *escaped_network;
switch (key_type)
{
case KEY_TYPE_128_BIT_PASSPHRASE:
key_type_string = "128-bit-passphrase";
key_type_return = NM_ENC_TYPE_128_BIT_PASSPHRASE;
break;
case KEY_TYPE_128_BIT_RAW_HEX_KEY:
key_type_string = "128-bit-raw-hex-key";
key_type_return = NM_ENC_TYPE_128_BIT_HEX_KEY;
break;
default:
key_type_string = "";
key_type_return = NM_ENC_TYPE_UNKNOWN;
break;
}
/* Tell NetworkManager about the key the user typed in */
nmi_dbus_return_user_key (info->connection, device, network, passphrase, key_type_string);
nmi_dbus_return_user_key (info->connection, device, network, passphrase, key_type_return);
/* Update GConf with the new user key */
escaped_network = gnome_vfs_escape_string (network);
@@ -167,7 +167,7 @@ void nmi_passphrase_dialog_ok_clicked (GtkWidget *ok_button, gpointer user_data)
gconf_client_set_string (info->gconf_client, key, network, NULL);
g_free (key);
key = g_strdup_printf ("%s/%s/key_type", NMI_GCONF_WIRELESS_NETWORKS_PATH, escaped_network);
gconf_client_set_string (info->gconf_client, key, key_type_string, NULL);
gconf_client_set_int (info->gconf_client, key, key_type_return, NULL);
g_free (key);
}
g_free (escaped_network);
@@ -196,7 +196,7 @@ void nmi_passphrase_dialog_cancel_clicked (GtkWidget *cancel_button, gpointer us
const char *device = g_object_get_data (G_OBJECT (dialog), "device");
const char *network = g_object_get_data (G_OBJECT (dialog), "network");
nmi_dbus_return_user_key (info->connection, device, network, "***canceled***", "");
nmi_dbus_return_user_key (info->connection, device, network, "***canceled***", NM_ENC_TYPE_UNKNOWN);
nmi_passphrase_dialog_clear (dialog, glade_xml_get_widget (info->passphrase_dialog, "passphrase_entry"));
}
}

View File

@@ -49,7 +49,6 @@
#include "menu-info.h"
#define CFG_UPDATE_INTERVAL 1
#define NM_GCONF_WIRELESS_NETWORKS_PATH "/system/networking/wireless/networks"
static GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet);
static void nmwa_dispose_menu_items (NMWirelessApplet *applet);
@@ -426,12 +425,12 @@ static void nmwa_update_network_timestamp (NMWirelessApplet *applet, const Wirel
*/
/* Update timestamp on network */
key = g_strdup_printf ("%s/%s/timestamp", NM_GCONF_WIRELESS_NETWORKS_PATH, network->essid);
key = g_strdup_printf ("%s/%s/timestamp", NMI_GCONF_WIRELESS_NETWORKS_PATH, network->essid);
gconf_client_set_int (applet->gconf_client, key, time (NULL), NULL);
g_free (key);
/* Force-set the essid too so that we have a semi-complete network entry */
key = g_strdup_printf ("%s/%s/essid", NM_GCONF_WIRELESS_NETWORKS_PATH, network->essid);
key = g_strdup_printf ("%s/%s/essid", NMI_GCONF_WIRELESS_NETWORKS_PATH, network->essid);
gconf_client_set_string (applet->gconf_client, key, network->essid, NULL);
g_free (key);
}

View File

@@ -26,21 +26,7 @@
#include "NMWirelessAppletDbus.h"
#include "NMWirelessApplet.h"
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH_DEVICES "/org/freedesktop/NetworkManager/Devices"
#define NM_DBUS_INTERFACE_DEVICES "org.freedesktop.NetworkManager.Devices"
#define NMI_DBUS_SERVICE "org.freedesktop.NetworkManagerInfo"
#define NMI_DBUS_PATH "/org/freedesktop/NetworkManagerInfo"
#define NMI_DBUS_INTERFACE "org.freedesktop.NetworkManagerInfo"
#define DBUS_NO_SERVICE_ERROR "org.freedesktop.DBus.Error.ServiceDoesNotExist"
#define NM_DBUS_NO_ACTIVE_NET_ERROR "org.freedesktop.NetworkManager.NoActiveNetwork"
#define NM_DBUS_NO_ACTIVE_DEVICE_ERROR "org.freedesktop.NetworkManager.NoActiveDevice"
#define NM_DBUS_NO_NETWORKS_ERROR "org.freedesktop.NetworkManager.NoNetworks"
/* dbus doesn't define a DBUS_TYPE_STRING_ARRAY so we fake one here for consistency */

View File

@@ -24,6 +24,7 @@
#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
#include "NetworkManager.h"
#include "NMWirelessApplet.h"
/* Return codes for functions that use dbus */
@@ -34,13 +35,6 @@ enum
RETURN_NO_NM = -1
};
/* Must match NetworkManager device types */
enum
{
DEVICE_TYPE_DONT_KNOW = 0,
DEVICE_TYPE_WIRED_ETHERNET,
DEVICE_TYPE_WIRELESS_ETHERNET
};
gpointer nmwa_dbus_worker (gpointer user_data);

View File

@@ -65,7 +65,7 @@ static char *nm_get_device_interface_from_hal (LibHalContext *ctx, const char *u
if (hal_device_property_exists (ctx, udi, "net.interface"))
{
/* Only use Ethernet and Wireless devices for now (ie not Sharp Zaurus IP-over-USB connections) */
/* Only use Ethernet and Wireless devices at the moment */
if (hal_device_property_exists (ctx, udi, "info.category"))
{
char *category = hal_device_get_property_string (ctx, udi, "info.category");
@@ -114,11 +114,8 @@ NMDevice * nm_create_device_and_add_to_list (NMData *data, const char *udi, cons
if ((dev = nm_get_device_by_iface (data, iface)))
return (NULL);
if ((dev = nm_device_new (iface, test_device, test_device_type, data)))
if ((dev = nm_device_new (iface, udi, test_device, test_device_type, data)))
{
/* Build up the device structure */
nm_device_set_udi (dev, udi);
/* Attempt to acquire mutex for device list addition. If acquire fails,
* just ignore the device addition entirely.
*/
@@ -172,7 +169,6 @@ void nm_remove_device_from_list (NMData *data, const char *udi)
/* Attempt to acquire mutex for device list deletion. If acquire fails,
* just ignore the device deletion entirely.
*/
fprintf (stderr, "Remove called fro device %s\n", udi);
if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__))
{
element = data->dev_list;

View File

@@ -43,7 +43,7 @@ struct NMAccessPoint
/* Things from user prefs */
char *enc_key;
NMAPEncMethod enc_method;
NMEncKeyType enc_method;
GTimeVal timestamp;
};
@@ -174,7 +174,7 @@ char * nm_ap_get_essid (NMAccessPoint *ap)
return (ap->essid);
}
void nm_ap_set_essid (NMAccessPoint *ap, char * essid)
void nm_ap_set_essid (NMAccessPoint *ap, const char * essid)
{
g_return_if_fail (ap != NULL);
@@ -200,7 +200,7 @@ char * nm_ap_get_enc_key_source (NMAccessPoint *ap)
return (ap->enc_key);
}
void nm_ap_set_enc_key_source (NMAccessPoint *ap, char * key, NMAPEncMethod method)
void nm_ap_set_enc_key_source (NMAccessPoint *ap, char * key, NMEncKeyType method)
{
g_return_if_fail (ap != NULL);
@@ -221,14 +221,15 @@ char *nm_ap_get_enc_key_hashed (NMAccessPoint *ap)
source_key = nm_ap_get_enc_key_source (ap);
switch (ap->enc_method)
{
case (NM_AP_ENC_METHOD_128_BIT_PASSPHRASE):
case (NM_ENC_TYPE_128_BIT_PASSPHRASE):
if (source_key)
hashed = nm_wireless_128bit_key_from_passphrase (source_key);
break;
case (NM_AP_ENC_METHOD_40_BIT_PASSPHRASE):
case (NM_AP_ENC_METHOD_128_BIT_HEX_KEY):
case (NM_AP_ENC_METHOD_UNKNOWN):
case (NM_ENC_TYPE_128_BIT_HEX_KEY):
case (NM_ENC_TYPE_40_BIT_PASSPHRASE):
case (NM_ENC_TYPE_40_BIT_HEX_KEY):
case (NM_ENC_TYPE_UNKNOWN):
if (source_key)
hashed = g_strdup (source_key);
break;
@@ -431,7 +432,7 @@ void nm_ap_set_artificial (NMAccessPoint *ap, gboolean artificial)
* Return the encryption method the user specified for this access point.
*
*/
const NMAPEncMethod nm_ap_get_enc_method (NMAccessPoint *ap)
const NMEncKeyType nm_ap_get_enc_method (NMAccessPoint *ap)
{
g_return_val_if_fail (ap != NULL, TRUE);

View File

@@ -24,19 +24,10 @@
#include <glib.h>
#include <time.h>
#include "NetworkManager.h"
typedef struct NMAccessPoint NMAccessPoint;
typedef enum NMAPEncMethod
{
NM_AP_ENC_METHOD_UNKNOWN = 0,
NM_AP_ENC_METHOD_NONE,
NM_AP_ENC_METHOD_128_BIT_HEX_KEY,
NM_AP_ENC_METHOD_40_BIT_PASSPHRASE,
NM_AP_ENC_METHOD_128_BIT_PASSPHRASE /* Well, 104-bit really... */
} NMAPEncMethod;
NMAccessPoint * nm_ap_new (void);
NMAccessPoint * nm_ap_new_from_ap (NMAccessPoint *ap);
@@ -47,11 +38,11 @@ const GTimeVal * nm_ap_get_timestamp (NMAccessPoint *ap);
void nm_ap_set_timestamp (NMAccessPoint *ap, const GTimeVal *timestamp);
char * nm_ap_get_essid (NMAccessPoint *ap);
void nm_ap_set_essid (NMAccessPoint *ap, char *essid);
void nm_ap_set_essid (NMAccessPoint *ap, const char *essid);
char * nm_ap_get_enc_key_source (NMAccessPoint *ap);
char * nm_ap_get_enc_key_hashed (NMAccessPoint *ap);
void nm_ap_set_enc_key_source (NMAccessPoint *ap, char *key, NMAPEncMethod method);
void nm_ap_set_enc_key_source (NMAccessPoint *ap, char *key, NMEncKeyType type);
gboolean nm_ap_get_encrypted (NMAccessPoint *ap);
void nm_ap_set_encrypted (NMAccessPoint *ap, gboolean encrypted);
@@ -80,6 +71,6 @@ void nm_ap_set_trusted (NMAccessPoint *ap, gboolean trusted);
gboolean nm_ap_get_artificial (NMAccessPoint *ap);
void nm_ap_set_artificial (NMAccessPoint *ap, gboolean artificial);
const NMAPEncMethod nm_ap_get_enc_method (NMAccessPoint *ap);
const NMEncKeyType nm_ap_get_enc_method (NMAccessPoint *ap);
#endif

View File

@@ -280,7 +280,7 @@ void nm_ap_list_update_network (NMAccessPointList *list, const char *network, NM
/* Get the allowed access point's details from NetworkManagerInfo */
if ((essid = nm_dbus_get_network_essid (data->dbus_connection, list->type, network)))
{
NMAPEncMethod enc_method;
NMEncKeyType enc_method;
char *key = nm_dbus_get_network_key (data->dbus_connection, list->type, network, &enc_method);
GTimeVal *timestamp = nm_dbus_get_network_timestamp (data->dbus_connection, list->type, network);
gboolean trusted = nm_dbus_get_network_trusted (data->dbus_connection, list->type, network);
@@ -302,7 +302,7 @@ void nm_ap_list_update_network (NMAccessPointList *list, const char *network, NM
if (key && strlen (key))
nm_ap_set_enc_key_source (ap, key, enc_method);
else
nm_ap_set_enc_key_source (ap, NULL, NM_AP_ENC_METHOD_UNKNOWN);
nm_ap_set_enc_key_source (ap, NULL, NM_ENC_TYPE_UNKNOWN);
if (new)
{

View File

@@ -26,13 +26,6 @@
#include "NetworkManager.h"
#include "NetworkManagerDevice.h"
typedef enum
{
NETWORK_TYPE_UNKNOWN = 0,
NETWORK_TYPE_ALLOWED,
NETWORK_TYPE_INVALID,
NETWORK_TYPE_DEVICE
} NMNetworkType;
typedef struct NMAccessPointList NMAccessPointList;
typedef struct NMAPListIter NMAPListIter;

View File

@@ -63,25 +63,6 @@ static DBusMessage *nm_dbus_create_error_message (DBusMessage *message, const ch
}
/*
* nm_dbus_get_enc_method_from_string
*
* Parse a string and return the encryption method it specifies.
*
*/
NMAPEncMethod nm_dbus_get_enc_method_from_string (const char *key_type)
{
g_return_val_if_fail (key_type != NULL, NM_AP_ENC_METHOD_UNKNOWN);
if (!strcmp (key_type, "128-bit-passphrase"))
return (NM_AP_ENC_METHOD_128_BIT_PASSPHRASE);
else if (!strcmp (key_type, "128-bit-raw-hex-key"))
return (NM_AP_ENC_METHOD_128_BIT_HEX_KEY);
return (NM_AP_ENC_METHOD_UNKNOWN);
}
/*
* nm_dbus_get_object_path_from_device
*
@@ -290,7 +271,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
dev = nm_dbus_get_device_from_object_path (data, dev_path);
dbus_free (dev_path);
if (!dev)
if (!dev || (nm_device_get_driver_support_level (dev) == NM_DRIVER_UNSUPPORTED))
{
reply_message = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "DeviceNotFound",
"The requested network device does not exist.");
@@ -376,7 +357,7 @@ static DBusMessage *nm_dbus_nm_get_devices (DBusConnection *connection, DBusMess
{
NMDevice *dev = (NMDevice *)(element->data);
if (dev)
if (dev && (nm_device_get_driver_support_level (dev) != NM_DRIVER_UNSUPPORTED))
{
char *object_path = g_strdup_printf ("%s/%s", NM_DBUS_PATH_DEVICES, nm_device_get_iface (dev));
dbus_message_iter_append_string (&iter_array, object_path);
@@ -658,7 +639,7 @@ static void nm_dbus_set_user_key_for_network (DBusConnection *connection, DBusMe
char *device;
char *network;
char *passphrase;
char *key_type;
NMEncKeyType key_type;
g_return_if_fail (data != NULL);
g_return_if_fail (connection != NULL);
@@ -669,21 +650,17 @@ static void nm_dbus_set_user_key_for_network (DBusConnection *connection, DBusMe
DBUS_TYPE_STRING, &device,
DBUS_TYPE_STRING, &network,
DBUS_TYPE_STRING, &passphrase,
DBUS_TYPE_STRING, &key_type,
DBUS_TYPE_INT32, &key_type,
DBUS_TYPE_INVALID))
{
NMDevice *dev;
if ((dev = nm_get_device_by_iface (data, device)))
{
NMAPEncMethod method = nm_dbus_get_enc_method_from_string (key_type);
nm_device_set_user_key_for_network (dev, data->invalid_ap_list, network, passphrase, method);
}
nm_device_set_user_key_for_network (dev, data->invalid_ap_list, network, passphrase, key_type);
dbus_free (device);
dbus_free (network);
dbus_free (passphrase);
dbus_free (key_type);
}
}
@@ -780,7 +757,7 @@ char * nm_dbus_get_network_essid (DBusConnection *connection, NMNetworkType type
* NOTE: caller MUST free returned value
*
*/
char * nm_dbus_get_network_key (DBusConnection *connection, NMNetworkType type, const char *network, NMAPEncMethod *enc_method)
char * nm_dbus_get_network_key (DBusConnection *connection, NMNetworkType type, const char *network, NMEncKeyType *enc_method)
{
DBusMessage *message;
DBusError error;
@@ -788,7 +765,7 @@ char * nm_dbus_get_network_key (DBusConnection *connection, NMNetworkType type,
char *key = NULL;
g_return_val_if_fail (enc_method != NULL, NULL);
*enc_method = NM_AP_ENC_METHOD_UNKNOWN;
*enc_method = NM_ENC_TYPE_UNKNOWN;
g_return_val_if_fail (connection != NULL, NULL);
g_return_val_if_fail (network != NULL, NULL);
@@ -820,16 +797,15 @@ char * nm_dbus_get_network_key (DBusConnection *connection, NMNetworkType type,
else
{
char *dbus_key;
char *dbus_key_type;
dbus_error_init (&error);
if (dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dbus_key, DBUS_TYPE_STRING, &dbus_key_type, DBUS_TYPE_INVALID))
if (dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dbus_key, DBUS_TYPE_INT32, enc_method, DBUS_TYPE_INVALID))
{
key = (dbus_key == NULL ? NULL : strdup (dbus_key));
dbus_free (dbus_key);
*enc_method = nm_dbus_get_enc_method_from_string (dbus_key_type);
dbus_free (dbus_key_type);
}
else
*enc_method = NM_ENC_TYPE_UNKNOWN;
if (dbus_error_is_set (&error))
dbus_error_free (&error);

View File

@@ -25,19 +25,9 @@
#include <glib.h>
#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
#include "NetworkManager.h"
#include "NetworkManagerAPList.h"
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH_DEVICES "/org/freedesktop/NetworkManager/Devices"
#define NM_DBUS_INTERFACE_DEVICES "org.freedesktop.NetworkManager.Devices"
#define NMI_DBUS_SERVICE "org.freedesktop.NetworkManagerInfo"
#define NMI_DBUS_PATH "/org/freedesktop/NetworkManagerInfo"
#define NMI_DBUS_INTERFACE "org.freedesktop.NetworkManagerInfo"
typedef enum
{
@@ -68,7 +58,7 @@ void nm_dbus_cancel_get_user_key_for_network (DBusConnection *connection);
char * nm_dbus_get_network_essid (DBusConnection *connection, NMNetworkType type, const char *network);
char * nm_dbus_get_network_key (DBusConnection *connection, NMNetworkType type, const char *network, NMAPEncMethod *enc_method);
char * nm_dbus_get_network_key (DBusConnection *connection, NMNetworkType type, const char *network, NMEncKeyType *enc_method);
GTimeVal * nm_dbus_get_network_timestamp (DBusConnection *connection, NMNetworkType type, const char *network);

View File

@@ -28,6 +28,7 @@
#include <string.h>
#include "NetworkManager.h"
#include "NetworkManagerMain.h"
#include "NetworkManagerDevice.h"
#include "NetworkManagerUtils.h"
#include "NetworkManagerDbus.h"
@@ -48,7 +49,7 @@ static gpointer nm_device_activation_worker (gpointer user_data);
/* Wireless device specific options */
typedef struct NMDeviceWirelessOptions
{
gchar *cur_essid;
char *cur_essid;
gboolean supports_wireless_scan;
guint8 max_quality;
guint8 noise;
@@ -105,9 +106,11 @@ struct NMDevice
{
guint refcount;
gchar *udi;
gchar *iface;
char *udi;
char *iface;
NMDeviceType type;
NMDriverSupportLevel driver_support_level;
gboolean link_active;
guint32 ip4_address;
/* FIXME: ipv6 address too */
@@ -173,7 +176,7 @@ static gboolean nm_device_supports_wireless_scan (NMDevice *dev)
return (TRUE);
iwlib_socket = iw_sockets_open ();
error = iw_scan (iwlib_socket, nm_device_get_iface (dev), WIRELESS_EXT, &scan_data);
error = iw_scan (iwlib_socket, (char *)nm_device_get_iface (dev), WIRELESS_EXT, &scan_data);
nm_dispose_scan_results (scan_data.result);
if ((error == -1) && (errno == EOPNOTSUPP))
can_scan = FALSE;
@@ -266,12 +269,13 @@ NMDevice *nm_get_device_by_iface (NMData *data, const char *iface)
* argument is ignored for real hardware devices since they are auto-probed.
*
*/
NMDevice *nm_device_new (const char *iface, gboolean test_dev, NMDeviceType test_dev_type, NMData *app_data)
NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev, NMDeviceType test_dev_type, NMData *app_data)
{
NMDevice *dev;
g_return_val_if_fail (iface != NULL, NULL);
g_return_val_if_fail (strlen (iface) > 0, NULL);
g_return_val_if_fail (app_data != NULL, NULL);
/* Test devices must have a valid type specified */
if (test_dev && !(test_dev_type != DEVICE_TYPE_DONT_KNOW))
@@ -280,7 +284,7 @@ NMDevice *nm_device_new (const char *iface, gboolean test_dev, NMDeviceType test
/* Another check to make sure we don't create a test device unless
* test devices were enabled on the command line.
*/
if (app_data && !app_data->enable_test_devices && test_dev)
if (!app_data->enable_test_devices && test_dev)
{
syslog (LOG_ERR, "nm_device_new(): attempt to create a test device, but test devices were not enabled"
" on the command line. Will not create the device.\n");
@@ -298,6 +302,7 @@ NMDevice *nm_device_new (const char *iface, gboolean test_dev, NMDeviceType test
dev->app_data = app_data;
dev->iface = g_strdup (iface);
dev->test_device = test_dev;
nm_device_set_udi (dev, udi);
/* Real hardware devices are probed for their type, test devices must have
* their type specified.
@@ -341,6 +346,8 @@ NMDevice *nm_device_new (const char *iface, gboolean test_dev, NMDeviceType test
nm_device_update_best_ap (dev);
}
dev->driver_support_level = nm_get_driver_support_level (dev->app_data->hal_ctx, dev);
/* Grab IP config data for this device from the system configuration files */
nm_device_update_ip4_address (dev);
nm_system_device_update_config_info (dev);
@@ -424,7 +431,7 @@ void nm_device_set_udi (NMDevice *dev, const char *udi)
/*
* Get/set functions for iface
*/
char * nm_device_get_iface (NMDevice *dev)
const char * nm_device_get_iface (NMDevice *dev)
{
g_return_val_if_fail (dev != NULL, NULL);
@@ -457,6 +464,17 @@ gboolean nm_device_is_wired (NMDevice *dev)
}
/*
* Accessor for driver support level
*/
NMDriverSupportLevel nm_device_get_driver_support_level (NMDevice *dev)
{
g_return_val_if_fail (dev != NULL, NM_DRIVER_UNSUPPORTED);
return (dev->driver_support_level);
}
/*
* Get/set functions for link_active
*/
@@ -1665,7 +1683,7 @@ gboolean nm_device_is_scanning (NMDevice *dev)
*/
void nm_device_set_user_key_for_network (NMDevice *dev, NMAccessPointList *invalid_list,
unsigned char *network, unsigned char *key,
NMAPEncMethod enc_method)
NMEncKeyType enc_method)
{
NMAccessPoint *best_ap;
const char *cancel_message = "***canceled***";
@@ -2195,7 +2213,7 @@ static void nm_device_do_normal_scan (NMDevice *dev)
NMAPListIter *iter;
NMAccessPoint *artificial_ap;
err = iw_scan (iwlib_socket, nm_device_get_iface (dev), WIRELESS_EXT, &scan_results);
err = iw_scan (iwlib_socket, (char *)nm_device_get_iface (dev), WIRELESS_EXT, &scan_results);
if ((err == -1) && (errno == ENODATA))
{
/* Card hasn't had time yet to compile full access point list.
@@ -2203,7 +2221,7 @@ static void nm_device_do_normal_scan (NMDevice *dev)
* give up.
*/
g_usleep (G_USEC_PER_SEC / 2);
err = iw_scan (iwlib_socket, nm_device_get_iface (dev), WIRELESS_EXT, &scan_results);
err = iw_scan (iwlib_socket, (char *)nm_device_get_iface (dev), WIRELESS_EXT, &scan_results);
if (err == -1)
{
close (iwlib_socket);

View File

@@ -24,10 +24,11 @@
#include <net/ethernet.h>
#include "NetworkManager.h"
#include "NetworkManagerMain.h"
typedef struct NMDevice NMDevice;
NMDevice * nm_device_new (const char *iface, gboolean test_device,
NMDevice * nm_device_new (const char *iface, const char *udi, gboolean test_device,
NMDeviceType test_dev_type, NMData *app_data);
void nm_device_ref (NMDevice *dev);
@@ -36,9 +37,11 @@ void nm_device_unref (NMDevice *dev);
char * nm_device_get_udi (NMDevice *dev);
void nm_device_set_udi (NMDevice *dev, const char *udi);
char * nm_device_get_iface (NMDevice *dev);
const char * nm_device_get_iface (NMDevice *dev);
NMDeviceType nm_device_get_type (NMDevice *dev);
NMDriverSupportLevel nm_device_get_driver_support_level (NMDevice *dev);
gboolean nm_device_is_wireless (NMDevice *dev);
gboolean nm_device_is_wired (NMDevice *dev);
/* There is no nm_device_set_iface_type() because that's determined when you set the device's iface */
@@ -96,7 +99,7 @@ gboolean nm_device_find_and_use_essid (NMDevice *dev, const char *essid);
void nm_device_set_user_key_for_network (NMDevice *dev, struct NMAccessPointList *invalid_list,
unsigned char *network, unsigned char *key,
NMAPEncMethod enc_method);
NMEncKeyType enc_method);
void nm_device_bring_up (NMDevice *dev);
void nm_device_bring_down (NMDevice *dev);

View File

@@ -19,13 +19,14 @@
* (C) Copyright 2004 Red Hat, Inc.
*/
#ifndef NETWORK_MANAGER_H
#define NETWORK_MANAGER_H
#ifndef NETWORK_MANAGER_MAIN_H
#define NETWORK_MANAGER_MAIN_H
#include <glib.h>
#include <glib/gthread.h>
#include <dbus/dbus.h>
#include <hal/libhal.h>
#include "NetworkManager.h"
#include "NetworkManagerAP.h"
typedef struct NMData
@@ -53,16 +54,6 @@ typedef struct NMData
struct NMAccessPointList *invalid_ap_list;
} NMData;
/*
* Types of NetworkManager devices
*/
typedef enum NMDeviceType
{
DEVICE_TYPE_DONT_KNOW = 0,
DEVICE_TYPE_WIRED_ETHERNET,
DEVICE_TYPE_WIRELESS_ETHERNET
} NMDeviceType;
struct NMDevice *nm_create_device_and_add_to_list (NMData *data, const char *udi, const char *iface,
gboolean test_device, NMDeviceType test_device_type);

View File

@@ -66,6 +66,13 @@ static NMDevice * nm_policy_auto_get_best_device (NMData *data)
dev = (NMDevice *)(element->data);
/* Skip unsupported devices */
if (nm_device_get_driver_support_level (dev) == NM_DRIVER_UNSUPPORTED)
{
element = g_slist_next (element);
continue;
}
dev_type = nm_device_get_type (dev);
link_active = nm_device_get_link_active (dev);
@@ -211,6 +218,13 @@ static NMDevice * nm_policy_get_best_device (NMData *data, gboolean *should_lock
best_dev = nm_policy_auto_get_best_device (data);
}
/* Ensure we support this driver */
if (best_dev && (nm_device_get_driver_support_level (best_dev) == NM_DRIVER_UNSUPPORTED))
{
syslog (LOG_ERR, "nm_policy_get_best_device(): tried to switch to unsupported device '%s'!\n", nm_device_get_iface (best_dev));
best_dev == NULL;
}
return (best_dev);
}

View File

@@ -210,3 +210,282 @@ int nm_spawn_process (char *args)
return (-1);
}
typedef struct driver_support
{
char *name;
NMDriverSupportLevel level;
} driver_support;
/* The list of wireless drivers we support and how well we support each */
static driver_support wireless_driver_support_list[] =
{
/* Fully supported drivers */
{"airo_cs", NM_DRIVER_FULLY_SUPPORTED},
{"airo", NM_DRIVER_FULLY_SUPPORTED},
{"atmel_cs", NM_DRIVER_FULLY_SUPPORTED},
{"atmel", NM_DRIVER_FULLY_SUPPORTED},
{"atmel_pci", NM_DRIVER_FULLY_SUPPORTED},
{"prism54", NM_DRIVER_FULLY_SUPPORTED},
{"wl3501_cs", NM_DRIVER_FULLY_SUPPORTED},
{"ipw2100", NM_DRIVER_FULLY_SUPPORTED},
{"ipw2200", NM_DRIVER_FULLY_SUPPORTED},
{"ath_pci", NM_DRIVER_FULLY_SUPPORTED},
{"ath_cs", NM_DRIVER_FULLY_SUPPORTED},
/* Semi-supported drivers, for example ones that don't support
* wireless scanning yet in-kernel
*/
{"hermes", NM_DRIVER_SEMI_SUPPORTED},
{"netwave_cs", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_cs", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_pci", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_plx", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_tmd", NM_DRIVER_SEMI_SUPPORTED},
{"wavelan_cs", NM_DRIVER_SEMI_SUPPORTED},
{"wavelan", NM_DRIVER_SEMI_SUPPORTED},
{NULL, NM_DRIVER_UNSUPPORTED}
};
/* Blacklist of unsupported wired drivers */
static driver_support wired_driver_blacklist[] =
{
/* Completely unsupported drivers */
{NULL, NM_DRIVER_UNSUPPORTED}
};
/*
* nm_get_device_driver_name
*
* Checks either /proc/sys/bus/devices or /var/lib/pcmcia/stab to determine
* which driver is bound to the device.
*
*/
char *nm_get_device_driver_name (LibHalContext *ctx, NMDevice *dev)
{
FILE *f;
char *driver_name = NULL;
int vendor;
int product;
g_return_val_if_fail (ctx != NULL, NULL);
g_return_val_if_fail (dev != NULL, NULL);
vendor = hal_device_get_property_int (ctx, nm_device_get_udi (dev), "pci.vendor_id");
product = hal_device_get_property_int (ctx, nm_device_get_udi (dev), "pci.product_id");
if (vendor && product)
{
if ((f = fopen ("/proc/bus/pci/devices", "r")))
{
char buf[200];
char id[9];
snprintf (&id[0], 9, "%4X%4X", vendor, product);
id[8] = '\0';
while (fgets (&buf[0], 200, f) && !feof (f))
{
char *p;
char s[9];
int len;
/* Whack newline */
buf[199] = '\0';
len = strlen (buf);
if ((buf[len-1] == '\n') || (buf[len-1] == '\r'))
{
buf[len-1] = '\0';
len--;
}
p = strchr (buf, '\t');
s[8] = '\0';
strncpy (&s[0], p+1, 8);
if (!strcmp (&s[0], &id[0]))
{
/* Yay, we've got a match. Pull the driver name from the
* last word in the line.
*/
char *m = strrchr (&buf[0], '\t');
if (m && (m > &buf[0]) && (m < &buf[len]))
{
driver_name = strdup (m+1);
syslog (LOG_INFO, "PCI driver for '%s' is '%s'", nm_device_get_iface (dev), driver_name);
break;
}
}
}
fclose (f);
}
}
/* Might be a PCMCIA card, try /var/lib/pcmcia/stab and match the interface name.
*
* stab has a format like this:
* Socket 0: Belkin F5D6020 rev.2
* 0 network atmel_cs 0 eth2
* Socket 1: Belkin-5020
* 1 network pcnet_cs 0 eth1
*/
if (!driver_name && (f = fopen ("/var/lib/pcmcia/stab", "r")))
{
char buf[200];
while (fgets (&buf[0], 200, f) && !feof (f))
{
int len;
char *p;
/* Whack newline */
buf[199] = '\0';
len = strlen (buf);
if ((buf[len-1] == '\n') || (buf[len-1] == '\r'))
{
buf[len-1] = '\0';
len--;
}
/* Ignore lines that start with "Socket" */
if (strncmp (&buf[0], "Socket", 6) && (p = strrchr (&buf[0], '\t')))
{
/* See if this device's interface matches our device's interface */
if (!strcmp (++p, nm_device_get_iface (dev)))
{
char *end;
/* Pull out driver name by seeking to _second_ tab */
if ((p = strchr (&buf[0], '\t')) && *(p++) && (p = strchr (p, '\t')))
{
p++;
end = strchr (p, '\t');
if (p && end)
{
*end = '\0';
driver_name = strdup (p);
syslog (LOG_INFO, "PCMCIA driver for '%s' is '%s'", nm_device_get_iface (dev), driver_name);
}
}
}
}
}
fclose (f);
}
return (driver_name);
}
/*
* nm_get_wireless_driver_support_level
*
* Checks either /proc/sys/bus/devices or /var/lib/pcmcia/stab to determine
* wether or not the card's driver is supported and how well, using a whitelist.
*
*/
NMDriverSupportLevel nm_get_wireless_driver_support_level (LibHalContext *ctx, NMDevice *dev)
{
NMDriverSupportLevel level = NM_DRIVER_UNSUPPORTED;
char *driver_name = NULL;
g_return_val_if_fail (ctx != NULL, FALSE);
g_return_val_if_fail (dev != NULL, FALSE);
if ((driver_name = nm_get_device_driver_name (ctx, dev)))
{
driver_support *driver = &wireless_driver_support_list[0];
while (driver->name != NULL)
{
if (!strcmp (driver->name, driver_name))
{
level = driver->level;
break;
}
driver++;
}
g_free (driver_name);
}
return (level);
}
/*
* nm_get_wired_driver_support_level
*
* Blacklist certain devices.
*
*/
NMDriverSupportLevel nm_get_wired_driver_support_level (LibHalContext *ctx, NMDevice *dev)
{
NMDriverSupportLevel level = NM_DRIVER_FULLY_SUPPORTED;
char *driver_name = NULL;
char *usb_test;
g_return_val_if_fail (ctx != NULL, FALSE);
g_return_val_if_fail (dev != NULL, FALSE);
if ((driver_name = nm_get_device_driver_name (ctx, dev)))
{
driver_support *driver = &wired_driver_blacklist[0];
while (driver->name != NULL)
{
if (!strcmp (driver->name, driver_name))
{
level = driver->level;
break;
}
driver++;
}
g_free (driver_name);
}
/* cipsec devices are also explicitly unsupported at this time */
if (strstr (nm_device_get_iface (dev), "cipsec"))
level = NM_DRIVER_UNSUPPORTED;
/* Ignore Ethernet-over-USB devices too for the moment (Red Hat #135722) */
if ((usb_test = hal_device_get_property_string (ctx, nm_device_get_udi (dev), "usb.interface.class")))
{
hal_free_string (usb_test);
level = NM_DRIVER_UNSUPPORTED;
}
return (level);
}
/*
* nm_get_driver_support_level
*
* Return the driver support level for a particular device.
*
*/
NMDriverSupportLevel nm_get_driver_support_level (LibHalContext *ctx, NMDevice *dev)
{
NMDriverSupportLevel level = NM_DRIVER_UNSUPPORTED;
g_return_val_if_fail (ctx != NULL, NM_DRIVER_UNSUPPORTED);
g_return_val_if_fail (dev != NULL, NM_DRIVER_UNSUPPORTED);
if (nm_device_is_wireless (dev))
level = nm_get_wireless_driver_support_level (ctx, dev);
else if (nm_device_is_wired (dev))
level = nm_get_wired_driver_support_level (ctx, dev);
switch (level)
{
case NM_DRIVER_SEMI_SUPPORTED:
syslog (LOG_INFO, "%s: Driver support level is semi-supported", nm_device_get_iface (dev));
break;
case NM_DRIVER_FULLY_SUPPORTED:
syslog (LOG_INFO, "%s: Driver support level is fully-supported", nm_device_get_iface (dev));
break;
default:
syslog (LOG_INFO, "%s: Driver support level is unsupported", nm_device_get_iface (dev));
break;
}
return (level);
}

View File

@@ -29,8 +29,10 @@
#include <iwlib.h>
#include "NetworkManager.h"
#include "NetworkManagerMain.h"
#include "NetworkManagerDevice.h"
gboolean nm_try_acquire_mutex (GMutex *mutex, const char *func);
void nm_unlock_mutex (GMutex *mutex, const char *func);
@@ -44,4 +46,6 @@ void nm_dispose_scan_results (wireless_scan *result_list);
int nm_spawn_process (char *args);
NMDriverSupportLevel nm_get_driver_support_level (LibHalContext *ctx, NMDevice *dev);
#endif

View File

@@ -58,7 +58,7 @@ void nm_system_init (void)
gboolean nm_system_device_run_dhcp (NMDevice *dev)
{
char *buf;
char *iface;
const char *iface;
int err;
g_return_val_if_fail (dev != NULL, FALSE);
@@ -204,7 +204,7 @@ gboolean nm_system_device_setup_static_ip4_config (NMDevice *dev)
guint32 broadcast;
char *buf;
int err;
char *iface;
const char *iface;
g_return_val_if_fail (dev != NULL, FALSE);
g_return_val_if_fail (!nm_device_config_get_use_dhcp (dev), FALSE);

View File

@@ -24,438 +24,245 @@
#include <dbus/dbus-glib.h>
#include <stdio.h>
#include "NetworkManager.h"
/* Return codes for functions that use dbus */
enum
{
RETURN_SUCCESS = 1,
RETURN_FAILURE = 0,
RETURN_NO_NM = -1
};
/* dbus doesn't define a DBUS_TYPE_STRING_ARRAY so we fake one here for consistency */
#define DBUS_TYPE_STRING_ARRAY ((int) '$')
#define DBUS_NO_SERVICE_ERROR "org.freedesktop.DBus.Error.ServiceDoesNotExist"
/*
* nmwa_dbus_call_nm_method
*
* Do a method call on NetworkManager.
*
* Returns: RETURN_SUCCESS on success
* RETURN_FAILURE on failure
* RETURN_NO_NM if NetworkManager service no longer exists
*/
static int nmwa_dbus_call_nm_method (DBusConnection *con, const char *path, const char *method, int arg_type, void **arg, int *item_count)
{
DBusMessage *message;
DBusMessage *reply;
DBusError error;
char *dbus_string = NULL;
int dbus_int = 0;
gboolean dbus_bool = FALSE;
char **dbus_string_array = NULL;
int num_items = 0;
dbus_bool_t ret = TRUE;
DBusMessageIter iter;
g_return_val_if_fail (con != NULL, RETURN_FAILURE);
g_return_val_if_fail (path != NULL, RETURN_FAILURE);
g_return_val_if_fail (method != NULL, RETURN_FAILURE);
g_return_val_if_fail (((arg_type == DBUS_TYPE_STRING) || (arg_type == DBUS_TYPE_INT32) || (arg_type == DBUS_TYPE_BOOLEAN) || (arg_type == DBUS_TYPE_STRING_ARRAY)), RETURN_FAILURE);
g_return_val_if_fail (arg != NULL, RETURN_FAILURE);
if ((arg_type == DBUS_TYPE_STRING) || (arg_type == DBUS_TYPE_STRING_ARRAY))
g_return_val_if_fail (*arg == NULL, RETURN_FAILURE);
if (arg_type == DBUS_TYPE_STRING_ARRAY)
{
g_return_val_if_fail (item_count != NULL, RETURN_FAILURE);
*item_count = 0;
*((char **)arg) = NULL;
}
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
{
fprintf (stderr, "nmwa_dbus_call_nm_method(): Couldn't allocate the dbus message\n");
return (RETURN_FAILURE);
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (con, message, -1, &error);
dbus_message_unref (message);
if (dbus_error_is_set (&error))
{
int ret = RETURN_FAILURE;
if (!strcmp (error.name, DBUS_NO_SERVICE_ERROR))
ret = RETURN_NO_NM;
else if (!strcmp (error.name, NM_DBUS_NO_ACTIVE_NET_ERROR))
ret = RETURN_SUCCESS;
else if (!strcmp (error.name, NM_DBUS_NO_ACTIVE_DEVICE_ERROR))
ret = RETURN_SUCCESS;
else if (!strcmp (error.name, NM_DBUS_NO_NETWORKS_ERROR))
ret = RETURN_SUCCESS;
if (ret != RETURN_SUCCESS)
fprintf (stderr, "nmwa_dbus_call_nm_method(): %s raised:\n %s\n\n", error.name, error.message);
dbus_error_free (&error);
return (ret);
}
if (reply == NULL)
{
fprintf (stderr, "nmwa_dbus_call_nm_method(): dbus reply message was NULL\n" );
return (RETURN_FAILURE);
}
dbus_error_init (&error);
switch (arg_type)
{
case DBUS_TYPE_STRING:
ret = dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dbus_string, DBUS_TYPE_INVALID);
break;
case DBUS_TYPE_STRING_ARRAY:
dbus_message_iter_init (reply, &iter);
ret = dbus_message_iter_get_string_array (&iter, &dbus_string_array, &num_items);
break;
case DBUS_TYPE_INT32:
ret = dbus_message_get_args (reply, &error, DBUS_TYPE_INT32, &dbus_int, DBUS_TYPE_INVALID);
break;
case DBUS_TYPE_BOOLEAN:
ret = dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, &dbus_bool, DBUS_TYPE_INVALID);
break;
default:
fprintf (stderr, "nmwa_dbus_call_nm_method(): Unknown argument type!\n");
ret = FALSE;
break;
}
if (!ret)
{
fprintf (stderr, "nmwa_dbus_call_nm_method(): error while getting args: name='%s' message='%s'\n", error.name, error.message);
if (dbus_error_is_set (&error))
dbus_error_free (&error);
dbus_message_unref (reply);
return (RETURN_FAILURE);
}
dbus_message_unref (reply);
switch (arg_type)
{
case DBUS_TYPE_STRING:
*((char **)(arg)) = dbus_string;
break;
case DBUS_TYPE_STRING_ARRAY:
*((char ***)(arg)) = dbus_string_array;
*item_count = num_items;
break;
case DBUS_TYPE_INT32:
*((int *)(arg)) = dbus_int;
break;
case DBUS_TYPE_BOOLEAN:
*((gboolean *)(arg)) = dbus_bool;
break;
default:
g_assert_not_reached ();
break;
}
return (RETURN_SUCCESS);
}
char * get_active_device (DBusConnection *connection)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
char *device_path;
int ret;
char *active_device = NULL;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager",
"org.freedesktop.NetworkManager",
"getActiveDevice");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return NULL;
}
ret = nmwa_dbus_call_nm_method (connection, NM_DBUS_PATH, "getActiveDevice", DBUS_TYPE_STRING, (void *)(&active_device), NULL);
if (ret == RETURN_SUCCESS)
return (active_device);
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return NULL;
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return NULL;
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
char *string;
string = dbus_message_iter_get_string (&iter);
if (!string)
{
fprintf (stderr, "NetworkManager returned a NULL active device object path" );
return NULL;
}
fprintf (stderr, "Active device: '%s'\n", string );
dbus_message_unref (reply);
dbus_message_unref (message);
device_path = g_strdup (string);
return (device_path);
return (NULL);
}
void get_device_name (DBusConnection *connection, char *path)
char * get_object_name (DBusConnection *connection, char *path)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
int ret;
char *name = NULL;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
path,
"org.freedesktop.NetworkManager",
"getName");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return;
}
ret = nmwa_dbus_call_nm_method (connection, path, "getName", DBUS_TYPE_STRING, (void *)(&name), NULL);
if (ret == RETURN_SUCCESS)
return (name);
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return;
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return;
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
char *string;
string = dbus_message_iter_get_string (&iter);
if (!string)
{
fprintf (stderr, "NetworkManager returned a NULL active device object path" );
return;
}
fprintf (stderr, "Active device name: '%s'\n", string );
dbus_message_unref (reply);
dbus_message_unref (message);
return (NULL);
}
int get_object_signal_strength (DBusConnection *connection, char *path)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
int ret;
int strength = -1;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
path,
"org.freedesktop.NetworkManager.Devices",
"getStrength");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return (0);
}
ret = nmwa_dbus_call_nm_method (connection, path, "getStrength", DBUS_TYPE_INT32, (void *)(&strength), NULL);
if (ret == RETURN_SUCCESS)
return (strength);
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))
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
return (0);
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
return (0);
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
int qual = dbus_message_iter_get_int32 (&iter);
dbus_message_unref (reply);
return (qual);
return (-1);
}
void get_nm_status (DBusConnection *connection)
char * get_nm_status (DBusConnection *connection)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
int ret;
char *status = NULL;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager",
"org.freedesktop.NetworkManager",
"status");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return;
ret = nmwa_dbus_call_nm_method (connection, NM_DBUS_PATH, "status", DBUS_TYPE_STRING, (void *)(&status), NULL);
if (ret == RETURN_SUCCESS)
return (status);
return (NULL);
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
char * get_device_active_network (DBusConnection *connection, char *path)
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return;
}
int ret;
char *net = NULL;
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return;
}
ret = nmwa_dbus_call_nm_method (connection, path, "getActiveNetwork", DBUS_TYPE_STRING, (void *)(&net), NULL);
if (ret == RETURN_SUCCESS)
return (net);
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
char *string;
string = dbus_message_iter_get_string (&iter);
if (!string)
{
fprintf (stderr, "NetworkManager returned a NULL status" );
return;
}
fprintf (stderr, "NM Status: '%s'\n", string );
dbus_message_unref (reply);
dbus_message_unref (message);
}
void get_device_active_network (DBusConnection *connection, char *path)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
path,
"org.freedesktop.NetworkManager",
"getActiveNetwork");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return;
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
{
if (strstr (error.name, "NoActiveNetwork"))
fprintf (stderr, " This device is not associated with a wireless network\n");
else
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return;
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return;
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
char *string;
string = dbus_message_iter_get_string (&iter);
if (!string)
{
fprintf (stderr, "NetworkManager returned a NULL active device object path" );
return;
}
fprintf (stderr, "Active device's Network: '%s' ", string );
dbus_message_unref (reply);
dbus_message_unref (message);
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
string,
"org.freedesktop.NetworkManager",
"getName");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return;
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return;
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return;
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
string = dbus_message_iter_get_string (&iter);
if (!string)
{
fprintf (stderr, "NetworkManager returned a NULL active device object path" );
return;
}
fprintf (stderr, " (%s)\n", string );
dbus_message_unref (reply);
dbus_message_unref (message);
return (NULL);
}
int get_device_type (DBusConnection *connection, char *path)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
path,
"org.freedesktop.NetworkManager",
"getType");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return (-1);
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return (-1);
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return (-1);
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
int type = dbus_message_iter_get_int32 (&iter);
dbus_message_unref (reply);
dbus_message_unref (message);
int ret;
int type = -1;
ret = nmwa_dbus_call_nm_method (connection, path, "getType", DBUS_TYPE_INT32, (void *)(&type), NULL);
if (ret == RETURN_SUCCESS)
return (type);
return (-1);
}
const char * get_network_name (DBusConnection *connection, const char *path)
void print_device_networks (DBusConnection *connection, const char *path)
{
DBusMessage *message2;
DBusMessage *reply2;
DBusMessageIter iter2;
DBusError error2;
message2 = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
path,
"org.freedesktop.NetworkManager",
"getName");
if (message2 == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return (NULL);
}
dbus_error_init (&error2);
reply2 = dbus_connection_send_with_reply_and_block (connection, message2, -1, &error2);
dbus_message_unref (message2);
if (dbus_error_is_set (&error2))
{
fprintf (stderr, "%s raised:\n %s\n\n", error2.name, error2.message);
return (NULL);
}
if (reply2 == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
return (NULL);
}
/* now analyze reply */
dbus_message_iter_init (reply2, &iter2);
const char *string2 = dbus_message_iter_get_string (&iter2);
if (!string2)
{
fprintf (stderr, "NetworkManager returned a NULL network name" );
return (NULL);
}
dbus_message_unref (reply2);
return (string2);
}
void get_device_networks (DBusConnection *connection, const char *path)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
path,
"org.freedesktop.NetworkManager",
"getNetworks");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return;
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return;
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return;
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
char **networks;
int num_networks;
if (!dbus_message_iter_get_string_array (&iter, &networks, &num_networks))
{
fprintf (stderr, "NetworkManager returned no device list" );
return;
}
dbus_message_unref (reply);
dbus_message_unref (message);
int ret;
char **networks = NULL;
int num_networks = 0;
int i;
ret = nmwa_dbus_call_nm_method (connection, path, "getNetworks", DBUS_TYPE_STRING_ARRAY, (void **)(&networks), &num_networks);
if (ret != RETURN_SUCCESS)
return;
fprintf( stderr, " Networks:\n" );
for (i = 0; i < num_networks; i++)
{
const char *name = get_network_name (connection, networks[i]);
char *name = get_object_name (connection, networks[i]);
fprintf( stderr, " %s (%s) Strength: %d%%\n", networks[i], name,
get_object_signal_strength (connection, networks[i]) );
@@ -466,75 +273,41 @@ void get_device_networks (DBusConnection *connection, const char *path)
}
void get_devices (DBusConnection *connection)
void print_devices (DBusConnection *connection)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
message = dbus_message_new_method_call ("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager",
"org.freedesktop.NetworkManager",
"getDevices");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
return;
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
if (dbus_error_is_set (&error))
{
fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message);
dbus_message_unref (message);
return;
}
if (reply == NULL)
{
fprintf( stderr, "dbus reply message was NULL\n" );
dbus_message_unref (message);
return;
}
/* now analyze reply */
dbus_message_iter_init (reply, &iter);
char **devices;
int num_devices;
if (!dbus_message_iter_get_string_array (&iter, &devices, &num_devices))
{
fprintf (stderr, "NetworkManager returned no device list" );
return;
}
dbus_message_unref (reply);
dbus_message_unref (message);
int ret;
char **devices = NULL;
int num_devices = 0;
int i;
ret = nmwa_dbus_call_nm_method (connection, NM_DBUS_PATH, "getDevices", DBUS_TYPE_STRING_ARRAY, (void **)(&devices), &num_devices);
if (ret != RETURN_SUCCESS)
return;
fprintf( stderr, "Devices:\n" );
for (i = 0; i < num_devices; i++)
{
int type;
int type = get_device_type (connection, devices[i]);
fprintf (stderr, " %s", devices[i]);
if ((type = get_device_type (connection, devices[i])) == 2)
fprintf (stderr, " %s\n", devices[i]);
if (type == DEVICE_TYPE_WIRELESS_ETHERNET)
{
char *active_network = get_device_active_network (connection, devices[i]);
fprintf (stderr, " Device type: wireless\n");
fprintf (stderr, " Strength: %d%%\n", get_object_signal_strength (connection, devices[i]));
fprintf (stderr, " Device type: '%d'\n", type );
get_device_active_network (connection, devices[i]);
get_device_networks (connection, devices[i]);
fprintf (stderr, "\n");
}
else
{
fprintf (stderr, "\n Device type: '%d'\n", type );
fprintf (stderr, "\n");
}
}
fprintf (stderr, " Active Network: '%s'\n", active_network);
dbus_free (active_network);
print_device_networks (connection, devices[i]);
fprintf (stderr, "\n");
}
else if (type == DEVICE_TYPE_WIRED_ETHERNET)
fprintf (stderr, " Device type: wired\n");
else
fprintf (stderr, " Device type: unknown\n");
fprintf (stderr, "\n");
}
dbus_free_string_array (devices);
}
@@ -590,18 +363,35 @@ int main( int argc, char *argv[] )
}
char *path;
char *status;
status = get_nm_status (connection);
if (!status)
{
fprintf (stderr, "NetworkManager appears not to be running (could not get its status). Will exit.\n");
return (1);
}
fprintf (stderr, "NM Status: '%s'\n", status);
dbus_free (status);
get_nm_status (connection);
path = get_active_device (connection);
get_device_name (connection, path);
get_devices (connection);
if ((argc == 2) && (get_device_type (connection, path) == 2))
fprintf (stderr, "Active device: '%s'\n", path ? path : "(none)");
if (path)
{
char *name = get_object_name (connection, path);
fprintf (stderr, "Active device name: '%s'\n", name ? name : "(none)");
dbus_free (name);
}
print_devices (connection);
if (path && (argc == 2) && (get_device_type (connection, path) == DEVICE_TYPE_WIRELESS_ETHERNET))
{
fprintf (stderr, "Attempting to force AP '%s' for device '%s'\n", argv[1], path);
set_device_network (connection, path, argv[1]);
}
g_free (path);
dbus_free (path);
return 0;
}

View File

@@ -27,32 +27,17 @@
#include <string.h>
#include <stdlib.h>
#define NMI_DBUS_NMI_OBJECT_PATH_PREFIX "/org/freedesktop/NetworkManagerInfo"
#define NMI_DBUS_NMI_NAMESPACE "org.freedesktop.NetworkManagerInfo"
#define NM_DBUS_NM_OBJECT_PATH_PREFIX "/org/freedesktop/NetworkManager"
#define NM_DBUS_NM_NAMESPACE "org.freedesktop.NetworkManager"
#include "NetworkManager.h"
/* MUST match MetworkManager NMNetworkType */
typedef enum
{
NETWORK_TYPE_UNKNOWN = 0,
NETWORK_TYPE_ALLOWED,
NETWORK_TYPE_INVALID,
NETWORK_TYPE_DEVICE
} NMINetworkType;
char * get_network_string_property (DBusConnection *connection, char *network, char *method, NMINetworkType type)
char * get_network_string_property (DBusConnection *connection, char *network, char *method, NMNetworkType type)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
message = dbus_message_new_method_call (NMI_DBUS_NMI_NAMESPACE,
NMI_DBUS_NMI_OBJECT_PATH_PREFIX,
NMI_DBUS_NMI_NAMESPACE,
method);
message = dbus_message_new_method_call (NMI_DBUS_SERVICE, NMI_DBUS_PATH, NMI_DBUS_INTERFACE, method);
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
@@ -94,7 +79,7 @@ char * get_network_string_property (DBusConnection *connection, char *network, c
return (ret_string);
}
gboolean get_network_trusted (DBusConnection *connection, char *network, NMINetworkType type)
gboolean get_network_trusted (DBusConnection *connection, char *network, NMNetworkType type)
{
DBusMessage *message;
DBusMessage *reply;
@@ -104,10 +89,7 @@ gboolean get_network_trusted (DBusConnection *connection, char *network, NMINetw
g_return_val_if_fail (connection != NULL, -1);
g_return_val_if_fail (network != NULL, -1);
message = dbus_message_new_method_call (NMI_DBUS_NMI_NAMESPACE,
NMI_DBUS_NMI_OBJECT_PATH_PREFIX,
NMI_DBUS_NMI_NAMESPACE,
"getNetworkTrusted");
message = dbus_message_new_method_call (NMI_DBUS_SERVICE, NMI_DBUS_PATH, NMI_DBUS_INTERFACE, "getNetworkTrusted");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
@@ -146,17 +128,14 @@ gboolean get_network_trusted (DBusConnection *connection, char *network, NMINetw
}
void get_networks_of_type (DBusConnection *connection, NMINetworkType type)
void get_networks_of_type (DBusConnection *connection, NMNetworkType type)
{
DBusMessage *message;
DBusMessage *reply;
DBusMessageIter iter;
DBusError error;
message = dbus_message_new_method_call (NMI_DBUS_NMI_NAMESPACE,
NMI_DBUS_NMI_OBJECT_PATH_PREFIX,
NMI_DBUS_NMI_NAMESPACE,
"getNetworks");
message = dbus_message_new_method_call (NMI_DBUS_SERVICE, NMI_DBUS_PATH, NMI_DBUS_INTERFACE, "getNetworks");
if (message == NULL)
{
fprintf (stderr, "Couldn't allocate the dbus message\n");
@@ -224,8 +203,7 @@ void get_user_key_for_network (DBusConnection *connection)
g_return_if_fail (connection != NULL);
message = dbus_message_new_method_call (NMI_DBUS_NMI_NAMESPACE, NMI_DBUS_NMI_OBJECT_PATH_PREFIX,
NMI_DBUS_NMI_NAMESPACE, "getKeyForNetwork");
message = dbus_message_new_method_call (NMI_DBUS_SERVICE, NMI_DBUS_PATH, NMI_DBUS_INTERFACE, "getKeyForNetwork");
if (message == NULL)
{
fprintf (stderr, "get_user_key_for_network(): Couldn't allocate the dbus message\n");
@@ -336,14 +314,14 @@ int main( int argc, char *argv[] )
dbus_connection_setup_with_g_main (connection, NULL);
dbus_error_init (&error);
dbus_bus_acquire_service (connection, NM_DBUS_NM_NAMESPACE, 0, &error);
dbus_bus_acquire_service (connection, NM_DBUS_SERVICE, 0, &error);
if (dbus_error_is_set (&error))
{
fprintf (stderr, "Could not acquire its service. dbus_bus_acquire_service() says: '%s'\n", error.message);
exit (1);
}
success = dbus_connection_register_object_path (connection, NM_DBUS_NM_OBJECT_PATH_PREFIX, &vtable, loop);
success = dbus_connection_register_object_path (connection, NM_DBUS_INTERFACE, &vtable, loop);
if (!success)
{
fprintf (stderr, "Could not register a handler for NetworkManager. Not enough memory?\n");

View File

@@ -27,20 +27,7 @@
#include <getopt.h>
#include <string.h>
/* These MUST correspond to NetworkManager device types */
typedef enum NMDeviceType
{
DEVICE_TYPE_DONT_KNOW = 0,
DEVICE_TYPE_WIRED_ETHERNET,
DEVICE_TYPE_WIRELESS_ETHERNET
} NMDeviceType;
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
#define NM_DBUS_INTERFACE_DEVICES "org.freedesktop.NetworkManager.Devices"
#include "NetworkManager.h"
void create_device (DBusConnection *connection, NMDeviceType type)
{