summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--loader2/ftp.c18
-rw-r--r--loader2/ftp.h2
-rw-r--r--loader2/loader.c5
-rw-r--r--loader2/loader.h2
-rw-r--r--loader2/urlinstall.c39
-rw-r--r--loader2/urls.c8
-rw-r--r--loader2/urls.h2
7 files changed, 64 insertions, 12 deletions
diff --git a/loader2/ftp.c b/loader2/ftp.c
index 8dede50ef..569e26602 100644
--- a/loader2/ftp.c
+++ b/loader2/ftp.c
@@ -418,16 +418,21 @@ const char *ftpStrerror(int errorNumber) {
return("FTP Unknown or unexpected error");
}
}
-
-int httpGetFileDesc(char * hostname, int port, char * remotename) {
+
+/* extraHeaders is either NULL or a string with extra headers separated by '\r\n', ending with
+ * '\r\n'
+ */
+int httpGetFileDesc(char * hostname, int port, char * remotename, char *extraHeaders) {
char * buf;
struct timeval timeout;
char headers[4096];
char * nextChar = headers;
+ char *hstr;
int checkedCode;
struct in_addr serverAddress;
int sock;
int rc;
+ int hlen;
struct sockaddr_in destPort;
fd_set readSet;
@@ -449,8 +454,13 @@ int httpGetFileDesc(char * hostname, int port, char * remotename) {
return FTPERR_FAILED_CONNECT;
}
- buf = alloca(strlen(remotename) + strlen(hostname) + 25);
- sprintf(buf, "GET %s HTTP/1.0\t\nHost: %s\r\n\r\n", remotename, hostname);
+ if (extraHeaders)
+ hstr = extraHeaders;
+ else
+ hstr = "";
+
+ buf = alloca(strlen(remotename) + strlen(hostname) + strlen(hstr) + 25);
+ sprintf(buf, "GET %s HTTP/1.0\t\nHost: %s\r\n%s\r\n", remotename, hostname, hstr);
write(sock, buf, strlen(buf));
/* This is fun; read the response a character at a time until we:
diff --git a/loader2/ftp.h b/loader2/ftp.h
index 2c7052312..dc2500603 100644
--- a/loader2/ftp.h
+++ b/loader2/ftp.h
@@ -20,6 +20,6 @@ int ftpGetFile(int sock, char * remotename, int dest);
int ftpGetFileDesc(int sock, char * remotename);
int ftpGetFileDone(int sock);
-int httpGetFileDesc(char * hostname, int port, char * remotename);
+int httpGetFileDesc(char * hostname, int port, char * remotename, char *extraHeaders);
#endif
diff --git a/loader2/loader.c b/loader2/loader.c
index 164bbdf79..04ff4d34f 100644
--- a/loader2/loader.c
+++ b/loader2/loader.c
@@ -492,6 +492,8 @@ static int parseCmdLineFlags(int flags, struct loaderData_s * loaderData,
flags |= LOADER_FLAGS_SERIAL;
else if (!strcasecmp(argv[i], "nofb"))
flags |= LOADER_FLAGS_NOFB;
+ else if (!strcasecmp(argv[i], "kssendmac"))
+ flags |= LOADER_FLAGS_KICKSTART_SEND_MAC;
else if (!strncasecmp(argv[i], "debug=", 6))
setLogLevel(strtol(argv[i] + 6, (char **)NULL, 10));
else if (!strncasecmp(argv[i], "ksdevice=", 9)) {
@@ -1052,6 +1054,9 @@ int main(int argc, char ** argv) {
if (mediacheck) flags |= LOADER_FLAGS_MEDIACHECK;
if (ksFile) flags |= LOADER_FLAGS_KICKSTART;
+ /* uncomment to enable sending mac address in ks=http:/ header */
+ flags |= LOADER_FLAGS_KICKSTART_SEND_MAC;
+
/* JKFIXME: I do NOT like this... it also looks kind of bogus */
#if defined(__s390__) && !defined(__s390x__)
flags |= LOADER_FLAGS_NOSHELL | LOADER_FLAGS_NOUSB;
diff --git a/loader2/loader.h b/loader2/loader.h
index e7b007cc0..397a7b6fd 100644
--- a/loader2/loader.h
+++ b/loader2/loader.h
@@ -12,6 +12,7 @@
#define LOADER_FLAGS_TEXT (1 << 2)
#define LOADER_FLAGS_RESCUE (1 << 3)
#define LOADER_FLAGS_KICKSTART (1 << 4)
+#define LOADER_FLAGS_KICKSTART_SEND_MAC (1 << 5)
#define LOADER_FLAGS_NOPROBE (1 << 7)
#define LOADER_FLAGS_MODDISK (1 << 8)
#define LOADER_FLAGS_ISA (1 << 9)
@@ -37,6 +38,7 @@
#define FL_TEXT(a) ((a) & LOADER_FLAGS_TEXT)
#define FL_RESCUE(a) ((a) & LOADER_FLAGS_RESCUE)
#define FL_KICKSTART(a) ((a) & LOADER_FLAGS_KICKSTART)
+#define FL_KICKSTART_SEND_MAC(a) ((a) & LOADER_FLAGS_KICKSTART_SEND_MAC)
#define FL_NOPROBE(a) ((a) & LOADER_FLAGS_NOPROBE)
#define FL_MODDISK(a) ((a) & LOADER_FLAGS_MODDISK)
#define FL_ISA(a) ((a) & LOADER_FLAGS_ISA)
diff --git a/loader2/urlinstall.c b/loader2/urlinstall.c
index e4243f4ba..3f872bea1 100644
--- a/loader2/urlinstall.c
+++ b/loader2/urlinstall.c
@@ -42,7 +42,7 @@ static int loadSingleUrlImage(struct iurlinfo * ui, char * file, int flags,
int rc;
char * newFile = NULL;
- fd = urlinstStartTransfer(ui, file, 1);
+ fd = urlinstStartTransfer(ui, file, NULL, 1);
if (fd == -2) return 1;
@@ -52,7 +52,7 @@ static int loadSingleUrlImage(struct iurlinfo * ui, char * file, int flags,
newFile = alloca(strlen(device) + 20);
sprintf(newFile, "disc1/%s", file);
- fd = urlinstStartTransfer(ui, newFile, 1);
+ fd = urlinstStartTransfer(ui, newFile, NULL, 1);
if (fd == -2) return 1;
if (fd < 0) {
@@ -304,6 +304,7 @@ int kickstartFromUrl(char * url, struct knownDevices * kd,
char * host = NULL, * file = NULL, * chptr = NULL;
int fd, rc;
struct networkDeviceConfig netCfg;
+ char *ehdrs;
if (kickstartNetworkUp(kd, loaderData, &netCfg, flags)) {
logMessage("unable to bring up network");
@@ -331,7 +332,39 @@ int kickstartFromUrl(char * url, struct knownDevices * kd,
ui.prefix = strdup(host);
}
- fd = urlinstStartTransfer(&ui, file, 1);
+ ehdrs = NULL;
+ if (proto == URL_METHOD_HTTP && FL_KICKSTART_SEND_MAC(flags)) {
+ /* find all ethernet devices and make a header entry for each one */
+ int i, hdrlen;
+ char *dev, *mac, tmpstr[128];
+
+ hdrlen = 0;
+ for (i = 0; i < kd->numKnown; i++) {
+ if (kd->known[i].class != CLASS_NETWORK)
+ continue;
+
+ dev = kd->known[i].name;
+ mac = getMacAddr(dev);
+
+ if (mac) {
+ snprintf(tmpstr, sizeof(tmpstr), "X-RHN-Provisioning-MAC-%d: %s %s\r\n", i, dev, mac);
+ free(mac);
+
+ if (!ehdrs) {
+ hdrlen = 128;
+ ehdrs = (char *) malloc(hdrlen);
+ *ehdrs = '\0';
+ } else if ( strlen(tmpstr) + strlen(ehdrs) +2 > hdrlen) {
+ hdrlen += 128;
+ ehdrs = (char *) realloc(ehdrs, hdrlen);
+ }
+
+ strcat(ehdrs, tmpstr);
+ }
+ }
+ }
+
+ fd = urlinstStartTransfer(&ui, file, ehdrs, 1);
if (fd < 0) {
logMessage("failed to retrieve http://%s/%s/%s", ui.address, ui.prefix, file);
return 1;
diff --git a/loader2/urls.c b/loader2/urls.c
index b3d5ad678..23bce718f 100644
--- a/loader2/urls.c
+++ b/loader2/urls.c
@@ -140,8 +140,10 @@ char *convertUIToURL(struct iurlinfo *ui) {
return url;
}
-
-int urlinstStartTransfer(struct iurlinfo * ui, char * filename,
+/* extraHeaders only applicable for http and used for pulling ks from http */
+/* see ftp.c:httpGetFileDesc() for details */
+/* set to NULL if not needed */
+int urlinstStartTransfer(struct iurlinfo * ui, char * filename, char *extraHeaders,
int silentErrors) {
char * buf;
int fd;
@@ -180,7 +182,7 @@ int urlinstStartTransfer(struct iurlinfo * ui, char * filename,
return -1;
}
} else {
- fd = httpGetFileDesc(ui->address, -1, buf);
+ fd = httpGetFileDesc(ui->address, -1, buf, extraHeaders);
if (fd < 0) {
if (!silentErrors)
newtWinMessage(_("Error"), _("OK"),
diff --git a/loader2/urls.h b/loader2/urls.h
index 4721d9068..f2110bff2 100644
--- a/loader2/urls.h
+++ b/loader2/urls.h
@@ -22,7 +22,7 @@ int setupRemote(struct iurlinfo * ui);
int urlMainSetupPanel(struct iurlinfo * ui, urlprotocol protocol,
char * doSecondarySetup);
int urlSecondarySetupPanel(struct iurlinfo * ui, urlprotocol protocol);
-int urlinstStartTransfer(struct iurlinfo * ui, char * filename,
+int urlinstStartTransfer(struct iurlinfo * ui, char * filename, char *extraHeaders,
int silentErrors);
int urlinstFinishTransfer(struct iurlinfo * ui, int fd);