diff options
Diffstat (limited to 'cli/src')
| -rw-r--r-- | cli/src/Makefile.in | 5 | ||||
| -rw-r--r-- | cli/src/connections.c | 114 | ||||
| -rw-r--r-- | cli/src/devices.c | 82 | ||||
| -rw-r--r-- | cli/src/network-manager.c | 53 | ||||
| -rw-r--r-- | cli/src/nmcli.c | 8 | ||||
| -rw-r--r-- | cli/src/nmcli.h | 7 | ||||
| -rw-r--r-- | cli/src/utils.c | 57 | ||||
| -rw-r--r-- | cli/src/utils.h | 3 |
8 files changed, 264 insertions, 65 deletions
diff --git a/cli/src/Makefile.in b/cli/src/Makefile.in index 47421660..bdf4128e 100644 --- a/cli/src/Makefile.in +++ b/cli/src/Makefile.in @@ -187,6 +187,10 @@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ +NM_MAJOR_VERSION = @NM_MAJOR_VERSION@ +NM_MICRO_VERSION = @NM_MICRO_VERSION@ +NM_MINOR_VERSION = @NM_MINOR_VERSION@ +NM_VERSION = @NM_VERSION@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ @@ -201,6 +205,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_PATH = @PKGCONFIG_PATH@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ diff --git a/cli/src/connections.c b/cli/src/connections.c index e0b94ceb..88a5df49 100644 --- a/cli/src/connections.c +++ b/cli/src/connections.c @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ #include <glib.h> @@ -634,12 +634,6 @@ do_connections_status (NmCli *nmc, int argc, char **argv) nmc->should_wait = FALSE; - /* create NMClient */ - if (!nmc->get_client (nmc)) - return nmc->return_value; - - active_cons = nm_client_get_active_connections (nmc->client); - if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) @@ -660,10 +654,25 @@ do_connections_status (NmCli *nmc, int argc, char **argv) goto error; } + if (!nmc_is_nm_running (nmc, &error)) { + if (error) { + g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_error_free (error); + } else { + g_string_printf (nmc->return_text, _("Error: NetworkManager is not running.")); + nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING; + } + goto error; + } + + /* Print headers */ nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("Active connections"); print_fields (nmc->print_fields, nmc->allowed_fields); + nmc->get_client (nmc); + active_cons = nm_client_get_active_connections (nmc->client); if (active_cons && active_cons->len) { info = g_malloc0 (sizeof (StatusInfo)); info->nmc = nmc; @@ -675,7 +684,6 @@ do_connections_status (NmCli *nmc, int argc, char **argv) } error: - return nmc->return_value; } @@ -886,6 +894,60 @@ check_olpc_mesh_compatible (NMDeviceOlpcMesh *device, NMConnection *connection, #endif static gboolean +check_gsm_compatible (NMGsmDevice *device, NMConnection *connection, GError **error) +{ + NMSettingConnection *s_con; + NMSettingGsm *s_gsm; + + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION)); + g_assert (s_con); + + if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_GSM_SETTING_NAME)) { + g_set_error (error, 0, 0, + "The connection was not a GSM connection."); + return FALSE; + } + + s_gsm = NM_SETTING_GSM (nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM)); + if (!s_gsm) { + g_set_error (error, 0, 0, + "The connection was not a valid GSM connection."); + return FALSE; + } + + return TRUE; +} + +static gboolean +check_cdma_compatible (NMCdmaDevice *device, NMConnection *connection, GError **error) +{ + NMSettingConnection *s_con; + NMSettingCdma *s_cdma; + + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION)); + g_assert (s_con); + + if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_CDMA_SETTING_NAME)) { + g_set_error (error, 0, 0, + "The connection was not a CDMA connection."); + return FALSE; + } + + s_cdma = NM_SETTING_CDMA (nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA)); + if (!s_cdma) { + g_set_error (error, 0, 0, + "The connection was not a valid CDMA connection."); + return FALSE; + } + + return TRUE; +} + +static gboolean nm_device_is_connection_compatible (NMDevice *device, NMConnection *connection, GError **error) { g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); @@ -899,6 +961,10 @@ nm_device_is_connection_compatible (NMDevice *device, NMConnection *connection, return check_bt_compatible (NM_DEVICE_BT (device), connection, error); // else if (NM_IS_DEVICE_OLPC_MESH (device)) // return check_olpc_mesh_compatible (NM_DEVICE_OLPC_MESH (device), connection, error); + else if (NM_IS_GSM_DEVICE (device)) + return check_gsm_compatible (NM_GSM_DEVICE (device), connection, error); + else if (NM_IS_CDMA_DEVICE (device)) + return check_cdma_compatible (NM_CDMA_DEVICE (device), connection, error); g_set_error (error, 0, 0, "unhandled device type '%s'", G_OBJECT_TYPE_NAME (device)); return FALSE; @@ -1401,9 +1467,20 @@ do_connection_up (NmCli *nmc, int argc, char **argv) goto error; } - /* create NMClient */ - if (!nmc->get_client (nmc)) + if (!nmc_is_nm_running (nmc, &error)) { + if (error) { + g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_error_free (error); + } else { + g_string_printf (nmc->return_text, _("Error: NetworkManager is not running.")); + nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING; + } goto error; + } + + /* create NMClient */ + nmc->get_client (nmc); is_system = (nm_connection_get_scope (connection) == NM_CONNECTION_SCOPE_SYSTEM) ? TRUE : FALSE; con_path = nm_connection_get_path (connection); @@ -1420,6 +1497,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv) else g_string_printf (nmc->return_text, _("Error: No suitable device found.")); nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION; + g_clear_error (&error); goto error; } @@ -1446,6 +1524,7 @@ do_connection_down (NmCli *nmc, int argc, char **argv) { NMConnection *connection = NULL; NMActiveConnection *active = NULL; + GError *error = NULL; const GPtrArray *active_cons; const char *con_path; const char *active_path; @@ -1491,9 +1570,20 @@ do_connection_down (NmCli *nmc, int argc, char **argv) goto error; } - /* create NMClient */ - if (!nmc->get_client (nmc)) + if (!nmc_is_nm_running (nmc, &error)) { + if (error) { + g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_error_free (error); + } else { + g_string_printf (nmc->return_text, _("Error: NetworkManager is not running.")); + nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING; + } goto error; + } + + /* create NMClient */ + nmc->get_client (nmc); con_path = nm_connection_get_path (connection); con_scope = nm_connection_get_scope (connection); diff --git a/cli/src/devices.c b/cli/src/devices.c index 436b4b6e..d314928a 100644 --- a/cli/src/devices.c +++ b/cli/src/devices.c @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ #include <stdio.h> @@ -28,8 +28,6 @@ #include <glib.h> #include <glib/gi18n.h> -#include <nm-client.h> -#include <nm-device-wifi.h> #include <nm-client.h> #include <nm-device.h> @@ -184,9 +182,10 @@ static NmcOutputField nmc_fields_dev_wifi_list[] = { {"RSN-FLAGS", N_("RSN-FLAGS"), 25, NULL, 0}, /* 9 */ {"DEVICE", N_("DEVICE"), 10, NULL, 0}, /* 10 */ {"ACTIVE", N_("ACTIVE"), 8, NULL, 0}, /* 11 */ + {"DBUS-PATH", N_("DBUS-PATH"), 46, NULL, 0}, /* 12 */ {NULL, NULL, 0, NULL, 0} }; -#define NMC_FIELDS_DEV_WIFI_LIST_ALL "SSID,BSSID,MODE,FREQ,RATE,SIGNAL,SECURITY,WPA-FLAGS,RSN-FLAGS,DEVICE,ACTIVE" +#define NMC_FIELDS_DEV_WIFI_LIST_ALL "SSID,BSSID,MODE,FREQ,RATE,SIGNAL,SECURITY,WPA-FLAGS,RSN-FLAGS,DEVICE,ACTIVE,DBUS-PATH" #define NMC_FIELDS_DEV_WIFI_LIST_COMMON "SSID,BSSID,MODE,FREQ,RATE,SIGNAL,SECURITY,ACTIVE" #define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST "NAME,"NMC_FIELDS_DEV_WIFI_LIST_COMMON @@ -431,6 +430,7 @@ detail_access_point (gpointer data, gpointer user_data) info->nmc->allowed_fields[9].value = rsn_flags_str; info->nmc->allowed_fields[10].value = info->device; info->nmc->allowed_fields[11].value = active ? _("yes") : _("no"); + info->nmc->allowed_fields[12].value = nm_object_get_path (NM_OBJECT (ap)); info->nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER_ADD & ~NMC_PF_FLAG_MAIN_HEADER_ONLY & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */ print_fields (info->nmc->print_fields, info->nmc->allowed_fields); @@ -789,12 +789,6 @@ do_devices_status (NmCli *nmc, int argc, char **argv) argv++; } - /* create NMClient */ - if (!nmc->get_client (nmc)) - goto error; - - devices = nm_client_get_devices (nmc->client); - if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) @@ -815,10 +809,25 @@ do_devices_status (NmCli *nmc, int argc, char **argv) goto error; } + if (!nmc_is_nm_running (nmc, &error)) { + if (error) { + g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_error_free (error); + } else { + g_string_printf (nmc->return_text, _("Error: NetworkManager is not running.")); + nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING; + } + goto error; + } + + /* Print headers */ nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("Status of devices"); print_fields (nmc->print_fields, nmc->allowed_fields); + nmc->get_client (nmc); + devices = nm_client_get_devices (nmc->client); for (i = 0; devices && (i < devices->len); i++) { NMDevice *device = g_ptr_array_index (devices, i); show_device_status (device, nmc); @@ -834,6 +843,7 @@ static NMCResultCode do_devices_list (NmCli *nmc, int argc, char **argv) { const GPtrArray *devices; + GError *error = NULL; NMDevice *device = NULL; const char *iface = NULL; gboolean iface_specified = FALSE; @@ -858,10 +868,19 @@ do_devices_list (NmCli *nmc, int argc, char **argv) argv++; } - /* create NMClient */ - if (!nmc->get_client (nmc)) + if (!nmc_is_nm_running (nmc, &error)) { + if (error) { + g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_error_free (error); + } else { + g_string_printf (nmc->return_text, _("Error: NetworkManager is not running.")); + nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING; + } goto error; + } + nmc->get_client (nmc); devices = nm_client_get_devices (nmc->client); if (iface_specified) { @@ -947,6 +966,7 @@ static NMCResultCode do_device_disconnect (NmCli *nmc, int argc, char **argv) { const GPtrArray *devices; + GError *error = NULL; NMDevice *device = NULL; const char *iface = NULL; gboolean iface_specified = FALSE; @@ -998,10 +1018,19 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv) goto error; } - /* create NMClient */ - if (!nmc->get_client (nmc)) + if (!nmc_is_nm_running (nmc, &error)) { + if (error) { + g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_error_free (error); + } else { + g_string_printf (nmc->return_text, _("Error: NetworkManager is not running.")); + nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING; + } goto error; + } + nmc->get_client (nmc); devices = nm_client_get_devices (nmc->client); for (i = 0; devices && (i < devices->len); i++) { NMDevice *candidate = g_ptr_array_index (devices, i); @@ -1093,11 +1122,6 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) argv++; } - /* create NMClient */ - if (!nmc->get_client (nmc)) - goto error; - - devices = nm_client_get_devices (nmc->client); if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; @@ -1119,9 +1143,24 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) goto error; } + if (!nmc_is_nm_running (nmc, &error)) { + if (error) { + g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_error_free (error); + } else { + g_string_printf (nmc->return_text, _("Error: NetworkManager is not running.")); + nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING; + } + goto error; + } + + /* Print headers */ nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("WiFi scan list"); + nmc->get_client (nmc); + devices = nm_client_get_devices (nmc->client); if (iface) { /* Device specified - list only APs of this interface */ for (i = 0; devices && (i < devices->len); i++) { @@ -1250,10 +1289,6 @@ do_devices (NmCli *nmc, int argc, char **argv) { GError *error = NULL; - /* create NMClient */ - if (!nmc->get_client (nmc)) - goto end; - if (argc == 0) { if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error)) goto opt_error; @@ -1288,7 +1323,6 @@ do_devices (NmCli *nmc, int argc, char **argv) } } -end: return nmc->return_value; opt_error: diff --git a/cli/src/network-manager.c b/cli/src/network-manager.c index 23a2ef11..e695c0e4 100644 --- a/cli/src/network-manager.c +++ b/cli/src/network-manager.c @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ #include <stdio.h> @@ -99,8 +99,8 @@ static NMCResultCode show_nm_status (NmCli *nmc) { gboolean nm_running; - gboolean net_enabled; - NMState state; + NMState state = NM_STATE_UNKNOWN; + const char *net_enabled_str; const char *wireless_hw_enabled_str, *wireless_enabled_str; const char *wwan_hw_enabled_str, *wwan_enabled_str; GError *error = NULL; @@ -111,8 +111,6 @@ show_nm_status (NmCli *nmc) guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0; guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0; - g_return_val_if_fail (nmc->client != NULL, NMC_RESULT_ERROR_UNKNOWN); - if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) @@ -137,21 +135,22 @@ show_nm_status (NmCli *nmc) nmc->print_fields.header_name = _("NetworkManager status"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nm_running = nm_client_get_manager_running (nmc->client); - state = nm_client_get_state (nmc->client); - net_enabled = nm_client_networking_get_enabled (nmc->client); + nm_running = nmc_is_nm_running (nmc, NULL); if (nm_running) { + nmc->get_client (nmc); /* create NMClient */ + state = nm_client_get_state (nmc->client); + net_enabled_str = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wireless_hw_enabled_str = nm_client_wireless_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wireless_enabled_str = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wwan_hw_enabled_str = nm_client_wwan_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wwan_enabled_str = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled"); } else { - wireless_hw_enabled_str = wireless_enabled_str = wwan_hw_enabled_str = wwan_enabled_str = _("unknown"); + net_enabled_str = wireless_hw_enabled_str = wireless_enabled_str = wwan_hw_enabled_str = wwan_enabled_str = _("unknown"); } nmc->allowed_fields[0].value = nm_running ? _("running") : _("not running"); nmc->allowed_fields[1].value = nm_state_to_string (state); - nmc->allowed_fields[2].value = net_enabled ? _("enabled") : _("disabled"); + nmc->allowed_fields[2].value = net_enabled_str; nmc->allowed_fields[3].value = wireless_hw_enabled_str; nmc->allowed_fields[4].value = wireless_enabled_str; nmc->allowed_fields[5].value = wwan_hw_enabled_str; @@ -212,10 +211,6 @@ do_network_manager (NmCli *nmc, int argc, char **argv) guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0; guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0; - /* create NMClient */ - if (!nmc->get_client (nmc)) - goto end; - if (argc == 0) { if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error)) goto opt_error; @@ -244,9 +239,14 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("Networking enabled"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nmc->allowed_fields[2].value = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + + if (nmc_is_nm_running (nmc, NULL)) { + nmc->get_client (nmc); /* create NMClient */ + nmc->allowed_fields[2].value = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + } else + nmc->allowed_fields[2].value = _("unknown"); nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag; - print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ + print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */ } else { if (!strcmp (*argv, "true")) enable_net = TRUE; @@ -257,6 +257,7 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto end; } + nmc->get_client (nmc); /* create NMClient */ nm_client_networking_set_enabled (nmc->client, enable_net); } } @@ -293,9 +294,14 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("WiFi enabled"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nmc->allowed_fields[4].value = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + + if (nmc_is_nm_running (nmc, NULL)) { + nmc->get_client (nmc); /* create NMClient */ + nmc->allowed_fields[4].value = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + } else + nmc->allowed_fields[4].value = _("unknown"); nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag; - print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ + print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */ } else { if (!strcmp (*argv, "on")) enable_wifi = TRUE; @@ -306,6 +312,7 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto end; } + nmc->get_client (nmc); /* create NMClient */ nm_client_wireless_set_enabled (nmc->client, enable_wifi); } } @@ -325,9 +332,14 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("WWAN enabled"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nmc->allowed_fields[6].value = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + + if (nmc_is_nm_running (nmc, NULL)) { + nmc->get_client (nmc); /* create NMClient */ + nmc->allowed_fields[6].value = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + } else + nmc->allowed_fields[6].value = _("unknown"); nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag; - print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ + print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */ } else { if (!strcmp (*argv, "on")) enable_wwan = TRUE; @@ -338,6 +350,7 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto end; } + nmc->get_client (nmc); /* create NMClient */ nm_client_wwan_set_enabled (nmc->client, enable_wwan); } } diff --git a/cli/src/nmcli.c b/cli/src/nmcli.c index d416952c..4a548024 100644 --- a/cli/src/nmcli.c +++ b/cli/src/nmcli.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ /* Generated configuration file */ @@ -30,8 +30,6 @@ #include <glib.h> #include <glib/gi18n.h> -#include <dbus/dbus.h> -#include <dbus/dbus-glib.h> #include <nm-client.h> #include <nm-setting-connection.h> #include <nm-remote-settings.h> @@ -256,8 +254,8 @@ nmc_get_client (NmCli *nmc) if (!nmc->client) { nmc->client = nm_client_new (); if (!nmc->client) { - g_string_printf (nmc->return_text, _("Error: Could not connect to NetworkManager.")); - nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_critical (_("Error: Could not create NMClient object.")); + exit (NMC_RESULT_ERROR_UNKNOWN); } } diff --git a/cli/src/nmcli.h b/cli/src/nmcli.h index 9788ef08..a208e79e 100644 --- a/cli/src/nmcli.h +++ b/cli/src/nmcli.h @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ #ifndef NMC_NMCLI_H @@ -47,7 +47,10 @@ typedef enum { NMC_RESULT_ERROR_CON_DEACTIVATION = 5, /* Error in device disconnect */ - NMC_RESULT_ERROR_DEV_DISCONNECT = 6 + NMC_RESULT_ERROR_DEV_DISCONNECT = 6, + + /* NetworkManager is not running */ + NMC_RESULT_ERROR_NM_NOT_RUNNING = 7 } NMCResultCode; typedef enum { diff --git a/cli/src/utils.c b/cli/src/utils.c index 0096a0ae..bcc51bbd 100644 --- a/cli/src/utils.c +++ b/cli/src/utils.c @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ #include <stdio.h> @@ -22,6 +22,7 @@ #include <glib.h> #include <glib/gi18n.h> +#include <dbus/dbus-glib-bindings.h> #include "utils.h" @@ -296,3 +297,57 @@ print_fields (const NmcPrintFields fields, const NmcOutputField field_values[]) g_string_free (str, TRUE); } +/* + * Find out whether NetworkManager is running (via D-Bus NameHasOwner), assuring + * NetworkManager won't be autostart (by D-Bus) if not running. + * We can't use NMClient (nm_client_get_manager_running()) because NMClient + * constructor calls GetPermissions of NM_DBUS_SERVICE, which would autostart + * NetworkManger if it is configured as D-Bus launchable service. + */ +gboolean +nmc_is_nm_running (NmCli *nmc, GError **error) +{ + DBusGConnection *connection = NULL; + DBusGProxy *proxy = NULL; + GError *err = NULL; + gboolean has_owner = FALSE; + + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &err); + if (!connection) { + g_string_printf (nmc->return_text, _("Error: Couldn't connect to system bus: %s"), err->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_propagate_error (error, err); + goto done; + } + + proxy = dbus_g_proxy_new_for_name (connection, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus"); + if (!proxy) { + g_string_printf (nmc->return_text, _("Error: Couldn't create D-Bus object proxy for org.freedesktop.DBus")); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + if (error) + g_set_error (error, 0, 0, "%s", nmc->return_text->str); + goto done; + } + + if (!org_freedesktop_DBus_name_has_owner (proxy, NM_DBUS_SERVICE, &has_owner, &err)) { + g_string_printf (nmc->return_text, _("Error: NameHasOwner request failed: %s"), + (err && err->message) ? err->message : _("(unknown)")); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_propagate_error (error, err); + goto done; + } + +done: + if (connection) + dbus_g_connection_unref (connection); + if (proxy) + g_object_unref (proxy); + + return has_owner; +} + diff --git a/cli/src/utils.h b/cli/src/utils.h index 308f6401..da058f27 100644 --- a/cli/src/utils.h +++ b/cli/src/utils.h @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ #ifndef NMC_UTILS_H @@ -32,5 +32,6 @@ int nmc_string_screen_width (const char *start, const char *end); GArray *parse_output_fields (const char *fields_str, const NmcOutputField fields_array[], GError **error); gboolean nmc_terse_option_check (NMCPrintOutput print_output, const char *fields, GError **error); void print_fields (const NmcPrintFields fields, const NmcOutputField field_values[]); +gboolean nmc_is_nm_running (NmCli *nmc, GError **error); #endif /* NMC_UTILS_H */ |