diff options
author | Erik Troan <ewt@redhat.com> | 1999-09-23 19:50:16 +0000 |
---|---|---|
committer | Erik Troan <ewt@redhat.com> | 1999-09-23 19:50:16 +0000 |
commit | 6d37596f9216a5a90d6b0769a1c75b5773f7b1b5 (patch) | |
tree | 99929974348690fa8e46ac2349d58c0831495376 /loader | |
parent | c2629cb4198f3f1e8d667ad1a7431cac82282871 (diff) | |
download | anaconda-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.c | 80 | ||||
-rw-r--r-- | loader/net.c | 96 | ||||
-rw-r--r-- | loader/net.h | 2 |
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 |