summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Katz <katzj@redhat.com>2005-01-06 19:35:32 +0000
committerJeremy Katz <katzj@redhat.com>2005-01-06 19:35:32 +0000
commit8bcbed4d7cd0cb69dbfbb428d95d9d51d66201b6 (patch)
tree0f536a8a748928ea8b24ea481c0c5160d2a59e8a
parenta1f030fc982419ad0fbc652aa6dfa9543d7a5580 (diff)
downloadanaconda-8bcbed4d7cd0cb69dbfbb428d95d9d51d66201b6.tar.gz
anaconda-8bcbed4d7cd0cb69dbfbb428d95d9d51d66201b6.tar.xz
anaconda-8bcbed4d7cd0cb69dbfbb428d95d9d51d66201b6.zip
2005-01-06 Jeremy Katz <katzj@redhat.com>
* loader2/loader.c (parseCmdLineIp): Add patch from Bastien Nocera to support parsing of pxelinux IPAPPEND (#134054)
-rw-r--r--ChangeLog5
-rw-r--r--loader2/loader.c49
2 files changed, 52 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e34d2f8a..ab093d43b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-06 Jeremy Katz <katzj@redhat.com>
+
+ * loader2/loader.c (parseCmdLineIp): Add patch from Bastien Nocera
+ to support parsing of pxelinux IPAPPEND (#134054)
+
2005-01-04 Jeremy Katz <katzj@redhat.com>
* partedUtils.py (getDefaultDiskType): the default disk type on
diff --git a/loader2/loader.c b/loader2/loader.c
index 8c899e8ff..99ade0762 100644
--- a/loader2/loader.c
+++ b/loader2/loader.c
@@ -456,6 +456,52 @@ static void readNetInfo(int flags, struct loaderData_s ** ld) {
fclose(f);
}
+/* parse anaconda or pxelinux-style ip= arguments
+ * pxelinux format: ip=<client-ip>:<boot-server-ip>:<gw-ip>:<netmask>
+ * anaconda format: ip=<client-ip> netmask=<netmask> gateway=<gw-ip>
+*/
+static void parseCmdLineIp(struct loaderData_s * loaderData, char *argv)
+{
+ /* Detect pxelinux */
+ if (strstr(argv, ":") != NULL) {
+ char *start, *end;
+
+ /* IP */
+ start = argv + 3;
+ end = strstr(start, ":");
+ loaderData->ip = strndup(start, end-start);
+ loaderData->ipinfo_set = 1;
+
+ /* Boot server */
+ if (end + 1 == '\0')
+ return;
+ start = end + 1;
+ end = strstr(start, ":");
+ if (end == NULL)
+ return;
+
+ /* Gateway */
+ if (end + 1 == '\0')
+ return;
+ start = end + 1;
+ end = strstr(start, ":");
+ if (end == NULL) {
+ loaderData->gateway = strdup (start);
+ return;
+ } else
+ loaderData->gateway = strndup(start, end-start);
+
+ /* Netmask */
+ if (end + 1 == '\0')
+ return;
+ start = end + 1;
+ loaderData->netmask = strdup(start);
+ } else {
+ loaderData->ip = strdup(argv + 3);
+ loaderData->ipinfo_set = 1;
+ }
+}
+
/* parses /proc/cmdline for any arguments which are important to us.
* NOTE: in test mode, can specify a cmdline with --cmdline
*/
@@ -567,8 +613,7 @@ static int parseCmdLineFlags(int flags, struct loaderData_s * loaderData,
} else if (!strncasecmp(argv[i], "method=", 7)) {
setMethodFromCmdline(argv[i] + 7, loaderData);
} else if (!strncasecmp(argv[i], "ip=", 3)) {
- loaderData->ip = strdup(argv[i] + 3);
- loaderData->ipinfo_set = 1;
+ parseCmdLineIp(loaderData, argv[i]);
} else if (!strncasecmp(argv[i], "netmask=", 8))
loaderData->netmask = strdup(argv[i] + 8);
else if (!strncasecmp(argv[i], "gateway=", 8))