[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[PATCH rhel6-branch 04/11] Wait for activation of specific devices instead of NM (#638131)
- From: Radek Vykydal <rvykydal redhat com>
- To: anaconda-devel-list redhat com
- Subject: [PATCH rhel6-branch 04/11] Wait for activation of specific devices instead of NM (#638131)
- Date: Mon, 10 Jan 2011 15:21:09 +0100
---
isys/iface.c | 29 +++++++++++++++++++++++++++
isys/iface.h | 2 +
loader/net.c | 62 ++++++++++++++++++++++++++++++++++++++++-----------------
loader/net.h | 3 +-
4 files changed, 76 insertions(+), 20 deletions(-)
diff --git a/isys/iface.c b/isys/iface.c
index bc88725..ad39447 100644
--- a/isys/iface.c
+++ b/isys/iface.c
@@ -441,6 +441,35 @@ gboolean is_nm_running(void) {
return running;
}
+gboolean is_iface_activated(char * ifname) {
+ int i, state;
+ NMClient *client = NULL;
+ const GPtrArray *devices;
+
+ g_type_init();
+
+ client = nm_client_new();
+ if (!client)
+ return FALSE;
+
+ devices = nm_client_get_devices(client);
+ for (i = 0; i < devices->len; i++) {
+ NMDevice *candidate = g_ptr_array_index(devices, i);
+ const char *devname = nm_device_get_iface(candidate);
+ if (strcmp(ifname, devname))
+ continue;
+ state = nm_device_get_state(candidate);
+ g_object_unref(client);
+ if (state == NM_DEVICE_STATE_ACTIVATED)
+ return TRUE;
+ else
+ return FALSE;
+ }
+
+ g_object_unref(client);
+ return FALSE;
+}
+
/*
* Wait for NetworkManager to appear on the system bus
*/
diff --git a/isys/iface.h b/isys/iface.h
index 31dde19..8f90271 100644
--- a/isys/iface.h
+++ b/isys/iface.h
@@ -152,6 +152,8 @@ int iface_have_in6_addr(struct in6_addr *addr6);
*/
gboolean is_nm_connected(void);
+gboolean is_iface_activated(char * ifname);
+
/*
* Start NetworkManager
*/
diff --git a/loader/net.c b/loader/net.c
index ee370ac..469f798 100644
--- a/loader/net.c
+++ b/loader/net.c
@@ -482,12 +482,12 @@ int readNetConfig(char * device, iface_t * iface,
return LOADER_BACK;
}
- i = get_connection(iface);
+ i = wait_for_iface_activation(iface->device);
newtPopWindow();
if (i > 0) {
if (FL_CMDLINE(flags)) {
- fprintf(stderr, _("There was an error configuring your network "
+ fprintf(stderr, _("There was an error activating your network "
"interface."));
fprintf(stderr, _("\nThis cannot be corrected in cmdline mode.\n"
"Halting.\n"));
@@ -495,7 +495,7 @@ int readNetConfig(char * device, iface_t * iface,
}
newtWinMessage(_("Network Error"), _("Retry"),
- _("There was an error configuring your network "
+ _("There was an error activating your network "
"interface."));
return LOADER_BACK;
}
@@ -545,12 +545,12 @@ int readNetConfig(char * device, iface_t * iface,
return LOADER_BACK;
}
- i = get_connection(iface);
+ i = wait_for_iface_activation(iface->device);
newtPopWindow();
if (i > 0) {
newtWinMessage(_("Network Error"), _("Retry"),
- _("There was an error configuring your network "
+ _("There was an error activating your network "
"interface."));
iface->ipv4method = IPV4_UNUSED_METHOD;
iface->ipv6method = IPV6_UNUSED_METHOD;
@@ -2026,6 +2026,11 @@ int activateDevice(struct loaderData_s * loaderData, iface_t * iface) {
break;
} while (1);
+ if (is_iface_activated(iface->device)) {
+ logMessage(INFO, "device %s is already activated", iface->device);
+ return 0;
+ }
+
/* we don't want to end up asking about interface more than once
* if we're in a kickstart-ish case (#100724) */
loaderData->netDev_set = 1;
@@ -2106,29 +2111,32 @@ void splitHostname (char *str, char **host, char **port)
}
/*
- * Start NetworkManager and wait for a valid link, return non-zero on error.
+ * Wait for activation of iface by NetworkManager, return non-zero on error.
+ * If iface == NULL wait for any device.
*/
-int get_connection(iface_t *iface) {
- int count = 0;
+int wait_for_iface_activation(char *ifname) {
+ int count = 0, i;
NMClient *client = NULL;
NMState state;
GMainLoop *loop;
GMainContext *ctx;
+ const GPtrArray *devices;
+ NMDevice *device = NULL;
- if (iface == NULL) {
+ if (ifname == NULL) {
return 1;
}
- logMessage(DEBUGLVL, "configuring device %s", iface->device);
+ logMessage(DEBUGLVL, "activating device %s", ifname);
/* display status */
if (FL_CMDLINE(flags)) {
- printf(_("Waiting for NetworkManager to configure %s.\n"),
- iface->device);
+ printf(_("Waiting for NetworkManager to activate %s.\n"),
+ ifname);
} else {
winStatus(55, 3, NULL,
- _("Waiting for NetworkManager to configure %s.\n"),
- iface->device, 0);
+ _("Waiting for NetworkManager to activate %s.\n"),
+ ifname, 0);
}
g_type_init();
@@ -2140,6 +2148,22 @@ int get_connection(iface_t *iface) {
return 2;
}
+ devices = nm_client_get_devices(client);
+ for (i = 0; i < devices->len; i++) {
+ NMDevice *candidate = g_ptr_array_index(devices, i);
+ const char *name = nm_device_get_iface(candidate);
+ if (!strcmp(name, ifname)) {
+ device = candidate;
+ break;
+ }
+ }
+ if (device == NULL) {
+ logMessage(ERROR, "%s (%d): network device %s not found",
+ __func__, __LINE__, ifname);
+ g_object_unref(client);
+ return 3;
+ }
+
/* Create a loop for processing dbus signals */
loop = g_main_loop_new(NULL, FALSE);
ctx = g_main_loop_get_context(loop);
@@ -2155,12 +2179,12 @@ int get_connection(iface_t *iface) {
while (g_main_context_pending (ctx)) {
g_main_context_iteration (ctx, FALSE);
}
- state = nm_client_get_state(client);
-
- if (state == NM_STATE_CONNECTED) {
- logMessage(INFO, "%s (%d): NetworkManager connected",
- __func__, __LINE__);
+ state = nm_device_get_state(device);
+ if (state == NM_DEVICE_STATE_ACTIVATED) {
+ logMessage(INFO, "%s (%d): device %s activated",
+ __func__, __LINE__, ifname);
res_init();
+ g_main_loop_unref(loop);
g_object_unref(client);
return 0;
}
diff --git a/loader/net.h b/loader/net.h
index d2cd57c..b5769a5 100644
--- a/loader/net.h
+++ b/loader/net.h
@@ -76,6 +76,7 @@ int kickstartNetworkUp(struct loaderData_s * loaderData,
int activateDevice(struct loaderData_s * loaderData,
iface_t * iface);
void splitHostname (char *str, char **host, char **port);
-int get_connection(iface_t * iface);
+int wait_for_iface_activation(char * ifname);
+int wait_for_iface_disconnection(char *ifname);
#endif
--
1.7.2
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]