int urlinstFinishTransfer(struct iurlinfo * ui, int fd) { if (ui->protocol == URL_METHOD_FTP) close(ui->ftpPort); close(fd); if (!FL_CMDLINE(flags)) newtPopWindow(); return 0; }
int chooseLanguage(char ** lang) { int choice = 0; char ** langs; int i; int current = -1; char * currentLangName = getenv("LANG"); int numLangs = 0; char * langPicked; if (!languages) loadLanguageList(); langs = alloca(sizeof(*langs) * (numLanguages + 1)); for (i = 0; i < numLanguages; i++) { if (!strncmp(languages[i].key, "en", 2)) english = numLangs; if (currentLangName && !strcmp(languages[i].lang, currentLangName)) current = numLangs; langs[numLangs++] = languages[i].lang; } langs[numLangs] = NULL; if (current >= 0) choice = current; else choice = english; if (!FL_CMDLINE(flags)) newtWinMenu(_("Choose a Language"), _("What language would you like to use during the " "installation process?"), 40, 5, 5, 8, langs, &choice, _("OK"), NULL); langPicked = langs[choice]; for (i = 0; i < numLanguages; i++) { if (!strcmp(langPicked, languages[i].lang)) { *lang = languages[i].lc_all; choice = i; break; } } /* this can't happen */ if (i == numLanguages) abort(); return setupLanguage(choice, 0); }
/* set to NULL if not needed */ int urlinstStartTransfer(struct iurlinfo * ui, char * filename, char *extraHeaders) { char * buf; int fd, port; int family = -1; char * finalPrefix; struct in_addr addr; struct in6_addr addr6; char *hostname, *portstr; if (!strcmp(ui->prefix, "/")) finalPrefix = ""; else finalPrefix = ui->prefix; buf = alloca(strlen(finalPrefix) + strlen(filename) + 20); if (*filename == '/') sprintf(buf, "%s%s", finalPrefix, filename); else sprintf(buf, "%s/%s", finalPrefix, filename); logMessage(INFO, "transferring %s://%s/%s to a fd", ui->protocol == URL_METHOD_FTP ? "ftp" : "http", ui->address, buf); splitHostname(ui->address, &hostname, &portstr); if (portstr == NULL) port = -1; else port = atoi(portstr); if (inet_pton(AF_INET, hostname, &addr) >= 1) family = AF_INET; else if (inet_pton(AF_INET6, hostname, &addr6) >= 1) family = AF_INET6; else { if (mygethostbyname(hostname, &addr, AF_INET) == 0) { family = AF_INET; } else if (mygethostbyname(hostname, &addr6, AF_INET6) == 0) { family = AF_INET6; } else { logMessage(ERROR, "cannot determine address family of %s", hostname); } } if (ui->protocol == URL_METHOD_FTP) { ui->ftpPort = ftpOpen(hostname, family, ui->login ? ui->login : "******", ui->password ? ui->password : "******", NULL, port); if (ui->ftpPort < 0) return -2; fd = ftpGetFileDesc(ui->ftpPort, addr6, family, buf); if (fd < 0) { close(ui->ftpPort); return -1; } } else { #ifdef ROCKS { /* * try harder to start HTTP transfer */ int tries = 1; int rc; logMessage(INFO, "ROCKS:urlinstStartTransfer:http://%s/%s\n" "Headers:%s\n", ui->address, filename, extraHeaders); fd = -1; while ((fd < 0) && (tries < 10)) { fd = httpGetFileDesc(ui->address, -1, buf, extraHeaders); if (fd == FTPERR_FAILED_DATA_CONNECT) { /* Server busy, backoff */ sleep(60); tries = 1; continue; } logMessage(INFO, "ROCKS:urlinstStartTransfer:attempt (%d)", tries); sleep(1); ++tries; } if (fd < 0) { logMessage(ERROR, "ROCKS:urlinstStartTransfer:Failed"); rc = newtWinChoice(_("GET File Error"), _("Retry"), _("Cancel"), _("Could not get file:\n\nhttp://%s/%s\n\n%s"), ui->address, filename, ftpStrerror(fd, URL_METHOD_HTTP)); if (rc == 1) return urlinstStartTransfer(ui, filename, extraHeaders); else return -1; } } #else fd = httpGetFileDesc(hostname, port, buf, extraHeaders); if (fd < 0) return -1; #endif /* ROCKS */ } if (!FL_CMDLINE(flags)) winStatus(70, 3, _("Retrieving"), "%s %s...", _("Retrieving"), filename); return fd; }
/* Use SSL. Must be entirely different since the return * type is a pointer to an SSL structure. */ BIO * urlinstStartSSLTransfer(struct iurlinfo * ui, char * filename, char *extraHeaders, int silentErrors, int flags, char *nextServer) { extern void watchdog_reset(); int tries = 1; int rc; int errorcode = -1; int sleepmin = KS_RETRY_MIN; char *returnedHeaders; BIO *sbio = 0; logMessage(INFO, "ROCKS:transferring https://%s/%s\nHeaders:%s\n", ui->address, filename, extraHeaders); /* Add 'public' path element if we dont have a cert. */ if (!haveCertificate()) addPublic(&filename); while ((errorcode < 0) && (tries < 10)) { sbio = httpsGetFileDesc(ui->address, -1, filename, extraHeaders, &errorcode, &returnedHeaders); if (errorcode == 0) { char *ptr; char trackers[256]; char pkgservers[256]; if ((ptr = strstr(returnedHeaders, "X-Avalanche-Trackers:")) != NULL) { sscanf(ptr, "X-Avalanche-Trackers: %256s", trackers); } else { if (nextServer != NULL) { snprintf(trackers, sizeof(trackers) - 1, "%s", nextServer); } else { strcpy(trackers, "127.0.0.1"); } } if ((ptr = strstr(returnedHeaders, "X-Avalanche-Pkg-Servers:")) != NULL) { sscanf(ptr, "X-Avalanche-Pkg-Servers: %256s", pkgservers); } else { if (nextServer != NULL) { snprintf(pkgservers, sizeof(pkgservers) - 1, "%s", nextServer); } else { strcpy(pkgservers, "127.0.0.1"); } } writeAvalancheInfo(trackers, pkgservers); } else if (errorcode == FTPERR_FAILED_DATA_CONNECT) { /* * read the retry value from the return message */ char *ptr; int sleeptime = 0; if ((ptr = strstr(returnedHeaders, "Retry-After:")) != NULL) { sscanf(ptr, "Retry-After: %d", &sleeptime); } if (sleeptime <= 0) { /* * Backoff a random interval between * KS_RETRY_MIN and KS_RETRY_MAX */ sleeptime = sleepmin + ((KS_RETRY_MAX - sleepmin) * (rand()/(float)RAND_MAX)); } winStatus(55, 3, _("Server Busy"), _("I will retry " "for a ks file after a %d sec sleep..."), sleeptime, 0); /* * this must be in a loop, as the alarm associated * with the watchdog timer is sending a signal which * interrupts the sleep(). */ while ((sleeptime = sleep(sleeptime)) != 0) { ; } newtPopWindow(); tries = 1; /* Don't let the watchdog fire if the kickstart server is reporting busy */ watchdog_reset(); continue; } else if (errorcode == FTPERR_REFUSED) { /* * always accept the parent credentials */ forceParentAuth(); continue; } logMessage(INFO, "ROCKS:urlinstStartSSLTransfer:attempt (%d)", tries); sleep(1); ++tries; } if (errorcode < 0) { logMessage(ERROR, "ROCKS:urlinstStartSSLTransfer:Failed"); rc = 0; /* Go through the public door automatically, but only * if we have not tried it already. */ if (errorcode == FTPERR_SERVER_SECURITY && !addPublic(&filename)) { rc = 1; } else { rc = newtWinChoice(_("GET File Error"), _("Retry"), _("Cancel"), _("Could not get file:\n\nhttps://%s/%s\n\n%s"), ui->address, filename, ftpStrerror(errorcode, URL_METHOD_HTTP)); } if (rc==1) /* Retry */ return urlinstStartSSLTransfer(ui, filename, extraHeaders, silentErrors, flags, nextServer); else /* Cancel */ return NULL; } if (!FL_CMDLINE(flags)) winStatus(70, 3, _("Retrieving"), "%s %.*s...", _("Retrieving"), 60, filename); return sbio; }
/* this copies the contents of the driver disk to a ramdisk and loads * the moduleinfo, etc. assumes a "valid" driver disk mounted at mntpt */ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) { moduleDeps *modDepsPtr = loaderData->modDepsPtr; moduleInfoSet modInfo = loaderData->modInfo; char file[200], dest[200]; char * title; struct moduleBallLocation * location; struct stat sb; static int disknum = 0; int version = 1; int fd, ret; /* check for both versions */ sprintf(file, "%s/rhdd", mntpt); if (access(file, R_OK)) { version = 0; sprintf(file, "%s/rhdd-6.1", mntpt); if (access(file, R_OK)) { /* this can't happen, we already verified it! */ return LOADER_BACK; } } stat(file, &sb); title = malloc(sb.st_size + 1); fd = open(file, O_RDONLY); ret = read(fd, title, sb.st_size); if (title[sb.st_size - 1] == '\n') sb.st_size--; title[sb.st_size] = '\0'; close(fd); sprintf(file, "/tmp/ramfs/DD-%d", disknum); mkdirChain(file); if (!FL_CMDLINE(flags)) { startNewt(); winStatus(40, 3, _("Loading"), _("Reading driver disk...")); } sprintf(dest, "/tmp/ramfs/DD-%d", disknum); copyDirectory(mntpt, dest); location = malloc(sizeof(struct moduleBallLocation)); location->title = strdup(title); location->path = sdupprintf("/tmp/ramfs/DD-%d/modules.cgz", disknum); location->version = version; char *fwdir = sdupprintf("/tmp/ramfs/DD-%d/firmware", disknum); if (!access(fwdir, R_OK|X_OK)) { add_fw_search_dir(loaderData, fwdir); stop_fw_loader(loaderData); start_fw_loader(loaderData); } free(fwdir); sprintf(file, "%s/modinfo", mntpt); readModuleInfo(file, modInfo, location, 1); sprintf(file, "%s/modules.dep", mntpt); mlLoadDeps(modDepsPtr, file); sprintf(file, "%s/modules.alias", mntpt); pciReadDrivers(file); if (!FL_CMDLINE(flags)) newtPopWindow(); disknum++; return 0; }