summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRadek Vykydal <rvykydal@redhat.com>2011-02-16 13:34:16 +0100
committerRadek Vykydal <rvykydal@redhat.com>2011-03-02 13:21:43 +0100
commit357884e6670a2e31cdcdaaa376951e83bd204aa4 (patch)
tree2e28dc32ce4be5bbdfffab4d550be5bc664f8adb
parent53b910b6d9e6b4d2830c36d90926228f2e8ca0cc (diff)
downloadanaconda-357884e6670a2e31cdcdaaa376951e83bd204aa4.tar.gz
anaconda-357884e6670a2e31cdcdaaa376951e83bd204aa4.tar.xz
anaconda-357884e6670a2e31cdcdaaa376951e83bd204aa4.zip
Parse all kickstart network commands in loader too
Port from rhel6-branch. Resolves: rhbz#638131
-rw-r--r--loader/kickstart.c230
1 files changed, 133 insertions, 97 deletions
diff --git a/loader/kickstart.c b/loader/kickstart.c
index 8898b41b3..4a57e311e 100644
--- a/loader/kickstart.c
+++ b/loader/kickstart.c
@@ -678,149 +678,185 @@ cleanup:
}
static void setKickstartNetwork(struct loaderData_s * loaderData, PyObject *handler) {
+ Py_ssize_t i;
PyObject *list = getDataList(handler, "network");
- PyObject *ele, *attr, *noksdev;
iface_t iface;
if (!list)
return;
- /* For now, just use the first network device as the one for loader. */
- ele = PyList_GetItem(list, 0);
- if (!ele)
- goto cleanup;
-
- iface_init_iface_t(&iface);
+ for (i = 0; i < PyList_Size(list); i++) {
+ PyObject *ele = PyList_GetItem(list, i);
+ PyObject *attr, *noksdev;
- /* if they've specified dhcp/bootp use dhcp for the interface */
- attr = getObject(ele, "bootProto", 0);
- if (objIsStr(attr, "dhcp") || objIsStr(attr, "bootp")) {
- loaderData->ipv4 = strdup("dhcp");
- loaderData->ipinfo_set = 1;
- } else if (loaderData->ipv4) {
- loaderData->ipinfo_set = 1;
- }
+ if (!ele)
+ continue;
- Py_XDECREF(attr);
+ iface_init_iface_t(&iface);
+
+ /* initialize network configuration bits of loaderData struct */
+ /* except for --device which we want to take over from cmdline */
+ /* ksdevice for the first command */
+ free(loaderData->ipv4);
+ loaderData->ipv4 = NULL;
+ loaderData->ipinfo_set = 0;
+ free(loaderData->dns);
+ loaderData->dns = NULL;
+ free(loaderData->netmask);
+ loaderData->netmask = NULL;
+ free(loaderData->hostname);
+ loaderData->hostname = NULL;
+ free(loaderData->gateway);
+ loaderData->gateway = NULL;
+ free(loaderData->netCls);
+ loaderData->netCls = NULL;
+ loaderData->netCls_set = 0;
+ free(loaderData->ethtool);
+ loaderData->ethtool = NULL;
+ loaderData->essid = NULL;
+ free(loaderData->wepkey);
+ loaderData->wepkey = NULL;
+ loaderData->mtu = 0;
- /* --gateway is common for ipv4 and ipv6, same as in loader UI */
- attr = getObject(ele, "gateway", 0);
- if (isNotEmpty(attr)) {
- char *gateway = strdup(PyString_AsString(attr));
- int rc;
- struct in_addr addr;
#ifdef ENABLE_IPV6
- struct in6_addr addr6;
+ free(loaderData->ipv6);
+ loaderData->ipv6 = NULL;
+ loaderData->ipv6info_set = 0;
+ free(loaderData->gateway6);
+ loaderData->gateway6 = NULL;
#endif
- if ((rc = inet_pton(AF_INET, gateway, &addr)) == 1) {
- loaderData->gateway = gateway;
- } else if (rc == 0) {
+ /* if they've specified dhcp/bootp use dhcp for the interface */
+ attr = getObject(ele, "bootProto", 0);
+ if (objIsStr(attr, "dhcp") || objIsStr(attr, "bootp")) {
+ loaderData->ipv4 = strdup("dhcp");
+ loaderData->ipinfo_set = 1;
+ } else if (loaderData->ipv4) {
+ loaderData->ipinfo_set = 1;
+ }
+
+ Py_XDECREF(attr);
+
+ /* --gateway is common for ipv4 and ipv6, same as in loader UI */
+ attr = getObject(ele, "gateway", 0);
+ if (isNotEmpty(attr)) {
+ char *gateway = strdup(PyString_AsString(attr));
+ int rc;
+ struct in_addr addr;
#ifdef ENABLE_IPV6
- if ((rc == inet_pton(AF_INET6, gateway, &addr6)) == 1) {
- loaderData->gateway6 = gateway;
+ struct in6_addr addr6;
+#endif
+
+ if ((rc = inet_pton(AF_INET, gateway, &addr)) == 1) {
+ loaderData->gateway = gateway;
} else if (rc == 0) {
+#ifdef ENABLE_IPV6
+ if ((rc == inet_pton(AF_INET6, gateway, &addr6)) == 1) {
+ loaderData->gateway6 = gateway;
+ } else if (rc == 0) {
#endif
- logMessage(WARNING,
- "invalid address in kickstart --gateway");
+ logMessage(WARNING,
+ "invalid address in kickstart --gateway");
#ifdef ENABLE_IPV6
+ } else {
+ logMessage(ERROR, "%s (%d): %s", __func__, __LINE__,
+ strerror(errno));
+ }
+#endif
} else {
logMessage(ERROR, "%s (%d): %s", __func__, __LINE__,
strerror(errno));
}
-#endif
- } else {
- logMessage(ERROR, "%s (%d): %s", __func__, __LINE__,
- strerror(errno));
}
- }
- Py_XDECREF(attr);
+ Py_XDECREF(attr);
- noksdev = getObject(ele, "notksdevice", 0);
- if (!isTrue(noksdev)) {
- attr = getObject(ele, "device", 0);
- if (isNotEmpty(attr)) {
- char *device = PyString_AsString(attr);
+ noksdev = getObject(ele, "notksdevice", 0);
+ if (!isTrue(noksdev)) {
+ attr = getObject(ele, "device", 0);
+ if (isNotEmpty(attr)) {
+ char *device = PyString_AsString(attr);
- /* If --device=MAC was given, translate into a device name now. */
- if (index(device, ':') != NULL)
- loaderData->netDev = iface_mac2device(device);
- else
- loaderData->netDev = strdup(device);
+ /* If --device=MAC was given, translate into a device name now. */
+ if (index(device, ':') != NULL)
+ loaderData->netDev = iface_mac2device(device);
+ else
+ loaderData->netDev = strdup(device);
- loaderData->netDev_set = 1;
- logMessage(INFO, "kickstart network command - device %s", loaderData->netDev);
- } else {
- logMessage(INFO, "kickstart network command - unspecified device");
- }
+ loaderData->netDev_set = 1;
+ logMessage(INFO, "kickstart network command - device %s", loaderData->netDev);
+ } else {
+ logMessage(INFO, "kickstart network command - unspecified device");
+ }
- Py_XDECREF(attr);
+ Py_XDECREF(attr);
- _setNetworkString(ele, "dhcpclass", &loaderData->netCls, &loaderData->netCls_set);
- _setNetworkString(ele, "ethtool", &loaderData->ethtool, NULL);
- _setNetworkString(ele, "essid", &loaderData->essid, NULL);
- _setNetworkString(ele, "wepkey", &loaderData->wepkey, NULL);
+ _setNetworkString(ele, "dhcpclass", &loaderData->netCls, &loaderData->netCls_set);
+ _setNetworkString(ele, "ethtool", &loaderData->ethtool, NULL);
+ _setNetworkString(ele, "essid", &loaderData->essid, NULL);
+ _setNetworkString(ele, "wepkey", &loaderData->wepkey, NULL);
- attr = getObject(ele, "noipv4", 0);
- if (isTrue(attr))
- flags |= LOADER_FLAGS_NOIPV4;
+ attr = getObject(ele, "noipv4", 0);
+ if (isTrue(attr))
+ flags |= LOADER_FLAGS_NOIPV4;
- Py_XDECREF(attr);
+ Py_XDECREF(attr);
- attr = getObject(ele, "mtu", 0);
- if (isNotEmpty(attr)) {
- /* Don't free this string! */
- char *mtu = PyString_AsString(attr);
+ attr = getObject(ele, "mtu", 0);
+ if (isNotEmpty(attr)) {
+ /* Don't free this string! */
+ char *mtu = PyString_AsString(attr);
- errno = 0;
- loaderData->mtu = strtol(mtu, NULL, 10);
+ errno = 0;
+ loaderData->mtu = strtol(mtu, NULL, 10);
- if ((errno == ERANGE && (loaderData->mtu == LONG_MIN ||
- loaderData->mtu == LONG_MAX)) ||
- (errno != 0 && loaderData->mtu == 0)) {
- logMessage(ERROR, "%s: %d: %m", __func__, __LINE__);
- abort();
+ if ((errno == ERANGE && (loaderData->mtu == LONG_MIN ||
+ loaderData->mtu == LONG_MAX)) ||
+ (errno != 0 && loaderData->mtu == 0)) {
+ logMessage(ERROR, "%s: %d: %m", __func__, __LINE__);
+ abort();
+ }
}
- }
- Py_XDECREF(attr);
+ Py_XDECREF(attr);
#ifdef ENABLE_IPV6
- attr = getObject(ele, "noipv6", 0);
- if (isTrue(attr))
- flags |= LOADER_FLAGS_NOIPV6;
+ attr = getObject(ele, "noipv6", 0);
+ if (isTrue(attr))
+ flags |= LOADER_FLAGS_NOIPV6;
- if (loaderData->ipv6)
- loaderData->ipv6info_set = 1;
+ if (loaderData->ipv6)
+ loaderData->ipv6info_set = 1;
- Py_XDECREF(attr);
+ Py_XDECREF(attr);
#endif
- }
+ }
- attr = getObject(ele, "nodns", 0);
- if (isTrue(attr))
- loaderData->noDns = 1;
+ attr = getObject(ele, "nodns", 0);
+ if (isTrue(attr))
+ loaderData->noDns = 1;
- Py_XDECREF(attr);
+ Py_XDECREF(attr);
- Py_XDECREF(noksdev);
+ Py_XDECREF(noksdev);
- if (!is_nm_connected()) {
- logMessage(INFO, "activating because no network connection is available");
- activateDevice(loaderData, &iface);
- return;
- }
+ if (!is_nm_connected()) {
+ logMessage(INFO, "activating because no network connection is available");
+ activateDevice(loaderData, &iface);
+ continue;
+ }
- attr = getObject(ele, "activate", 0);
- if (isTrue(attr)) {
- logMessage(INFO, "activating because --activate flag is set");
- activateDevice(loaderData, &iface);
- } else {
- logMessage(INFO, "not activating becuase --activate flag is not set");
+ attr = getObject(ele, "activate", 0);
+ if (isTrue(attr)) {
+ logMessage(INFO, "activating because --activate flag is set");
+ activateDevice(loaderData, &iface);
+ } else {
+ logMessage(INFO, "not activating becuase --activate flag is not set");
+ }
+
+ Py_XDECREF(attr);
}
-cleanup:
Py_XDECREF(list);
}