summaryrefslogtreecommitdiffstats
path: root/loader
diff options
context:
space:
mode:
authorErik Troan <ewt@redhat.com>1999-09-23 19:50:16 +0000
committerErik Troan <ewt@redhat.com>1999-09-23 19:50:16 +0000
commit6d37596f9216a5a90d6b0769a1c75b5773f7b1b5 (patch)
tree99929974348690fa8e46ac2349d58c0831495376 /loader
parentc2629cb4198f3f1e8d667ad1a7431cac82282871 (diff)
downloadanaconda-6d37596f9216a5a90d6b0769a1c75b5773f7b1b5.tar.gz
anaconda-6d37596f9216a5a90d6b0769a1c75b5773f7b1b5.tar.xz
anaconda-6d37596f9216a5a90d6b0769a1c75b5773f7b1b5.zip
getting kickstart file via the network should work now
Diffstat (limited to 'loader')
-rw-r--r--loader/loader.c80
-rw-r--r--loader/net.c96
-rw-r--r--loader/net.h2
3 files changed, 123 insertions, 55 deletions
diff --git a/loader/loader.c b/loader/loader.c
index c108d18f3..b08df7afd 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -1311,7 +1311,7 @@ static char * setupKickstart(char * location, struct knownDevices * kd,
#ifdef INCLUDE_NETWORK
if (ksType == KS_CMD_NFS || ksType == KS_CMD_URL) {
startNewt(flags);
- if (kickstartNetwork(device, &netDev, flags)) return NULL;
+ if (kickstartNetwork(device, &netDev, NULL, flags)) return NULL;
writeNetInfo("/tmp/netinfo", &netDev);
} else if (ksType == KS_CMD_URL) {
abort();
@@ -1436,10 +1436,69 @@ static int parseCmdLineFlags(int flags, char * cmdLine, char ** ksSource) {
return flags;
}
-struct moduleDependency_s {
- char * name;
- char ** deps;
-};
+#ifdef INCLUDE_NETWORK
+int kickstartFromNfs(char * location, moduleList modLoaded, moduleDeps modDeps,
+ int flags) {
+ struct networkDeviceConfig netDev;
+ char * file, * fullFn;
+ char * ksPath;
+
+ if (kickstartNetwork("eth0", &netDev, "dhcp", flags)) {
+ logMessage("no dhcp response received");
+ return 1;
+ }
+
+ writeNetInfo("/tmp/netinfo", &netDev);
+
+ if (!(netDev.dev.set & PUMP_INTFINFO_HAS_BOOTSERVER)) {
+ logMessage("no bootserver was found");
+ return 1;
+ }
+
+ if (!(netDev.dev.set & PUMP_INTFINFO_HAS_BOOTFILE)) {
+ file = "/kickstart/";
+ logMessage("bootp: no bootfile received");
+ } else {
+ file = netDev.dev.bootFile;
+ }
+
+ ksPath = alloca(strlen(file) + strlen(netDev.dev.hostname) + 70);
+ strcpy(ksPath, inet_ntoa(netDev.dev.bootServer));
+ strcat(ksPath, ":");
+ strcat(ksPath, file);
+
+ if (ksPath[strlen(ksPath) - 1] == '/') {
+ ksPath[strlen(ksPath) - 1] = '\0';
+ file = malloc(30);
+ sprintf(file, "%s-kickstart", inet_ntoa(netDev.dev.ip));
+ } else {
+ file = strrchr(ksPath, '/');
+ if (!file) {
+ file = ksPath;
+ ksPath = "/";
+ } else {
+ *file++ = '\0';
+ }
+ }
+
+ logMessage("ks server: %s file: %s", ksPath, file);
+
+ mlLoadModule("nfs", NULL, modLoaded, modDeps, NULL, flags);
+
+ if (doPwMount(ksPath, "/tmp/nfskd", "nfs", 1, 0, NULL, NULL)) {
+ logMessage("failed to mount %s", ksPath);
+ return 1;
+ }
+
+ fullFn = malloc(strlen(file) + 20);
+ sprintf(fullFn, "/tmp/ks/%s", file);
+ copyFile(fullFn, location);
+
+ umount("/tmp/nfs");
+
+ return 0;
+}
+#endif
int kickstartFromHardDrive(char * location,
moduleList modLoaded, moduleDeps modDeps,
@@ -1610,11 +1669,8 @@ int main(int argc, char ** argv) {
ksFile = "/tmp/ks.cfg";
kickstartFromFloppy(ksFile, modLoaded, modDeps, flags);
flags |= LOADER_FLAGS_KICKSTART;
- } else if (FL_KICKSTART(flags)) {
- /* XXX we need to get our ks file from the network */
}
-
#ifdef INCLUDE_PCMCIA
startNewt(flags);
@@ -1641,7 +1697,15 @@ int main(int argc, char ** argv) {
ksFile = "/tmp/ks.cfg";
kickstartFromHardDrive(ksFile, modLoaded, modDeps, ksSource, flags);
flags |= LOADER_FLAGS_KICKSTART;
+ }
+
+#ifdef INCLUDE_NETWORK
+ if (FL_KICKSTART(flags)) {
+ ksFile = "/tmp/ks.cfg";
+ startNewt(flags);
+ kickstartFromNfs(ksFile, modLoaded, modDeps, flags);
}
+#endif
if (ksFile) {
ksReadCommands(ksFile);
diff --git a/loader/net.c b/loader/net.c
index c92d51742..9d63823bf 100644
--- a/loader/net.c
+++ b/loader/net.c
@@ -492,11 +492,10 @@ int findHostAndDomain(struct networkDeviceConfig * dev, int flags) {
#ifndef __STANDALONE__
int kickstartNetwork(char * device, struct networkDeviceConfig * netDev,
- int flags) {
+ char * bootProto, int flags) {
char ** ksArgv;
int ksArgc;
int netSet, rc;
- char * bootProto = "dhcp";
char * arg, * chptr;
poptContext optCon;
struct in_addr * parseAddress;
@@ -509,57 +508,62 @@ int kickstartNetwork(char * device, struct networkDeviceConfig * netDev,
{ 0, 0, 0, 0, 0 }
};
- if (ksGetCommand(KS_CMD_NETWORK, NULL, &ksArgc, &ksArgv)) {
- /* This is for compatibility with RH 5.0 */
- ksArgv = alloca(sizeof(*ksArgv) * 1);
- ksArgv[0] = "network";
- ksArgc = 1;
- }
+ if (!bootProto)
+ bootProto = "dhcp";
- optCon = poptGetContext(NULL, ksArgc, ksArgv, ksOptions, 0);
- while ((rc = poptGetNextOpt(optCon)) >= 0) {
- parseAddress = NULL;
- netSet = 0;
+ if (!bootProto) {
+ if (ksGetCommand(KS_CMD_NETWORK, NULL, &ksArgc, &ksArgv)) {
+ /* This is for compatibility with RH 5.0 */
+ ksArgv = alloca(sizeof(*ksArgv) * 1);
+ ksArgv[0] = "network";
+ ksArgc = 1;
+ }
- arg = poptGetOptArg(optCon);
+ optCon = poptGetContext(NULL, ksArgc, ksArgv, ksOptions, 0);
+ while ((rc = poptGetNextOpt(optCon)) >= 0) {
+ parseAddress = NULL;
+ netSet = 0;
+
+ arg = poptGetOptArg(optCon);
+
+ switch (rc) {
+ case 'g':
+ parseAddress = &netDev->dev.gateway;
+ netSet = PUMP_NETINFO_HAS_GATEWAY;
+ break;
+
+ case 'i':
+ parseAddress = &netDev->dev.ip;
+ netSet = PUMP_INTFINFO_HAS_IP;
+ break;
+
+ case 'n':
+ parseAddress = &netDev->dev.dnsServers[netDev->dev.numDns++];
+ netSet = PUMP_NETINFO_HAS_DNS;
+ break;
+
+ case 'm':
+ parseAddress = &netDev->dev.netmask;
+ netSet = PUMP_INTFINFO_HAS_NETMASK;
+ break;
+ }
- switch (rc) {
- case 'g':
- parseAddress = &netDev->dev.gateway;
- netSet = PUMP_NETINFO_HAS_GATEWAY;
- break;
-
- case 'i':
- parseAddress = &netDev->dev.ip;
- netSet = PUMP_INTFINFO_HAS_IP;
- break;
-
- case 'n':
- parseAddress = &netDev->dev.dnsServers[netDev->dev.numDns++];
- netSet = PUMP_NETINFO_HAS_DNS;
- break;
+ if (!inet_aton(arg, parseAddress)) {
+ logMessage("bad ip number in network command: %s", arg);
+ return -1;
+ }
- case 'm':
- parseAddress = &netDev->dev.netmask;
- netSet = PUMP_INTFINFO_HAS_NETMASK;
- break;
+ netDev->dev.set |= netSet;
}
- if (!inet_aton(arg, parseAddress)) {
- logMessage("bad ip number in network command: %s", arg);
- return -1;
+ if (rc < -1) {
+ newtWinMessage(_("kickstart"), _("OK"),
+ _("bad argument to kickstart network command %s: %s"),
+ poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
+ poptStrerror(rc));
+ } else {
+ poptFreeContext(optCon);
}
-
- netDev->dev.set |= netSet;
- }
-
- if (rc < -1) {
- newtWinMessage(_("kickstart"), _("OK"),
- _("bad argument to kickstart network command %s: %s"),
- poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
- poptStrerror(rc));
- } else {
- poptFreeContext(optCon);
}
if (!strcmp(bootProto, "dhcp") || !strcmp(bootProto, "bootp")) {
diff --git a/loader/net.h b/loader/net.h
index 03686d715..3b115400a 100644
--- a/loader/net.h
+++ b/loader/net.h
@@ -21,7 +21,7 @@ int writeResolvConf(struct networkDeviceConfig * net);
#ifndef __STANDALONE__
int nfsGetSetup(char ** hostptr, char ** dirptr);
int kickstartNetwork(char * device, struct networkDeviceConfig * netDev,
- int flags);
+ char * bootProto, int flags);
void initLoopback(void);
#endif