summaryrefslogtreecommitdiffstats
path: root/loader/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader/net.c')
-rw-r--r--loader/net.c240
1 files changed, 240 insertions, 0 deletions
diff --git a/loader/net.c b/loader/net.c
new file mode 100644
index 000000000..c2cd6bc1f
--- /dev/null
+++ b/loader/net.c
@@ -0,0 +1,240 @@
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <newt.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "pump/pump.h"
+
+#include "lang.h"
+#include "loader.h"
+#include "log.h"
+#include "net.h"
+
+struct intfconfig_s {
+ newtComponent ipEntry, nmEntry, gwEntry, nsEntry;
+ char * ip, * nm, * gw, * ns;
+};
+
+typedef int int32;
+
+static void ipCallback(newtComponent co, void * dptr) {
+ struct intfconfig_s * data = dptr;
+ struct in_addr ipaddr, nmaddr, addr;
+ char * ascii;
+ int broadcast, network;
+
+ if (co == data->ipEntry) {
+ if (strlen(data->ip) && !strlen(data->nm)) {
+ if (inet_aton(data->ip, &ipaddr)) {
+ ipaddr.s_addr = ntohl(ipaddr.s_addr);
+ if (((ipaddr.s_addr & 0xFF000000) >> 24) <= 127)
+ ascii = "255.0.0.0";
+ else if (((ipaddr.s_addr & 0xFF000000) >> 24) <= 191)
+ ascii = "255.255.0.0";
+ else
+ ascii = "255.255.255.0";
+ newtEntrySet(data->nmEntry, ascii, 1);
+ }
+ }
+ } else if (co == data->nmEntry) {
+ if (!strlen(data->ip) || !strlen(data->nm)) return;
+ if (!inet_aton(data->ip, &ipaddr)) return;
+ if (!inet_aton(data->nm, &nmaddr)) return;
+
+ network = ipaddr.s_addr & nmaddr.s_addr;
+ broadcast = (ipaddr.s_addr & nmaddr.s_addr) | (~nmaddr.s_addr);
+
+ if (!strlen(data->gw)) {
+ addr.s_addr = htonl(ntohl(broadcast) - 1);
+ newtEntrySet(data->gwEntry, inet_ntoa(addr), 1);
+ }
+
+ if (!strlen(data->ns)) {
+ addr.s_addr = htonl(ntohl(network) + 1);
+ newtEntrySet(data->nsEntry, inet_ntoa(addr), 1);
+ }
+ }
+}
+
+int nfsGetSetup(char ** hostptr, char ** dirptr) {
+ struct newtWinEntry entries[3];
+ char * newServer = *hostptr ? strdup(*hostptr) : NULL;
+ char * newDir = *dirptr ? strdup(*dirptr) : NULL;
+ int rc;
+
+ entries[0].text = _("NFS server name:");
+ entries[0].value = &newServer;
+ entries[0].flags = NEWT_FLAG_SCROLL;
+ entries[1].text = _("Red Hat directory:");
+ entries[1].value = &newDir;
+ entries[1].flags = NEWT_FLAG_SCROLL;
+ entries[2].text = NULL;
+ entries[2].value = NULL;
+
+ rc = newtWinEntries(_("NFS Setup"),
+ _("Please enter the following information:\n"
+ "\n"
+ " o the name or IP number of your NFS server\n"
+ " o the directory on that server containing\n"
+ " Red Hat Linux for your architecture"), 60, 5, 15,
+ 24, entries, _("Ok"), _("Back"), NULL);
+
+ if (rc == 2) {
+ if (newServer) free(newServer);
+ if (newDir) free(newDir);
+ return LOADER_BACK;
+ }
+
+ if (*hostptr) free(*hostptr);
+ if (*dirptr) free(*dirptr);
+ *hostptr = newServer;
+ *dirptr = newDir;
+
+ return 0;
+}
+
+static void dhcpBoxCallback(newtComponent co, void * ptr) {
+ struct intfconfig_s * c = ptr;
+
+ newtEntrySetFlags(c->ipEntry, NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);
+ newtEntrySetFlags(c->gwEntry, NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);
+ newtEntrySetFlags(c->nmEntry, NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);
+ newtEntrySetFlags(c->nsEntry, NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);
+}
+
+int readNetConfig(char * device, struct pumpNetIntf * dev, int flags) {
+ newtComponent text, f, okay, back, answer, dhcpCheckbox;
+ newtGrid grid, subgrid, buttons;
+ struct intfconfig_s c;
+ int i;
+ struct in_addr addr;
+ char dhcpChoice;
+ char * chptr;
+
+ text = newtTextboxReflowed(-1, -1,
+ _("Please enter the IP configuration for this machine. Each "
+ "item should be entered as an IP address in dotted-decimal "
+ "notation (for example, 1.2.3.4)."), 50, 5, 10, 0);
+
+ subgrid = newtCreateGrid(2, 4);
+ newtGridSetField(subgrid, 0, 0, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, _("IP address:")),
+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);
+ newtGridSetField(subgrid, 0, 1, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, _("Netmask:")),
+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);
+ newtGridSetField(subgrid, 0, 2, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, _("Default gateway (IP):")),
+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);
+ newtGridSetField(subgrid, 0, 3, NEWT_GRID_COMPONENT,
+ newtLabel(-1, -1, _("Primary nameserver:")),
+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);
+
+ c.ipEntry = newtEntry(-1, -1, NULL, 16, &c.ip, 0);
+ c.nmEntry = newtEntry(-1, -1, NULL, 16, &c.nm, 0);
+ c.gwEntry = newtEntry(-1, -1, NULL, 16, &c.gw, 0);
+ c.nsEntry = newtEntry(-1, -1, NULL, 16, &c.ns, 0);
+
+ dhcpCheckbox = newtCheckbox(-1, -1,
+ _("Use dynamic IP configuration (BOOTP/DHCP)"),
+ ' ', NULL, &dhcpChoice);
+ newtComponentAddCallback(dhcpCheckbox, dhcpBoxCallback, &c);
+
+ newtGridSetField(subgrid, 1, 0, NEWT_GRID_COMPONENT, c.ipEntry,
+ 1, 0, 0, 0, 0, 0);
+ newtGridSetField(subgrid, 1, 1, NEWT_GRID_COMPONENT, c.nmEntry,
+ 1, 0, 0, 0, 0, 0);
+ newtGridSetField(subgrid, 1, 2, NEWT_GRID_COMPONENT, c.gwEntry,
+ 1, 0, 0, 0, 0, 0);
+ newtGridSetField(subgrid, 1, 3, NEWT_GRID_COMPONENT, c.nsEntry,
+ 1, 0, 0, 0, 0, 0);
+
+ buttons = newtButtonBar(_("Ok"), &okay, _("Back"), &back, NULL);
+
+ grid = newtCreateGrid(1, 4);
+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text,
+ 0, 0, 0, 1, 0, 0);
+ newtGridSetField(grid, 0, 1, NEWT_GRID_COMPONENT, dhcpCheckbox,
+ 0, 0, 0, 1, 0, 0);
+ newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, subgrid,
+ 0, 0, 0, 1, 0, 0);
+ newtGridSetField(grid, 0, 3, NEWT_GRID_SUBGRID, buttons,
+ 0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX);
+
+ f = newtForm(NULL, NULL, 0);
+ newtGridAddComponentsToForm(grid, f, 1);
+ newtGridWrappedWindow(grid, _("Configure TCP/IP"));
+ newtGridFree(grid, 1);
+
+ newtComponentAddCallback(c.ipEntry, ipCallback, &c);
+ newtComponentAddCallback(c.nmEntry, ipCallback, &c);
+
+ do {
+ answer = newtRunForm(f);
+
+ if (answer == back) {
+ newtFormDestroy(f);
+ newtPopWindow();
+
+ return LOADER_BACK;
+ }
+
+ if (dhcpChoice == ' ') {
+ i = 0;
+ if (*c.ip && inet_aton(c.ip, &addr)) {
+ i++;
+ dev->ip = addr;
+ dev->set |= PUMP_INTFINFO_HAS_IP;
+ }
+
+ if (*c.nm && inet_aton(c.nm, &addr)) {
+ i++;
+ dev->netmask = addr;
+ dev->set |= PUMP_INTFINFO_HAS_NETMASK;
+ }
+
+ if (i != 2) {
+ newtWinMessage(_("Missing Information"), _("Retry"),
+ _("You must enter both a valid IP address and a "
+ "netmask."));
+ }
+ } else {
+ if (FL_TESTING(flags))
+ i = 2;
+ else {
+ chptr = pumpDhcpRun(device, 0, 0, NULL, dev, NULL);
+ logMessage("pump told us: %s", chptr);
+ if (!chptr) i = 2; else i = 0;
+ }
+ }
+ } while (i != 2);
+
+ if (!(dev->set & PUMP_INTFINFO_HAS_BROADCAST)) {
+ *((int32 *) &dev->broadcast) = (*((int32 *) &dev->ip) &
+ *((int32 *) &dev->netmask)) |
+ ~(*((int32 *) &dev->netmask));
+ dev->set |= PUMP_INTFINFO_HAS_BROADCAST;
+ }
+
+ if (!(dev->set & PUMP_INTFINFO_HAS_NETWORK)) {
+ *((int32 *) &dev->network) =
+ *((int32 *) &dev->ip) &
+ *((int32 *) &dev->netmask);
+ dev->set |= PUMP_INTFINFO_HAS_NETWORK;
+ }
+
+ if (!(dev->set & PUMP_NETINFO_HAS_GATEWAY)) {
+ if (*c.gw && inet_aton(c.gw, &addr)) {
+ dev->gateway = addr;
+ dev->set = PUMP_NETINFO_HAS_GATEWAY;
+ }
+ }
+
+ strcpy(dev->device, device);
+
+ newtPopWindow();
+
+ return 0;
+}
+