void getKickstartFile(struct loaderData_s *loaderData) { char *c; int rc = 1; /* Chop off the parameter name, if given. */ if (!strncmp(loaderData->ksFile, "ks=", 3)) c = loaderData->ksFile+3; else c = loaderData->ksFile; while (rc != 0) { if (!strncmp(c, "ks", 2)) { #ifdef STACKI /* * make the default kickstart method the URL method */ rc = kickstartFromUrl("", loaderData); if (rc) { return; } #else rc = kickstartFromNfs(NULL, loaderData); #endif loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "http", 4) || !strncmp(c, "ftp://", 6)) { rc = kickstartFromUrl(c, loaderData); loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "nfs:", 4)) { rc = kickstartFromNfs(c+4, loaderData); loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "floppy", 6)) { rc = kickstartFromRemovable(c); loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "hd:", 3)) { rc = kickstartFromHD(c); loaderData->ksFile = strdup("/tmp/ks.cfg"); #ifdef STACKI { /* * bring the network up, even if it a hard disk based install */ iface_t iface; iface_init_iface_t(&iface); kickstartNetworkUp(loaderData, &iface); } #endif } else if (!strncmp(c, "bd:", 3)) { rc = kickstartFromBD(c); loaderData->ksFile = strdup("/tmp/ks.cfg"); } else if (!strncmp(c, "cdrom", 5)) { rc = kickstartFromCD(c); loaderData->ksFile = strdup("/tmp/ks.cfg"); #ifdef STACKI { /* * bring the network up, even if it a CD-based install */ iface_t iface; iface_init_iface_t(&iface); kickstartNetworkUp(loaderData, &iface); } #endif } else if (!strncmp(c, "file:", 5)) { loaderData->ksFile = c+5; break; } if (rc != 0) { char *newLocation; if (!strcmp(c, "ks")) newLocation = newKickstartLocation(""); else newLocation = newKickstartLocation(c); if (loaderData->ksFile != NULL) free(loaderData->ksFile); if (newLocation != NULL) { loaderData->ksFile = strdup(newLocation); free(newLocation); return getKickstartFile(loaderData); } else return; } } #ifdef STACKI /* * if we get a kickstart file, try to write the '/tmp/interfaces' file */ writeInterfacesFile(loaderData); #endif flags |= LOADER_FLAGS_KICKSTART; return; }
int getFileFromUrl(char * url, char * dest, struct loaderData_s * loaderData) { int retval = 0; struct iurlinfo ui; enum urlprotocol_t proto = !strncmp(url, "ftp://", 6) ? URL_METHOD_FTP : URL_METHOD_HTTP; char * host = NULL, * file = NULL, * chptr = NULL, *login = NULL, *password = NULL; int fd, rc; iface_t iface; char *ehdrs = NULL, *ip = NULL; long long size; struct progressCBdata *data = NULL; iface_init_iface_t(&iface); if (kickstartNetworkUp(loaderData, &iface)) { logMessage(ERROR, "unable to bring up network"); return 1; } memset(&ui, 0, sizeof(ui)); ui.protocol = proto; getHostPathandLogin((proto == URL_METHOD_FTP ? url + 6 : url + 7), &host, &file, &login, &password, ip); logMessage(INFO, "file location: %s://%s%s", (proto == URL_METHOD_FTP ? "ftp" : "http"), host, file); chptr = strchr(host, '/'); if (chptr == NULL) { ui.address = strdup(host); ui.prefix = strdup("/"); } else { *chptr = '\0'; ui.address = strdup(host); host = chptr; *host = '/'; ui.prefix = strdup(host); } if (password[0] != '\0') ui.password = strdup (password); if (login[0] != '\0') ui.login = strdup (login); if (proto == URL_METHOD_HTTP) { char *arch = getProductArch(); char *name = getProductName(); if (asprintf(&ehdrs, "User-Agent: anaconda/%s\r\n" "X-Anaconda-Architecture: %s\r\n" "X-Anaconda-System-Release: %s\r\n", VERSION, arch, name) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } } if (proto == URL_METHOD_HTTP && FL_KICKSTART_SEND_MAC(flags)) { /* find all ethernet devices and make a header entry for each one */ int i; char *dev, *mac, *tmpstr; struct device **devices; devices = getDevices(DEVICE_NETWORK); for (i = 0; devices && devices[i]; i++) { dev = devices[i]->device; mac = iface_mac2str(dev); if (mac) { if (asprintf(&tmpstr, "X-RHN-Provisioning-MAC-%d: %s %s\r\n", i, dev, mac) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } if (!ehdrs) { ehdrs = strdup(tmpstr); } else { ehdrs = (char *) realloc(ehdrs, strlen(ehdrs)+strlen(tmpstr)+1); strcat(ehdrs, tmpstr); } free(mac); free(tmpstr); } } } fd = urlinstStartTransfer(&ui, file, ehdrs, &data, &size); if (fd < 0) { logMessage(ERROR, "failed to retrieve http://%s/%s%s", ui.address, ui.prefix, file); retval = 1; goto err; } rc = copyFileFd(fd, dest, progressCallback, data, size); if (rc) { unlink (dest); logMessage(ERROR, "failed to copy file to %s", dest); retval = 1; goto err; } urlinstFinishTransfer(&ui, fd, &data); err: if (file) free(file); if (ehdrs) free(ehdrs); if (host) free(host); if (login) free(login); if (password) free(password); return retval; }