summaryrefslogtreecommitdiffstats
path: root/loader2
diff options
context:
space:
mode:
authorMike Fulbright <msf@redhat.com>2002-12-17 17:39:43 +0000
committerMike Fulbright <msf@redhat.com>2002-12-17 17:39:43 +0000
commita46c0c55d17e48fbc099d8eb0812a3ef24808afd (patch)
tree923735037dbf8450eba0ace55143b92e8baf8123 /loader2
parentce10e9b32a53e20e5584a15754a21da98886be81 (diff)
downloadanaconda-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.c38
-rw-r--r--loader2/cdinstall.h1
-rw-r--r--loader2/hdinstall.c43
-rw-r--r--loader2/hdinstall.h1
-rw-r--r--loader2/kickstart.c89
-rw-r--r--loader2/kickstart.h2
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