diff options
-rw-r--r-- | loader2/kickstart.c | 5 | ||||
-rw-r--r-- | loader2/method.h | 2 | ||||
-rw-r--r-- | loader2/nfsinstall.c | 52 |
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; +} |