summaryrefslogtreecommitdiffstats
path: root/release/sysinstall/tcpip.c
diff options
context:
space:
mode:
Diffstat (limited to 'release/sysinstall/tcpip.c')
-rw-r--r--release/sysinstall/tcpip.c326
1 files changed, 326 insertions, 0 deletions
diff --git a/release/sysinstall/tcpip.c b/release/sysinstall/tcpip.c
new file mode 100644
index 0000000..0c8ab34
--- /dev/null
+++ b/release/sysinstall/tcpip.c
@@ -0,0 +1,326 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 1995
+ * Gary J Palmer. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer,
+ * verbatim and that no modifications are made prior to this
+ * point in the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Gary J Palmer
+ * for the FreeBSD Project.
+ * 4. The name of Gary J Palmer or the FreeBSD Project may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GARY J PALMER ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL GARY J PALMER BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <string.h>
+#include <dialog.h>
+#include "ui_objects.h"
+#include "dir.h"
+#include "dialog.priv.h"
+#include "colors.h"
+#include "rc.h"
+
+static char hostname[256], domainname[256],
+ ipaddr[32], netmask[32], gateway[32],
+ dns[32], extras[256];
+static int okbutton, cancelbutton;
+
+#define TCP_DIALOG_Y 0
+#define TCP_DIALOG_X 8
+#define TCP_DIALOG_WIDTH COLS - 16
+#define TCP_DIALOG_HEIGHT LINES - 2
+
+/* The names of the available interfaces, for the list */
+char *iface_names[MAX_INTERFACE];
+
+typedef struct _interface {
+ char *name;
+ Device *dev;
+} Interface;
+
+typedef struct _layout {
+ int y;
+ int x;
+ int len;
+ int maxlen;
+ char *prompt;
+ char *help;
+ void *var;
+ int type;
+ void *obj;
+} Layout;
+
+static Layout layout[] = {
+{ 2, 2, 25, 255,
+ "Host name:", "The name of your machine on a network, e.g. foo.bar.com",
+ hostname, STRINGOBJ, NULL },
+{ 2, 35, 20, 255,
+ "Domain name:",
+ "The name of the domain that your machine is in, e.g. bar.com",
+ domainname, STRINGOBJ, NULL },
+{ 5, 2, 18, 15,
+ "Gateway:",
+ "IP address of host forwarding packets to non-local hosts or nets",
+ gateway, STRINGOBJ, NULL },
+{ 5, 35, 18, 15,
+ "Name server:", "IP address of your local DNS server",
+ dns, STRINGOBJ, NULL },
+{ 8, 2, 10, 6,
+ "Interface:", "One of potentially several network interfaces",
+ ifaces, LISTOBJ, NULL },
+{ 14, 2, 18, 15,
+ "IP Address:",
+ "The IP address to be used for your host - use 127.0.0.1 for loopback",
+ ipaddr, STRINGOBJ, NULL },
+{ 14, 35, 18, 15,
+ "Netmask:",
+ "The netmask for your network, e.g. 0xffffff00 for a class C network",
+ netmask, STRINGOBJ, NULL },
+{ 16, 2, 50, 255,
+ "Extra options:",
+ "Any options to ifconfig you'd like to specify manually",
+ extras, STRINGOBJ, NULL },
+{ 18, 2, 0, 0,
+ "OK", "Select this if you are happy with these settings",
+ &okbutton, BUTTONOBJ, NULL },
+{ 18, 15, 0, 0,
+ "CANCEL", "Select this if you wish to cancel this screen",
+ &cancelbutton, BUTTONOBJ, NULL },
+{ NULL },
+};
+
+#define _validByte(b) ((b) > 0 && (b) < 255)
+
+static void
+feepout(char *msg)
+{
+ beep();
+ msgConfirm(msg);
+ dialog_clear();
+ refresh();
+}
+
+static int
+verifyIP(char *ip)
+{
+ int a, b, c, d;
+
+ if (ip && sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d) == 4 &&
+ _validByte(a) && _validByte(b) && _validByte(c) &&
+ _validByte(d))
+ return 1;
+ else
+ return 0;
+}
+
+static int
+verifySettings(void)
+{
+ if (!hostname[0])
+ feepout("Must specify a host name of some sort!");
+ else if (!verifyIP(ipaddr))
+ feepout("Invalid or missing value for IP address");
+ else if (gateway[0] && !verifyIP(gateway))
+ feepout("Invalid gateway IP address specified");
+ else if (dns[0] && !verifyIP(dns))
+ feepout("Invalid name server IP address specified");
+ else if (netmask[0] < '0' || netmask[0] > '9')
+ feepout("Invalid or missing netmask");
+ else
+ return 1;
+ return 0;
+}
+
+/* Call this to initialize the TCP dialog */
+void
+/* This is it - how to get TCP setup values */
+void
+tcpOpenDialog(void)
+{
+ WINDOW *ds_win;
+ ComposeObj *obj = NULL;
+ ComposeObj *first, *last;
+ int n=0, quit=FALSE, cancel=FALSE, ret,
+ max;
+ char *tmp;
+
+ ds_win = newwin(LINES, COLS, 0, 0);
+ if (ds_win == 0) {
+ msgFatal("Cannot open TCP/IP dialog window!!");
+ exit(1);
+ }
+ draw_box(ds_win, TCP_DIALOG_Y, TCP_DIALOG_X,
+ TCP_DIALOG_HEIGHT, TCP_DIALOG_WIDTH,
+ dialog_attr, border_attr);
+ wattrset(ds_win, dialog_attr);
+ mvwaddstr(ds_win, TCP_DIALOG_Y, TCP_DIALOG_X + 20,
+ " Network Configuration ");
+
+ bzero(ipaddr, sizeof(ipaddr));
+ bzero(netmask, sizeof(netmask));
+ bzero(extras, sizeof(extras));
+
+ tmp = getenv(VAR_HOSTNAME);
+ if (tmp)
+ strcpy(hostname, tmp);
+ else
+ bzero(hostname, sizeof(hostname));
+ tmp = getenv(VAR_DOMAINNAME);
+ if (tmp)
+ strcpy(domainname, tmp);
+ else
+ bzero(domainname, sizeof(domainname));
+ tmp = getenv(VAR_GATEWAY);
+ if (tmp)
+ strcpy(gateway, tmp);
+ else
+ bzero(gateway, sizeof(gateway));
+ tmp = getenv(VAR_NAMESERVER);
+ if (tmp)
+ strcpy(dns, tmp);
+ else
+ bzero(dns, sizeof(dns));
+
+#define lt layout[n]
+ while (lt.help != NULL) {
+ switch (lt.type) {
+ case STRINGOBJ:
+ lt.obj = NewStringObj(ds_win, lt.prompt, lt.var,
+ lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X,
+ lt.len, lt.maxlen);
+ break;
+
+ case BUTTONOBJ:
+ lt.obj = NewButtonObj(ds_win, lt.prompt, lt.var,
+ lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X);
+ break;
+
+ case LISTOBJ:
+ lt.obj = NewListObj(ds_win, lt.prompt, lt.var, "lo0",
+ lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X,
+ 4, 12, 1);
+ default:
+ printf("Don't support this object yet!\n");
+ end_dialog();
+ exit(1);
+ }
+ AddObj(&obj, lt.type, (void *) lt.obj);
+ n++;
+ }
+ max = n-1;
+
+ last = obj;
+ while (last->next)
+ last = last->next;
+
+ /* find the first object in the list */
+ first = obj;
+ while (first->prev)
+ first = first->prev;
+
+ n = 0;
+ while (quit != TRUE) {
+ char help_line[80];
+ int i, len = strlen(lt.help);
+
+ for (i = 0; i < 79; i++)
+ help_line[i] = (i < len) ? lt.help[i] : ' ';
+ help_line[i] = '\0';
+ use_helpline(help_line);
+ display_helpline(ds_win, LINES - 1, COLS - 1);
+
+ ret = PollObj(&obj);
+
+ switch (ret) {
+ case SEL_ESC:
+ quit=TRUE;
+ cancel=TRUE;
+ break;
+
+ case KEY_UP:
+ if (obj->prev !=NULL ) {
+ obj = obj->prev;
+ --n;
+ }
+ else {
+ obj = last;
+ n = max;
+ }
+ break;
+
+ case KEY_DOWN:
+ if (obj->next != NULL) {
+ obj = obj->next;
+ ++n;
+ }
+ else {
+ obj = first;
+ n=0;
+ }
+ break;
+
+ case SEL_BUTTON:
+ if (verifySettings())
+ quit=TRUE;
+ break;
+
+ case SEL_CR:
+ case SEL_TAB:
+ if (n < max)
+ ++n;
+ else
+ n = 0;
+ break;
+
+ case SEL_BACKTAB:
+ if (n)
+ --n;
+ else
+ n = max;
+ break;
+
+ default:
+ beep();
+ }
+
+ if (n == 1) {
+ if ((tmp = index(hostname, '.')) != NULL) {
+ strncpy(domainname, tmp + 1, strlen(tmp + 1));
+ RefreshStringObj(layout[1].obj);
+ }
+ }
+ }
+ if (!cancel) {
+ variable_set2("hostname", hostname);
+ variable_set2("domainname", domainname);
+ variable_set2("ip_addr", ipaddr);
+ variable_set2("ip_gateway", gateway);
+}
OpenPOWER on IntegriCloud