diff options
author | Mike Fulbright <msf@redhat.com> | 2002-12-17 17:39:43 +0000 |
---|---|---|
committer | Mike Fulbright <msf@redhat.com> | 2002-12-17 17:39:43 +0000 |
commit | a46c0c55d17e48fbc099d8eb0812a3ef24808afd (patch) | |
tree | 923735037dbf8450eba0ace55143b92e8baf8123 /loader2 | |
parent | ce10e9b32a53e20e5584a15754a21da98886be81 (diff) | |
download | anaconda-a46c0c55d17e48fbc099d8eb0812a3ef24808afd.tar.gz anaconda-a46c0c55d17e48fbc099d8eb0812a3ef24808afd.tar.xz anaconda-a46c0c55d17e48fbc099d8eb0812a3ef24808afd.zip |
add support for pulling ks.cfg from hd or cd
Diffstat (limited to 'loader2')
-rw-r--r-- | loader2/cdinstall.c | 38 | ||||
-rw-r--r-- | loader2/cdinstall.h | 1 | ||||
-rw-r--r-- | loader2/hdinstall.c | 43 | ||||
-rw-r--r-- | loader2/hdinstall.h | 1 | ||||
-rw-r--r-- | loader2/kickstart.c | 89 | ||||
-rw-r--r-- | loader2/kickstart.h | 2 |
6 files changed, 148 insertions, 26 deletions
diff --git a/loader2/cdinstall.c b/loader2/cdinstall.c index 297d7e437..0fa8c5901 100644 --- a/loader2/cdinstall.c +++ b/loader2/cdinstall.c @@ -31,6 +31,7 @@ #include <linux/cdrom.h> #endif +#include "kickstart.h" #include "loader.h" #include "loadermisc.h" #include "log.h" @@ -390,3 +391,40 @@ void setKickstartCD(struct loaderData_s * loaderData, int argc, loaderData->method = strdup("cdrom"); } + +int kickstartFromCD(char *kssrc, struct knownDevices * kd, int flags) { + int rc; + int i; + char *p, *kspath; + + logMessage("getting kickstart file from first CDROM"); + + for (i = 0; i < kd->numKnown; i++) + if (kd->known[i].class == CLASS_CDROM) + break; + + if (i >= kd->numKnown) { + logMessage("No CDROM devices found!"); + return 1; + } + + /* format is ks=cdrom:[/path/to/ks.cfg] */ + kspath = ""; + p = strchr(kssrc, ':'); + if (p) + kspath = p + 1; + + if (!p || strlen(kspath) < 1) + kspath = "/ks.cfg"; + + if ((rc=getKickstartFromBlockDevice(kd->known[i].name, kspath))) { + if (rc == 3) { + startNewt(flags); + newtWinMessage(_("Error"), _("OK"), + _("Cannot find kickstart file on CDROM.")); + } + return 1; + } + + return 0; +} diff --git a/loader2/cdinstall.h b/loader2/cdinstall.h index 7c57269f7..4bbdd3aaf 100644 --- a/loader2/cdinstall.h +++ b/loader2/cdinstall.h @@ -20,4 +20,5 @@ char * findRedHatCD(char * location, void setKickstartCD(struct loaderData_s * loaderData, int argc, char ** argv, int * flagsPtr); +int kickstartFromCD(char *kssrc, struct knownDevices * kd, int flags); #endif diff --git a/loader2/hdinstall.c b/loader2/hdinstall.c index 65e667b21..c1831ece5 100644 --- a/loader2/hdinstall.c +++ b/loader2/hdinstall.c @@ -28,6 +28,7 @@ #include "driverdisk.h" #include "hdinstall.h" +#include "kickstart.h" #include "loader.h" #include "loadermisc.h" #include "log.h" @@ -518,6 +519,48 @@ void setKickstartHD(struct loaderData_s * loaderData, int argc, logMessage("results of hd ks, partition is %s, dir is %s", partition, dir); } +int kickstartFromHD(char *kssrc, int flags) { + int rc; + char *p, *q, *tmpstr, *ksdev, *kspath; + + logMessage("getting kickstart file from harddrive"); + + /* format is ks=hd:[device]:/path/to/ks.cfg */ + /* split of pieces */ + tmpstr = strdup(kssrc); + p = strchr(tmpstr, ':'); + if (p) + q = strchr(p+1, ':'); + + /* no second colon, assume its the old format of ks=hd:[device]/path/to/ks.cfg */ + /* this format is bad however because some devices have '/' in them! */ + if (!q) + q = strchr(p+1, '/'); + + if (!p || !q) { + logMessage("Format of command line is ks=hd:[device]:/path/to/ks.cfg"); + free(tmpstr); + return 1; + } + + *q = '\0'; + ksdev = p+1; + kspath = q+1; + + logMessage("Loading ks from device %s on path %s", ksdev, kspath); + if ((rc=getKickstartFromBlockDevice(ksdev, kspath))) { + if (rc == 3) { + startNewt(flags); + newtWinMessage(_("Error"), _("OK"), + _("Cannot find kickstart file on hard drive.")); + } + return 1; + } + + return 0; +} + + #endif /* use for testing */ diff --git a/loader2/hdinstall.h b/loader2/hdinstall.h index 0587de7b0..8706304be 100644 --- a/loader2/hdinstall.h +++ b/loader2/hdinstall.h @@ -16,5 +16,6 @@ char * mountHardDrive(struct installMethod * method, struct loaderData_s * loaderData, moduleInfoSet modInfo, moduleList modLoaded, moduleDeps * modDepsPtr, int flags); +int kickstartFromHD(char *kssrc, int flags); #endif diff --git a/loader2/kickstart.c b/loader2/kickstart.c index eb3daba3a..721936b99 100644 --- a/loader2/kickstart.c +++ b/loader2/kickstart.c @@ -208,9 +208,10 @@ int ksGetCommand(int cmd, char ** last, int * argc, char *** argv) { return 1; } -int kickstartFromFloppy(int flags) { +int kickstartFromFloppy(char *kssrc, int flags) { struct device ** devices; - int i; + char *p, *kspath; + int i, rc; logMessage("doing kickstart from floppy"); devices = probeDevices(CLASS_FLOPPY, BUS_MISC | BUS_IDE | BUS_SCSI, @@ -232,31 +233,67 @@ int kickstartFromFloppy(int flags) { return 1; } - if (devMakeInode(devices[i]->device, "/tmp/floppy")) - return 1; + /* format is ks=floppy:[/path/to/ks.cfg] */ + kspath = ""; + p = strchr(kssrc, ':'); + if (p) + kspath = p + 1; + + if (!p || strlen(kspath) < 1) + kspath = "/ks.cfg"; + + if ((rc=getKickstartFromBlockDevice(devices[i]->device, kspath))) { + if (rc == 3) { + startNewt(flags); + newtWinMessage(_("Error"), _("OK"), + _("Cannot find ks.cfg on boot floppy.")); + } + return 1; + } + + return 0; +} - if ((doPwMount("/tmp/floppy", "/tmp/ks", "vfat", 1, 0, NULL, NULL)) && - doPwMount("/tmp/floppy", "/tmp/ks", "ext2", 1, 0, NULL, NULL)) { - logMessage("failed to mount floppy: %s", strerror(errno)); + +/* given a device name (w/o '/dev' on it), try to get ks file */ +/* Error codes: + 1 - could not create device node + 2 - could not mount device as ext2, vfat, or iso9660 + 3 - kickstart file named path not there +*/ +int getKickstartFromBlockDevice(char *device, char *path) { + int rc; + char ksfile[4096]; + + logMessage("getKickstartFromBlockDevice(%s, %s)", device, path); + + if (devMakeInode(device, "/tmp/kssrcdev")) return 1; + + if ((doPwMount("/tmp/kssrcdev", "/tmp/ks", "vfat", 1, 0, NULL, NULL)) && + doPwMount("/tmp/kssrcdev", "/tmp/ks", "ext2", 1, 0, NULL, NULL) && + doPwMount("/tmp/kssrcdev", "/tmp/ks", "iso9660", 1, 0, NULL, NULL)) { + logMessage("failed to mount /dev/%s: %s", device, strerror(errno)); + return 2; } + + snprintf(ksfile, sizeof(ksfile), "/tmp/ks/%s", path); + logMessage("Searching for ks file on path %s", ksfile); - if (access("/tmp/ks/ks.cfg", R_OK)) { - startNewt(flags); - newtWinMessage(_("Error"), _("OK"), - _("Cannot find ks.cfg on boot floppy.")); - return 1; - } + if (access(ksfile, R_OK)) { + rc = 3; + } else { + copyFile(ksfile, "/tmp/ks.cfg"); + rc = 0; + logMessage("kickstart file copied to /tmp/ks.cfg"); + } - copyFile("/tmp/ks/ks.cfg", "/tmp/ks.cfg"); umount("/tmp/ks"); - unlink("/tmp/floppy"); - - logMessage("kickstart file copied to /tmp/ks.cfg"); - - return 0; + unlink("/tmp/kssrcdev"); + return rc; } + void getKickstartFile(struct knownDevices * kd, struct loaderData_s * loaderData, int * flagsPtr) { char * c = loaderData->ksFile; @@ -268,20 +305,22 @@ void getKickstartFile(struct knownDevices * kd, if (kickstartFromUrl(c + 3, kd, loaderData, flags)) return; loaderData->ksFile = strdup("/tmp/ks.cfg"); - } else if (!strncmp(c, "ks=cdrom:", 9)) { - logMessage("grabbing kickstart from cdrom currently unsupported"); - return; } else if (!strncmp(c, "ks=nfs:", 7)) { if (kickstartFromNfs(c + 7, kd, loaderData, flags)) return; loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "ks=floppy", 9)) { - if (kickstartFromFloppy(*flagsPtr)) + if (kickstartFromFloppy(c, *flagsPtr)) return; loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "ks=hd:", 6)) { - logMessage("grabbing kickstart from hd currently unsupported"); - return; + if (kickstartFromHD(c, *flagsPtr)) + return; + loaderData->ksFile = strdup("/tmp/ks.cfg"); + } else if (!strncmp(c, "ks=cdrom", 8)) { + if (kickstartFromCD(c, kd, *flagsPtr)) + return; + loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "ks=file:", 8)) { loaderData->ksFile = c + 8; } else if (!strcmp(c, "ks")) { diff --git a/loader2/kickstart.h b/loader2/kickstart.h index 8d14042e7..7e74de073 100644 --- a/loader2/kickstart.h +++ b/loader2/kickstart.h @@ -20,5 +20,5 @@ int ksHasCommand(int cmd); void getKickstartFile(struct knownDevices * kd, struct loaderData_s * loaderData, int * flagsPtr); void setupKickstart(struct loaderData_s * loaderData, int * flagsPtr); - +int getKickstartFromBlockDevice(char *device, char *path); #endif |