char *mountUrlImage(struct installMethod *method, char *location, struct loaderData_s *loaderData) { struct iurlinfo ui; char *url = NULL; enum { URL_STAGE_MAIN, URL_STAGE_FETCH, URL_STAGE_DONE } stage = URL_STAGE_MAIN; memset(&ui, 0, sizeof(ui)); while (stage != URL_STAGE_DONE) { switch(stage) { case URL_STAGE_MAIN: { /* If the stage2= parameter was given (or inferred from repo=) * then use that configuration info to fetch the image. This * could also have come from kickstart. Else, we need to show * the UI. */ if (loaderData->method == METHOD_URL && loaderData->stage2Data) { url = ((struct urlInstallData *) loaderData->stage2Data)->url; logMessage(INFO, "URL_STAGE_MAIN: url is %s", url); if (!url) { logMessage(ERROR, "missing URL specification"); loaderData->method = -1; free(loaderData->stage2Data); loaderData->stage2Data = NULL; if (loaderData->inferredStage2) loaderData->invalidRepoParam = 1; break; } /* explode url into ui struct */ convertURLToUI(url, &ui); /* ks info was adequate, lets skip to fetching image */ stage = URL_STAGE_FETCH; break; } else { char *substr; if (urlMainSetupPanel(&ui)) return NULL; /* If the user-provided URL points at a repo instead of * a stage2 image, fix it up now. */ substr = strstr(ui.prefix, ".img"); if (!substr || (substr && *(substr+4) != '\0')) { loaderData->instRepo = strdup(ui.prefix); if (asprintf(&ui.prefix, "%s/images/install.img", ui.prefix) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } } loaderData->invalidRepoParam = 1; } stage = URL_STAGE_FETCH; break; } case URL_STAGE_FETCH: { if (FL_TESTING(flags)) { stage = URL_STAGE_DONE; break; } if (loadUrlImages(&ui)) { stage = URL_STAGE_MAIN; if (loaderData->method >= 0) loaderData->method = -1; if (loaderData->inferredStage2) loaderData->invalidRepoParam = 1; } else { stage = URL_STAGE_DONE; } break; } case URL_STAGE_DONE: break; } } url = convertUIToURL(&ui); return url; }
char * mountUrlImage(struct installMethod * method, char * location, struct loaderData_s * loaderData, moduleInfoSet modInfo, moduleList modLoaded, moduleDeps * modDeps) { int rc; char * url, *p; struct iurlinfo ui; char needsSecondary = ' '; int dir = 1; char * login; char * finalPrefix; char * cdurl; enum { URL_STAGE_MAIN, URL_STAGE_SECOND, URL_STAGE_FETCH, URL_STAGE_DONE } stage = URL_STAGE_MAIN; enum urlprotocol_t proto = !strcmp(method->name, "FTP") ? URL_METHOD_FTP : URL_METHOD_HTTP; /* JKFIXME: we used to do another ram check here... keep it? */ memset(&ui, 0, sizeof(ui)); while (stage != URL_STAGE_DONE) { switch(stage) { case URL_STAGE_MAIN: if ((loaderData->method == METHOD_FTP || loaderData->method == METHOD_HTTP) && loaderData->methodData) { url = ((struct urlInstallData *)loaderData->methodData)->url; logMessage(INFO, "URL_STAGE_MAIN - url is %s", url); if (!url) { logMessage(ERROR, "missing url specification"); loaderData->method = -1; break; } /* explode url into ui struct */ convertURLToUI(url, &ui); /* ks info was adequate, lets skip to fetching image */ stage = URL_STAGE_FETCH; dir = 1; break; } else if (urlMainSetupPanel(&ui, proto, &needsSecondary)) { return NULL; } /* got required information from user, proceed */ stage = (needsSecondary != ' ') ? URL_STAGE_SECOND : URL_STAGE_FETCH; dir = 1; break; case URL_STAGE_SECOND: rc = urlSecondarySetupPanel(&ui, proto); if (rc) { stage = URL_STAGE_MAIN; dir = -1; } else { stage = URL_STAGE_FETCH; dir = 1; } break; case URL_STAGE_FETCH: if (FL_TESTING(flags)) { stage = URL_STAGE_DONE; dir = 1; break; } #ifdef ROCKS /* * before we start the web server, make sure /tmp/rocks.conf * exists */ if (access("/tmp/rocks.conf", F_OK) != 0) { writeAvalancheInfo(NULL, NULL); } start_httpd(); #endif /* ROCKS */ /* ok messy - see if we have a stage2 on local CD */ /* before trying to pull one over network */ cdurl = findAnacondaCD(location, modInfo, modLoaded, *modDeps, 0); if (cdurl) { logMessage(INFO, "Detected stage 2 image on CD"); winStatus(50, 3, _("Media Detected"), _("Local installation media detected..."), 0); sleep(3); newtPopWindow(); stage = URL_STAGE_DONE; dir = 1; } else { /* need to find stage 2 on remote site */ if (loadUrlImages(&ui)) { stage = URL_STAGE_MAIN; dir = -1; if (loaderData->method >= 0) { loaderData->method = -1; } } else { stage = URL_STAGE_DONE; dir = 1; } } break; case URL_STAGE_DONE: break; } } login = ""; login = getLoginName(login, ui); if (!strcmp(ui.prefix, "/")) finalPrefix = "/."; else finalPrefix = ui.prefix; url = malloc(strlen(finalPrefix) + 25 + strlen(ui.address) + strlen(login)); /* sanitize url so we dont have problems like bug #101265 */ /* basically avoid duplicate /'s */ if (ui.protocol == URL_METHOD_HTTP) { for (p=finalPrefix; *p == '/'; p++); finalPrefix = p; } sprintf(url, "%s://%s%s/%s", ui.protocol == URL_METHOD_FTP ? "ftp" : "http", login, ui.address, finalPrefix); return url; }