diff options
author | Dan Williams <dcbw@redhat.com> | 2008-08-07 13:41:04 +0000 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2008-08-07 13:41:04 +0000 |
commit | 2dbd644fe924345aae6edf74278ba428ad0a478a (patch) | |
tree | 924d331123eff1b00f5e2c69bf35c4357d65e9dc /libnm-util | |
parent | 6d7474e565046b360e2b7ff1b84b6b1b30c71caa (diff) | |
download | NetworkManager-modem-manager.tar.gz |
Merge from trunk r3901modem-manager
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/branches/modem-manager@3902 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
Diffstat (limited to 'libnm-util')
-rw-r--r-- | libnm-util/nm-connection.c | 42 | ||||
-rw-r--r-- | libnm-util/nm-connection.h | 12 | ||||
-rw-r--r-- | libnm-util/nm-setting-cdma.c | 34 | ||||
-rw-r--r-- | libnm-util/nm-setting-gsm.c | 34 | ||||
-rw-r--r-- | libnm-util/nm-setting-ip4-config.c | 49 | ||||
-rw-r--r-- | libnm-util/nm-setting-ip4-config.h | 39 | ||||
-rw-r--r-- | libnm-util/nm-setting-vpn.c | 17 | ||||
-rw-r--r-- | libnm-util/nm-setting-vpn.h | 2 | ||||
-rw-r--r-- | libnm-util/nm-utils.c | 52 | ||||
-rw-r--r-- | libnm-util/nm-utils.h | 3 |
10 files changed, 229 insertions, 55 deletions
diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c index 870fea5177..f8e7a71d62 100644 --- a/libnm-util/nm-connection.c +++ b/libnm-util/nm-connection.c @@ -45,6 +45,37 @@ #include "nm-setting-gsm.h" #include "nm-setting-cdma.h" +GQuark +nm_connection_error_quark (void) +{ + static GQuark quark; + + if (G_UNLIKELY (!quark)) + quark = g_quark_from_static_string ("nm-connection-error-quark"); + return quark; +} + +/* This should really be standard. */ +#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC } + +GType +nm_connection_error_get_type (void) +{ + static GType etype = 0; + + if (etype == 0) { + static const GEnumValue values[] = { + /* Unknown error. */ + ENUM_ENTRY (NM_CONNECTION_ERROR_UNKNOWN, "UnknownError"), + /* The required 'connection' setting was not found. */ + ENUM_ENTRY (NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND, "ConnectionSettingNotFound"), + { 0, 0, 0 } + }; + etype = g_enum_register_static ("NMConnectionError", values); + } + return etype; +} + typedef struct { GHashTable *settings; @@ -430,7 +461,7 @@ gboolean nm_connection_verify (NMConnection *connection, GError **error) { NMConnectionPrivate *priv; - NMSetting *connection_setting; + NMSetting *s_con; VerifySettingsInfo info; g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); @@ -440,9 +471,12 @@ nm_connection_verify (NMConnection *connection, GError **error) priv = NM_CONNECTION_GET_PRIVATE (connection); /* First, make sure there's at least 'connection' setting */ - connection_setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); - if (!connection_setting) { - g_warning ("'connection' setting not present."); + s_con = nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); + if (!s_con) { + g_set_error (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND, + "connection setting not found"); return FALSE; } diff --git a/libnm-util/nm-connection.h b/libnm-util/nm-connection.h index 24e6d700b4..27229356ba 100644 --- a/libnm-util/nm-connection.h +++ b/libnm-util/nm-connection.h @@ -45,6 +45,18 @@ typedef enum { NM_CONNECTION_SCOPE_USER } NMConnectionScope; +typedef enum +{ + NM_CONNECTION_ERROR_UNKNOWN = 0, + NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND +} NMConnectionError; + +#define NM_TYPE_CONNECTION_ERROR (nm_connection_error_get_type ()) +GType nm_connection_error_get_type (void); + +#define NM_CONNECTION_ERROR nm_connection_error_quark () +GQuark nm_connection_error_quark (void); + #define NM_CONNECTION_SCOPE "scope" #define NM_CONNECTION_PATH "path" diff --git a/libnm-util/nm-setting-cdma.c b/libnm-util/nm-setting-cdma.c index 3ca41bedb1..5955963c7c 100644 --- a/libnm-util/nm-setting-cdma.c +++ b/libnm-util/nm-setting-cdma.c @@ -117,9 +117,42 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } + if (self->username && !strlen (self->username)) { + g_set_error (error, + NM_SETTING_CDMA_ERROR, + NM_SETTING_CDMA_ERROR_INVALID_PROPERTY, + NM_SETTING_CDMA_USERNAME); + return FALSE; + } + + if (self->password && !strlen (self->password)) { + g_set_error (error, + NM_SETTING_CDMA_ERROR, + NM_SETTING_CDMA_ERROR_INVALID_PROPERTY, + NM_SETTING_CDMA_PASSWORD); + return FALSE; + } + return TRUE; } +static GPtrArray * +need_secrets (NMSetting *setting) +{ + NMSettingCdma *self = NM_SETTING_CDMA (setting); + GPtrArray *secrets = NULL; + + if (self->password) + return NULL; + + if (self->username) { + secrets = g_ptr_array_sized_new (1); + g_ptr_array_add (secrets, NM_SETTING_CDMA_PASSWORD); + } + + return secrets; +} + static void nm_setting_cdma_init (NMSettingCdma *setting) { @@ -196,6 +229,7 @@ nm_setting_cdma_class_init (NMSettingCdmaClass *setting_class) object_class->get_property = get_property; object_class->finalize = finalize; parent_class->verify = verify; + parent_class->need_secrets = need_secrets; /* Properties */ g_object_class_install_property diff --git a/libnm-util/nm-setting-gsm.c b/libnm-util/nm-setting-gsm.c index 97bc3ea2ca..b65fa65a22 100644 --- a/libnm-util/nm-setting-gsm.c +++ b/libnm-util/nm-setting-gsm.c @@ -133,9 +133,42 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } + if (self->username && !strlen (self->username)) { + g_set_error (error, + NM_SETTING_GSM_ERROR, + NM_SETTING_GSM_ERROR_INVALID_PROPERTY, + NM_SETTING_GSM_USERNAME); + return FALSE; + } + + if (self->password && !strlen (self->password)) { + g_set_error (error, + NM_SETTING_GSM_ERROR, + NM_SETTING_GSM_ERROR_INVALID_PROPERTY, + NM_SETTING_GSM_USERNAME); + return FALSE; + } + return TRUE; } +static GPtrArray * +need_secrets (NMSetting *setting) +{ + NMSettingGsm *self = NM_SETTING_GSM (setting); + GPtrArray *secrets = NULL; + + if (self->password) + return NULL; + + if (self->username) { + secrets = g_ptr_array_sized_new (1); + g_ptr_array_add (secrets, NM_SETTING_GSM_PASSWORD); + } + + return secrets; +} + static void nm_setting_gsm_init (NMSettingGsm *setting) { @@ -256,6 +289,7 @@ nm_setting_gsm_class_init (NMSettingGsmClass *setting_class) object_class->get_property = get_property; object_class->finalize = finalize; parent_class->verify = verify; + parent_class->need_secrets = need_secrets; /* Properties */ g_object_class_install_property diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c index d452c46ecc..2e3873d509 100644 --- a/libnm-util/nm-setting-ip4-config.c +++ b/libnm-util/nm-setting-ip4-config.c @@ -76,7 +76,8 @@ enum { PROP_DNS_SEARCH, PROP_ADDRESSES, PROP_ROUTES, - PROP_IGNORE_DHCP_DNS, + PROP_IGNORE_AUTO_ROUTES, + PROP_IGNORE_AUTO_DNS, PROP_DHCP_CLIENT_ID, PROP_DHCP_HOSTNAME, @@ -112,7 +113,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) NM_SETTING_IP4_CONFIG_ADDRESSES); return FALSE; } - } else if ( !strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_AUTOIP) + } else if ( !strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL) || !strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_SHARED)) { if (self->dns && self->dns->len) { g_set_error (error, @@ -137,7 +138,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) NM_SETTING_IP4_CONFIG_ADDRESSES); return FALSE; } - } else if (!strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_DHCP)) { + } else if (!strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_AUTO)) { /* nothing to do */ } else { g_set_error (error, @@ -186,9 +187,9 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) /* Validate routes */ for (iter = self->routes, i = 0; iter; iter = g_slist_next (iter), i++) { - NMSettingIP4Address *addr = (NMSettingIP4Address *) iter->data; + NMSettingIP4Route *route = (NMSettingIP4Route *) iter->data; - if (!addr->address) { + if (!route->address) { g_set_error (error, NM_SETTING_IP4_CONFIG_ERROR, NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, @@ -196,7 +197,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } - if (!addr->prefix || addr->prefix > 32) { + if (!route->prefix || route->prefix > 32) { g_set_error (error, NM_SETTING_IP4_CONFIG_ERROR, NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY, @@ -258,10 +259,13 @@ set_property (GObject *object, guint prop_id, break; case PROP_ROUTES: nm_utils_slist_free (setting->routes, g_free); - setting->routes = nm_utils_ip4_addresses_from_gvalue (value); + setting->routes = nm_utils_ip4_routes_from_gvalue (value); break; - case PROP_IGNORE_DHCP_DNS: - setting->ignore_dhcp_dns = g_value_get_boolean (value); + case PROP_IGNORE_AUTO_ROUTES: + setting->ignore_auto_routes = g_value_get_boolean (value); + break; + case PROP_IGNORE_AUTO_DNS: + setting->ignore_auto_dns = g_value_get_boolean (value); break; case PROP_DHCP_CLIENT_ID: g_free (setting->dhcp_client_id); @@ -297,10 +301,13 @@ get_property (GObject *object, guint prop_id, nm_utils_ip4_addresses_to_gvalue (setting->addresses, value); break; case PROP_ROUTES: - nm_utils_ip4_addresses_to_gvalue (setting->routes, value); + nm_utils_ip4_routes_to_gvalue (setting->routes, value); + break; + case PROP_IGNORE_AUTO_ROUTES: + g_value_set_boolean (value, setting->ignore_auto_routes); break; - case PROP_IGNORE_DHCP_DNS: - g_value_set_boolean (value, setting->ignore_dhcp_dns); + case PROP_IGNORE_AUTO_DNS: + g_value_set_boolean (value, setting->ignore_auto_dns); break; case PROP_DHCP_CLIENT_ID: g_value_set_string (value, setting->dhcp_client_id); @@ -363,15 +370,23 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class) (object_class, PROP_ROUTES, nm_param_spec_specialized (NM_SETTING_IP4_CONFIG_ROUTES, "Routes", - "List of NMSettingIP4Addresses", + "List of NMSettingIP4Routes", DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT, G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); g_object_class_install_property - (object_class, PROP_IGNORE_DHCP_DNS, - g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_DHCP_DNS, - "Ignore DHCP DNS", - "Ignore DHCP DNS", + (object_class, PROP_IGNORE_AUTO_ROUTES, + g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES, + "Ignore automatic routes", + "Ignore automatic routes", + FALSE, + G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); + + g_object_class_install_property + (object_class, PROP_IGNORE_AUTO_DNS, + g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, + "Ignore automatic DNS", + "Ignore automatic DNS", FALSE, G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); diff --git a/libnm-util/nm-setting-ip4-config.h b/libnm-util/nm-setting-ip4-config.h index 173c9ef55c..119b09c147 100644 --- a/libnm-util/nm-setting-ip4-config.h +++ b/libnm-util/nm-setting-ip4-config.h @@ -53,19 +53,20 @@ GType nm_setting_ip4_config_error_get_type (void); #define NM_SETTING_IP4_CONFIG_ERROR nm_setting_ip4_config_error_quark () GQuark nm_setting_ip4_config_error_quark (void); -#define NM_SETTING_IP4_CONFIG_METHOD "method" -#define NM_SETTING_IP4_CONFIG_DNS "dns" -#define NM_SETTING_IP4_CONFIG_DNS_SEARCH "dns-search" -#define NM_SETTING_IP4_CONFIG_ADDRESSES "addresses" -#define NM_SETTING_IP4_CONFIG_ROUTES "routes" -#define NM_SETTING_IP4_CONFIG_IGNORE_DHCP_DNS "ignore-dhcp-dns" -#define NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID "dhcp-client-id" -#define NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME "dhcp-hostname" - -#define NM_SETTING_IP4_CONFIG_METHOD_DHCP "dhcp" -#define NM_SETTING_IP4_CONFIG_METHOD_AUTOIP "autoip" -#define NM_SETTING_IP4_CONFIG_METHOD_MANUAL "manual" -#define NM_SETTING_IP4_CONFIG_METHOD_SHARED "shared" +#define NM_SETTING_IP4_CONFIG_METHOD "method" +#define NM_SETTING_IP4_CONFIG_DNS "dns" +#define NM_SETTING_IP4_CONFIG_DNS_SEARCH "dns-search" +#define NM_SETTING_IP4_CONFIG_ADDRESSES "addresses" +#define NM_SETTING_IP4_CONFIG_ROUTES "routes" +#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes" +#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns" +#define NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID "dhcp-client-id" +#define NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME "dhcp-hostname" + +#define NM_SETTING_IP4_CONFIG_METHOD_AUTO "auto" +#define NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL "link-local" +#define NM_SETTING_IP4_CONFIG_METHOD_MANUAL "manual" +#define NM_SETTING_IP4_CONFIG_METHOD_SHARED "shared" typedef struct { guint32 address; /* network byte order */ @@ -74,14 +75,22 @@ typedef struct { } NMSettingIP4Address; typedef struct { + guint32 address; /* network byte order */ + guint32 prefix; + guint32 next_hop; /* network byte order */ + guint32 metric; /* lower metric == more preferred */ +} NMSettingIP4Route; + +typedef struct { NMSetting parent; char *method; GArray *dns; /* array of guint32; elements in network byte order */ GSList *dns_search; /* list of strings */ GSList *addresses; /* array of NMSettingIP4Address */ - GSList *routes; /* array of NMSettingIP4Address */ - gboolean ignore_dhcp_dns; + GSList *routes; /* array of NMSettingIP4Route */ + gboolean ignore_auto_routes; + gboolean ignore_auto_dns; char *dhcp_client_id; char *dhcp_hostname; } NMSettingIP4Config; diff --git a/libnm-util/nm-setting-vpn.c b/libnm-util/nm-setting-vpn.c index 4c4b54d4da..9a8258b847 100644 --- a/libnm-util/nm-setting-vpn.c +++ b/libnm-util/nm-setting-vpn.c @@ -70,7 +70,6 @@ enum { PROP_0, PROP_SERVICE_TYPE, PROP_USER_NAME, - PROP_ROUTES, LAST_PROP }; @@ -127,7 +126,6 @@ finalize (GObject *object) g_free (self->service_type); g_free (self->user_name); - nm_utils_slist_free (self->routes, g_free); G_OBJECT_CLASS (nm_setting_vpn_parent_class)->finalize (object); } @@ -147,10 +145,6 @@ set_property (GObject *object, guint prop_id, g_free (setting->user_name); setting->user_name = g_value_dup_string (value); break; - case PROP_ROUTES: - nm_utils_slist_free (setting->routes, g_free); - setting->routes = g_value_dup_boxed (value); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -170,9 +164,6 @@ get_property (GObject *object, guint prop_id, case PROP_USER_NAME: g_value_set_string (value, setting->user_name); break; - case PROP_ROUTES: - g_value_set_boxed (value, setting->routes); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -207,12 +198,4 @@ nm_setting_vpn_class_init (NMSettingVPNClass *setting_class) "User name", NULL, G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); - - g_object_class_install_property - (object_class, PROP_ROUTES, - nm_param_spec_specialized (NM_SETTING_VPN_ROUTES, - "Routes", - "Routes", - DBUS_TYPE_G_LIST_OF_STRING, - G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); } diff --git a/libnm-util/nm-setting-vpn.h b/libnm-util/nm-setting-vpn.h index 7048ce96f9..a52627ae9f 100644 --- a/libnm-util/nm-setting-vpn.h +++ b/libnm-util/nm-setting-vpn.h @@ -54,14 +54,12 @@ GQuark nm_setting_vpn_error_quark (void); #define NM_SETTING_VPN_SERVICE_TYPE "service-type" #define NM_SETTING_VPN_USER_NAME "user-name" -#define NM_SETTING_VPN_ROUTES "routes" typedef struct { NMSetting parent; char *service_type; char *user_name; - GSList *routes; } NMSettingVPN; typedef struct { diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c index 0f9ba3d948..3171660b05 100644 --- a/libnm-util/nm-utils.c +++ b/libnm-util/nm-utils.c @@ -859,6 +859,58 @@ nm_utils_ip4_addresses_to_gvalue (GSList *list, GValue *value) g_value_take_boxed (value, addresses); } +GSList * +nm_utils_ip4_routes_from_gvalue (const GValue *value) +{ + GPtrArray *routes; + int i; + GSList *list = NULL; + + routes = (GPtrArray *) g_value_get_boxed (value); + for (i = 0; routes && (i < routes->len); i++) { + GArray *array = (GArray *) g_ptr_array_index (routes, i); + NMSettingIP4Route *route; + + if (array->len != 4) { + nm_warning ("Ignoring invalid IP4 route"); + continue; + } + + route = g_malloc0 (sizeof (NMSettingIP4Route)); + route->address = g_array_index (array, guint32, 0); + route->prefix = g_array_index (array, guint32, 1); + route->next_hop = g_array_index (array, guint32, 2); + route->metric = g_array_index (array, guint32, 3); + list = g_slist_prepend (list, route); + } + + return g_slist_reverse (list); +} + +void +nm_utils_ip4_routes_to_gvalue (GSList *list, GValue *value) +{ + GPtrArray *routes; + GSList *iter; + + routes = g_ptr_array_new (); + + for (iter = list; iter; iter = iter->next) { + NMSettingIP4Route *route = (NMSettingIP4Route *) iter->data; + GArray *array; + + array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3); + + g_array_append_val (array, route->address); + g_array_append_val (array, route->prefix); + g_array_append_val (array, route->next_hop); + g_array_append_val (array, route->metric); + g_ptr_array_add (routes, array); + } + + g_value_take_boxed (value, routes); +} + /* * nm_utils_ip4_netmask_to_prefix * diff --git a/libnm-util/nm-utils.h b/libnm-util/nm-utils.h index e573ac4442..394988fab6 100644 --- a/libnm-util/nm-utils.h +++ b/libnm-util/nm-utils.h @@ -187,6 +187,9 @@ gboolean nm_utils_security_valid (NMUtilsSecurityType type, GSList *nm_utils_ip4_addresses_from_gvalue (const GValue *value); void nm_utils_ip4_addresses_to_gvalue (GSList *list, GValue *value); +GSList *nm_utils_ip4_routes_from_gvalue (const GValue *value); +void nm_utils_ip4_routes_to_gvalue (GSList *list, GValue *value); + guint32 nm_utils_ip4_netmask_to_prefix (guint32 ip4_netmask); guint32 nm_utils_ip4_prefix_to_netmask (guint32 ip4_prefix); |