summaryrefslogtreecommitdiffstats
path: root/loader2/urls.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader2/urls.c')
-rw-r--r--loader2/urls.c417
1 files changed, 417 insertions, 0 deletions
diff --git a/loader2/urls.c b/loader2/urls.c
new file mode 100644
index 000000000..4f6e6a0fc
--- /dev/null
+++ b/loader2/urls.c
@@ -0,0 +1,417 @@
+/*
+ * urls.c - url handling code
+ *
+ * Erik Troan <ewt@redhat.com>
+ * Matt Wilson <msw@redhat.com>
+ * Michael Fulbright <msf@redhat.com>
+ * Jeremy Katz <katzj@redhat.com>
+ *
+ * Copyright 1997 - 2002 Red Hat, Inc.
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * General Public License.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <arpa/inet.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <netinet/in.h>
+#include <newt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "../isys/dns.h"
+
+#include "ftp.h"
+#include "lang.h"
+#include "loader.h"
+#include "loadermisc.h"
+#include "urls.h"
+#include "log.h"
+#include "windows.h"
+#include "net.h"
+
+
+int urlinstStartTransfer(struct iurlinfo * ui, char * filename,
+ int silentErrors) {
+ char * buf;
+ int fd;
+ char * finalPrefix;
+
+ if (!strcmp(ui->prefix, "/"))
+ finalPrefix = "/.";
+ else
+ finalPrefix = ui->prefix;
+
+ logMessage("transferring %s://%s/%s/%s to a fd",
+ ui->protocol == URL_METHOD_FTP ? "ftp" : "http",
+ ui->address, finalPrefix, filename);
+
+ buf = alloca(strlen(finalPrefix) + strlen(filename) + 20);
+ sprintf(buf, "%s/%s", finalPrefix, filename);
+
+ if (ui->protocol == URL_METHOD_FTP) {
+ ui->ftpPort = ftpOpen(ui->address,
+ ui->login ? ui->login : "anonymous",
+ ui->password ? ui->password : "rhinstall@",
+ NULL, -1);
+ if (ui->ftpPort < 0) {
+ newtWinMessage(_("Error"), _("OK"),
+ _("Failed to log into %s: %s"), ui->address,
+ ftpStrerror(ui->ftpPort));
+ return -2;
+ }
+
+ fd = ftpGetFileDesc(ui->ftpPort, buf);
+ if (fd < 0) {
+ close(ui->ftpPort);
+ if (!silentErrors)
+ newtWinMessage(_("Error"), _("OK"),
+ _("Failed to retrieve %s: %s"), buf, ftpStrerror(fd));
+ return -1;
+ }
+ } else {
+ fd = httpGetFileDesc(ui->address, -1, buf);
+ if (fd < 0) {
+ if (!silentErrors)
+ newtWinMessage(_("Error"), _("OK"),
+ _("Failed to retrieve %s: %s"), buf, ftpStrerror(fd));
+ return -1;
+ }
+ }
+
+ winStatus(70, 3, _("Retrieving"), "%s %s...", _("Retrieving"), filename);
+
+ return fd;
+}
+
+int urlinstFinishTransfer(struct iurlinfo * ui, int fd) {
+ if (ui->protocol == URL_METHOD_FTP)
+ close(ui->ftpPort);
+ close(fd);
+
+ newtPopWindow();
+
+ return 0;
+}
+
+/* JKFIXME: this must go away / be generalized to be like all other platform */
+#if defined (__s390__) || defined (__s390x__)
+int setupRemote(struct iurlinfo * ui) {
+ char *env, *d;
+
+ if (!(env = getenv("RPMSERVER"))) {
+ ui->address = "";
+ ui->prefix = "";
+ return 0;
+ }
+
+ if (!strncmp(env, "ftp://",6))
+ env += 6;
+ else if (!strncmp(env, "http://",7))
+ env += 7;
+
+ if (!(d = index (env, '/'))) {
+ d = "";
+ ui->prefix = strdup(d);
+ }
+ else /* make sure the path either starts with a / or a ~ */
+ if(*d != '/') {
+ ui->prefix = (char *)malloc(strlen(d)+2);
+ *ui->prefix = '/';
+ strcat(ui->prefix, d);
+ }
+ else ui->prefix = strdup(d);
+
+ ui->address = strdup(env);
+ if (ui->address && (d = index (ui->address, '/')))
+ *d = '\0';
+ if (ui->address && (d = index (ui->address, ':')))
+ *d = '\0';
+
+ return 0;
+}
+#endif /* #if defined (__s390__) || defined (__s390x__) */
+
+char * addrToIp(char * hostname) {
+ struct in_addr ad;
+ char * chptr;
+
+ for (chptr = hostname; *chptr; chptr++)
+ if (!(isdigit(*chptr) || *chptr == '.')) break;
+
+ if (!*chptr)
+ return hostname;
+
+ if (mygethostbyname(hostname, &ad))
+ return NULL;
+
+ return inet_ntoa(ad);
+}
+
+int urlMainSetupPanel(struct iurlinfo * ui, urlprotocol protocol,
+ char * doSecondarySetup) {
+ newtComponent form, okay, cancel, siteEntry, dirEntry;
+ newtComponent answer, text;
+ newtComponent cb = NULL;
+ char * site, * dir;
+ char * reflowedText = NULL;
+ int width, height;
+ newtGrid entryGrid, buttons, grid;
+ char * chptr;
+ char * buf;
+
+ if (ui->address) {
+ site = ui->address;
+ dir = ui->prefix;
+ } else {
+ site = "";
+ dir = "";
+ }
+
+ if (ui->login || ui->password || ui->proxy || ui->proxyPort)
+ *doSecondarySetup = '*';
+ else
+ *doSecondarySetup = ' ';
+
+ buttons = newtButtonBar(_("OK"), &okay, _("Back"), &cancel, NULL);
+
+ switch (protocol) {
+ case URL_METHOD_FTP:
+ buf = sdupprintf(_(netServerPrompt), "FTP", PRODUCTNAME);
+ reflowedText = newtReflowText(buf, 47, 5, 5, &width, &height);
+ free(buf);
+ break;
+ case URL_METHOD_HTTP:
+ buf = sdupprintf(_(netServerPrompt), "Web", PRODUCTNAME);
+ reflowedText = newtReflowText(buf, 47, 5, 5, &width, &height);
+ free(buf);
+ break;
+ }
+ text = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP);
+ newtTextboxSetText(text, reflowedText);
+ free(reflowedText);
+
+ siteEntry = newtEntry(22, 8, site, 24, &site, NEWT_ENTRY_SCROLL);
+ dirEntry = newtEntry(22, 9, dir, 24, &dir, NEWT_ENTRY_SCROLL);
+
+ entryGrid = newtCreateGrid(2, 2);
+ newtGridSetField(entryGrid, 0, 0, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, (protocol == URL_METHOD_FTP) ?
+ _("FTP site name:") :
+ _("Web site name:")),
+ 0, 0, 1, 0, NEWT_ANCHOR_LEFT, 0);
+ newtGridSetField(entryGrid, 0, 1, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, _("Red Hat directory:")),
+ 0, 0, 1, 0, NEWT_ANCHOR_LEFT, 0);
+ newtGridSetField(entryGrid, 1, 0, NEWT_GRID_COMPONENT, siteEntry,
+ 0, 0, 0, 0, 0, 0);
+ newtGridSetField(entryGrid, 1, 1, NEWT_GRID_COMPONENT, dirEntry,
+ 0, 0, 0, 0, 0, 0);
+
+ grid = newtCreateGrid(1, 4);
+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text,
+ 0, 0, 0, 1, 0, 0);
+ newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, entryGrid,
+ 0, 0, 0, 1, 0, 0);
+
+ if (protocol == URL_METHOD_FTP) {
+ cb = newtCheckbox(3, 11, _("Use non-anonymous ftp"),
+ *doSecondarySetup, NULL, doSecondarySetup);
+ newtGridSetField(grid, 0, 2, NEWT_GRID_COMPONENT, cb,
+ 0, 0, 0, 1, NEWT_ANCHOR_LEFT, 0);
+ }
+
+ newtGridSetField(grid, 0, 3, NEWT_GRID_SUBGRID, buttons,
+ 0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX);
+
+ newtGridWrappedWindow(grid, (protocol == URL_METHOD_FTP) ? _("FTP Setup") :
+ _("HTTP Setup"));
+
+ form = newtForm(NULL, NULL, 0);
+ newtGridAddComponentsToForm(grid, form, 1);
+
+ do {
+ answer = newtRunForm(form);
+ if (answer != cancel) {
+ if (!strlen(site)) {
+ newtWinMessage(_("Error"), _("OK"),
+ _("You must enter a server name."));
+ continue;
+ }
+ if (!strlen(dir)) {
+ newtWinMessage(_("Error"), _("OK"),
+ _("You must enter a directory."));
+ continue;
+ }
+
+ if (!addrToIp(site)) {
+ newtWinMessage(_("Unknown Host"), _("OK"),
+ _("%s is not a valid hostname."), site);
+ continue;
+ }
+ }
+
+ break;
+ } while (1);
+
+ if (answer == cancel) {
+ newtFormDestroy(form);
+ newtPopWindow();
+
+ return LOADER_BACK;
+ }
+
+ if (ui->address) free(ui->address);
+ ui->address = strdup(site);
+
+ if (ui->prefix) free(ui->prefix);
+
+ /* add a slash at the start of the dir if it is missing */
+ if (*dir != '/') {
+ char *buf = malloc(strlen(dir) + 2);
+ buf[0] = '/';
+ buf[1] = '\0';
+ strcat (buf, dir);
+ ui->prefix = buf;
+ } else
+ ui->prefix = strdup(dir);
+
+ /* Get rid of trailing /'s */
+ chptr = ui->prefix + strlen(ui->prefix) - 1;
+ while (chptr > ui->prefix && *chptr == '/') chptr--;
+ chptr++;
+ *chptr = '\0';
+
+ if (*doSecondarySetup != '*') {
+ if (ui->login)
+ free(ui->login);
+ if (ui->password)
+ free(ui->password);
+ if (ui->proxy)
+ free(ui->proxy);
+ if (ui->proxyPort)
+ free(ui->proxyPort);
+ ui->login = ui->password = ui->proxy = ui->proxyPort = NULL;
+ /*
+ delMacro(NULL, "_httpproxy");
+ delMacro(NULL, "_ftpproxy");
+ delMacro(NULL, "_httpproxyport");
+ delMacro(NULL, "_ftpproxyport");
+ */
+ }
+
+ ui->protocol = protocol;
+
+ newtFormDestroy(form);
+ newtPopWindow();
+
+ return 0;
+
+}
+int urlSecondarySetupPanel(struct iurlinfo * ui, urlprotocol protocol) {
+ newtComponent form, okay, cancel, answer, text, accountEntry = NULL;
+ newtComponent passwordEntry = NULL, proxyEntry = NULL;
+ newtComponent proxyPortEntry = NULL;
+ char * account, * password, * proxy, * proxyPort;
+ newtGrid buttons, entryGrid, grid;
+ char * reflowedText = NULL;
+ int width, height;
+
+ if (protocol == URL_METHOD_FTP) {
+ reflowedText = newtReflowText(
+ _("If you are using non anonymous ftp, enter the account name and "
+ "password you wish to use below."),
+ 47, 5, 5, &width, &height);
+ } else {
+ reflowedText = newtReflowText(
+ _("If you are using a HTTP proxy server "
+ "enter the name of the HTTP proxy server to use."),
+ 47, 5, 5, &width, &height);
+ }
+ text = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP);
+ newtTextboxSetText(text, reflowedText);
+ free(reflowedText);
+
+ if (protocol == URL_METHOD_FTP) {
+ accountEntry = newtEntry(-1, -1, NULL, 24, &account,
+ NEWT_FLAG_SCROLL);
+ passwordEntry = newtEntry(-1, -1, NULL, 24, &password,
+ NEWT_FLAG_SCROLL | NEWT_FLAG_PASSWORD);
+ }
+ proxyEntry = newtEntry(-1, -1, ui->proxy, 24, &proxy, NEWT_ENTRY_SCROLL);
+ proxyPortEntry = newtEntry(-1, -1, ui->proxyPort, 6, &proxyPort,
+ NEWT_FLAG_SCROLL);
+
+ entryGrid = newtCreateGrid(2, 4);
+ if (protocol == URL_METHOD_FTP) {
+ newtGridSetField(entryGrid, 0, 0, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, _("Account name:")),
+ 0, 0, 2, 0, NEWT_ANCHOR_LEFT, 0);
+ newtGridSetField(entryGrid, 0, 1, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, _("Password:")),
+ 0, 0, 2, 0, NEWT_ANCHOR_LEFT, 0);
+ }
+ if (protocol == URL_METHOD_FTP) {
+ newtGridSetField(entryGrid, 1, 0, NEWT_GRID_COMPONENT, accountEntry,
+ 0, 0, 0, 0, 0, 0);
+ newtGridSetField(entryGrid, 1, 1, NEWT_GRID_COMPONENT, passwordEntry,
+ 0, 0, 0, 0, 0, 0);
+ }
+
+ buttons = newtButtonBar(_("OK"), &okay, _("Back"), &cancel, NULL);
+
+ grid = newtCreateGrid(1, 3);
+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text, 0, 0, 0, 0, 0, 0);
+ newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, entryGrid,
+ 0, 1, 0, 0, 0, 0);
+ newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons,
+ 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);
+
+
+
+ if (protocol == URL_METHOD_FTP) {
+ newtGridWrappedWindow(grid, "Further FTP Setup");
+ } else {
+ if (protocol == URL_METHOD_HTTP)
+ newtGridWrappedWindow(grid, "Further HTTP Setup");
+ }
+
+ form = newtForm(NULL, NULL, 0);
+ newtGridAddComponentsToForm(grid, form, 1);
+ newtGridFree(grid, 1);
+
+ answer = newtRunForm(form);
+ if (answer == cancel) {
+ newtFormDestroy(form);
+ newtPopWindow();
+
+ return LOADER_BACK;
+ }
+
+ if (protocol == URL_METHOD_FTP) {
+ if (ui->login) free(ui->login);
+ if (strlen(account))
+ ui->login = strdup(account);
+ else
+ ui->login = NULL;
+
+ if (ui->password) free(ui->password);
+ if (strlen(password))
+ ui->password = strdup(password);
+ else
+ ui->password = NULL;
+ }
+
+ newtFormDestroy(form);
+ newtPopWindow();
+
+ return 0;
+}