about summary refs log tree commit diff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/Makefile.in5
-rw-r--r--cli/src/Makefile.in5
-rw-r--r--cli/src/connections.c114
-rw-r--r--cli/src/devices.c82
-rw-r--r--cli/src/network-manager.c53
-rw-r--r--cli/src/nmcli.c8
-rw-r--r--cli/src/nmcli.h7
-rw-r--r--cli/src/utils.c57
-rw-r--r--cli/src/utils.h3
9 files changed, 269 insertions, 65 deletions
diff --git a/cli/Makefile.in b/cli/Makefile.in
index 5fdb04bb..b2356ac1 100644
--- a/cli/Makefile.in
+++ b/cli/Makefile.in
@@ -189,6 +189,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@
@@ -203,6 +207,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/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 */