summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--loader2/kickstart.c5
-rw-r--r--loader2/method.h2
-rw-r--r--loader2/nfsinstall.c52
3 files changed, 57 insertions, 2 deletions
diff --git a/loader2/kickstart.c b/loader2/kickstart.c
index 4671271f1..ca3305542 100644
--- a/loader2/kickstart.c
+++ b/loader2/kickstart.c
@@ -267,8 +267,9 @@ void getKickstartFile(struct knownDevices * kd,
logMessage("grabbing kickstart from cdrom currently unsupported");
return;
} else if (!strncmp(c, "ks=nfs:", 7)) {
- logMessage("grabbing kickstart from nfs currently unsupported");
- return;
+ if (kickstartFromNfs(c + 7, kd, loaderData, flags))
+ return;
+ loaderData->ksFile = strdup("/tmp/ks.cfg");
} else if (!strncmp(c, "ks=floppy", 9)) {
if (kickstartFromFloppy(*flagsPtr))
return;
diff --git a/loader2/method.h b/loader2/method.h
index 87648307e..1e6e218c4 100644
--- a/loader2/method.h
+++ b/loader2/method.h
@@ -44,6 +44,8 @@ struct nfsInstallData {
};
void setKickstartNfs(struct loaderData_s * loaderData, int argc,
char ** argv, int * flagsPtr);
+int kickstartFromNfs(char * url, struct knownDevices * kd,
+ struct loaderData_s * loaderData, int flags);
struct hdInstallData {
char * partition;
diff --git a/loader2/nfsinstall.c b/loader2/nfsinstall.c
index 565dfb52e..3dce5f1f5 100644
--- a/loader2/nfsinstall.c
+++ b/loader2/nfsinstall.c
@@ -271,3 +271,55 @@ void setKickstartNfs(struct loaderData_s * loaderData, int argc,
logMessage("results of nfs, host is %s, dir is %s", host, dir);
}
+
+
+int kickstartFromNfs(char * url, struct knownDevices * kd,
+ struct loaderData_s * loaderData, int flags) {
+ char * host = NULL, * file = NULL;
+ int failed = 0;
+
+ if (kickstartNetworkUp(kd, loaderData, flags)) {
+ logMessage("unable to bring up network");
+ return 1;
+ }
+
+ host = url;
+ /* JKFIXME: need to add this; abstract out the functionality
+ * so that we can use it for all types */
+ if (host[strlen(url) - 1] == '/') {
+ logMessage("directory syntax not supported yet");
+ return 1;
+ /* host[strlen(host) - 1] = '\0';
+ file = malloc(30);
+ sprintf(file, "%s-kickstart", inet_ntoa(netDev.dev.ip));*/
+ } else {
+ file = strrchr(host, '/');
+ if (!file) {
+ file = "/";
+ } else {
+ *file++ = '\0';
+ }
+ }
+
+ logMessage("ks location: nfs://%s/%s", host, file);
+
+ if (!doPwMount(host, "/tmp/ks", "nfs", 1, 0, NULL, NULL)) {
+ char * buf;
+
+ buf = alloca(strlen(file) + 10);
+ sprintf(buf, "/tmp/ks/%s", file);
+ if (copyFile(buf, "/tmp/ks.cfg")) {
+ logMessage("failed to copy ks.cfg to /tmp/ks.cfg");
+ failed = 1;
+ }
+
+ } else {
+ logMessage("failed to mount nfs source");
+ failed = 1;
+ }
+
+ umount("/tmp/ks");
+ unlink("/tmp/ks");
+
+ return failed;
+}