diff options
-rw-r--r-- | loader2/ftp.c | 18 | ||||
-rw-r--r-- | loader2/ftp.h | 2 | ||||
-rw-r--r-- | loader2/loader.c | 5 | ||||
-rw-r--r-- | loader2/loader.h | 2 | ||||
-rw-r--r-- | loader2/urlinstall.c | 39 | ||||
-rw-r--r-- | loader2/urls.c | 8 | ||||
-rw-r--r-- | loader2/urls.h | 2 |
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); |