1/*
| 1/*
|
2 * $Id$
| 2 * $Id: tcpip.c,v 1.1 1995/05/16 02:53:28 jkh Exp $
|
3 * 4 * Copyright (c) 1995 5 * Gary J Palmer. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer, 12 * verbatim and that no modifications are made prior to this 13 * point in the file. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Gary J Palmer 20 * for the FreeBSD Project. 21 * 4. The name of Gary J Palmer or the FreeBSD Project may not be used to 22 * endorse or promote products derived from this software without specific 23 * prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY GARY J PALMER ``AS IS'' AND ANY EXPRESS 26 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL GARY J PALMER BE LIABLE FOR ANY 29 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 * 37 */ 38 39#include <stdio.h> 40#include <stdlib.h> 41#include <unistd.h> 42#include <sys/param.h> 43#include <string.h> 44#include <dialog.h> 45#include "ui_objects.h" 46#include "dir.h" 47#include "dialog.priv.h" 48#include "colors.h" 49#include "rc.h"
| 3 * 4 * Copyright (c) 1995 5 * Gary J Palmer. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer, 12 * verbatim and that no modifications are made prior to this 13 * point in the file. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Gary J Palmer 20 * for the FreeBSD Project. 21 * 4. The name of Gary J Palmer or the FreeBSD Project may not be used to 22 * endorse or promote products derived from this software without specific 23 * prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY GARY J PALMER ``AS IS'' AND ANY EXPRESS 26 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL GARY J PALMER BE LIABLE FOR ANY 29 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 * 37 */ 38 39#include <stdio.h> 40#include <stdlib.h> 41#include <unistd.h> 42#include <sys/param.h> 43#include <string.h> 44#include <dialog.h> 45#include "ui_objects.h" 46#include "dir.h" 47#include "dialog.priv.h" 48#include "colors.h" 49#include "rc.h"
|
| 50#include "sysinstall.h"
|
50 51static char hostname[256], domainname[256], 52 ipaddr[32], netmask[32], gateway[32],
| 51 52static char hostname[256], domainname[256], 53 ipaddr[32], netmask[32], gateway[32],
|
53 dns[32], extras[256];
| 54 nameserver[32], extras[256], iface[4];
|
54static int okbutton, cancelbutton; 55 56#define TCP_DIALOG_Y 0 57#define TCP_DIALOG_X 8 58#define TCP_DIALOG_WIDTH COLS - 16 59#define TCP_DIALOG_HEIGHT LINES - 2 60 61/* The names of the available interfaces, for the list */
| 55static int okbutton, cancelbutton; 56 57#define TCP_DIALOG_Y 0 58#define TCP_DIALOG_X 8 59#define TCP_DIALOG_WIDTH COLS - 16 60#define TCP_DIALOG_HEIGHT LINES - 2 61 62/* The names of the available interfaces, for the list */
|
62char *iface_names[MAX_INTERFACE];
| 63char *iface_names[INTERFACE_MAX];
|
63 64typedef struct _interface {
| 64 65typedef struct _interface {
|
65 char *name;
| 66 67 char netmask[32]; 68 char ifconfig_extras[256];
|
66 Device *dev; 67} Interface; 68 69typedef struct _layout {
| 69 Device *dev; 70} Interface; 71 72typedef struct _layout {
|
70 int y; 71 int x; 72 int len; 73 int maxlen; 74 char *prompt; 75 char *help; 76 void *var; 77 int type; 78 void *obj;
| 73 int y; 74 int x; 75 int len; 76 int maxlen; 77 char *prompt; 78 char *help; 79 void *var; 80 int type; 81 void *obj;
|
79} Layout; 80 81static Layout layout[] = {
| 82} Layout; 83 84static Layout layout[] = {
|
82{ 2, 2, 25, 255,
| 85{ 1, 2, 25, 255,
|
83 "Host name:", "The name of your machine on a network, e.g. foo.bar.com", 84 hostname, STRINGOBJ, NULL },
| 86 "Host name:", "The name of your machine on a network, e.g. foo.bar.com", 87 hostname, STRINGOBJ, NULL },
|
85{ 2, 35, 20, 255,
| 88{ 1, 35, 20, 255,
|
86 "Domain name:", 87 "The name of the domain that your machine is in, e.g. bar.com", 88 domainname, STRINGOBJ, NULL }, 89{ 5, 2, 18, 15, 90 "Gateway:", 91 "IP address of host forwarding packets to non-local hosts or nets", 92 gateway, STRINGOBJ, NULL }, 93{ 5, 35, 18, 15, 94 "Name server:", "IP address of your local DNS server",
| 89 "Domain name:", 90 "The name of the domain that your machine is in, e.g. bar.com", 91 domainname, STRINGOBJ, NULL }, 92{ 5, 2, 18, 15, 93 "Gateway:", 94 "IP address of host forwarding packets to non-local hosts or nets", 95 gateway, STRINGOBJ, NULL }, 96{ 5, 35, 18, 15, 97 "Name server:", "IP address of your local DNS server",
|
95 dns, STRINGOBJ, NULL }, 96{ 8, 2, 10, 6,
| 98 nameserver, STRINGOBJ, NULL }, 99{ 9, 2, 9, 6,
|
97 "Interface:", "One of potentially several network interfaces",
| 100 "Interface:", "One of potentially several network interfaces",
|
98 ifaces, LISTOBJ, NULL }, 99{ 14, 2, 18, 15,
| 101 iface, LISTOBJ, NULL }, 102{ 10, 18, 18, 15,
|
100 "IP Address:", 101 "The IP address to be used for your host - use 127.0.0.1 for loopback", 102 ipaddr, STRINGOBJ, NULL },
| 103 "IP Address:", 104 "The IP address to be used for your host - use 127.0.0.1 for loopback", 105 ipaddr, STRINGOBJ, NULL },
|
103{ 14, 35, 18, 15,
| 106{ 10, 37, 18, 15,
|
104 "Netmask:", 105 "The netmask for your network, e.g. 0xffffff00 for a class C network", 106 netmask, STRINGOBJ, NULL },
| 107 "Netmask:", 108 "The netmask for your network, e.g. 0xffffff00 for a class C network", 109 netmask, STRINGOBJ, NULL },
|
107{ 16, 2, 50, 255, 108 "Extra options:",
| 110{ 14, 18, 37, 255, 111 "Extra options to ifconfig:",
|
109 "Any options to ifconfig you'd like to specify manually", 110 extras, STRINGOBJ, NULL },
| 112 "Any options to ifconfig you'd like to specify manually", 113 extras, STRINGOBJ, NULL },
|
111{ 18, 2, 0, 0,
| 114{ 19, 10, 0, 0,
|
112 "OK", "Select this if you are happy with these settings", 113 &okbutton, BUTTONOBJ, NULL },
| 115 "OK", "Select this if you are happy with these settings", 116 &okbutton, BUTTONOBJ, NULL },
|
114{ 18, 15, 0, 0,
| 117{ 19, 30, 0, 0,
|
115 "CANCEL", "Select this if you wish to cancel this screen", 116 &cancelbutton, BUTTONOBJ, NULL }, 117{ NULL }, 118}; 119 120#define _validByte(b) ((b) > 0 && (b) < 255) 121 122static void 123feepout(char *msg) 124{ 125 beep();
| 118 "CANCEL", "Select this if you wish to cancel this screen", 119 &cancelbutton, BUTTONOBJ, NULL }, 120{ NULL }, 121}; 122 123#define _validByte(b) ((b) > 0 && (b) < 255) 124 125static void 126feepout(char *msg) 127{ 128 beep();
|
126 msgConfirm(msg); 127 dialog_clear(); 128 refresh();
| 129 dialog_notify(msg);
|
129} 130 131static int 132verifyIP(char *ip) 133{ 134 int a, b, c, d; 135 136 if (ip && sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d) == 4 && 137 _validByte(a) && _validByte(b) && _validByte(c) && 138 _validByte(d)) 139 return 1; 140 else 141 return 0; 142} 143 144static int 145verifySettings(void) 146{ 147 if (!hostname[0]) 148 feepout("Must specify a host name of some sort!"); 149 else if (!verifyIP(ipaddr)) 150 feepout("Invalid or missing value for IP address"); 151 else if (gateway[0] && !verifyIP(gateway)) 152 feepout("Invalid gateway IP address specified");
| 130} 131 132static int 133verifyIP(char *ip) 134{ 135 int a, b, c, d; 136 137 if (ip && sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d) == 4 && 138 _validByte(a) && _validByte(b) && _validByte(c) && 139 _validByte(d)) 140 return 1; 141 else 142 return 0; 143} 144 145static int 146verifySettings(void) 147{ 148 if (!hostname[0]) 149 feepout("Must specify a host name of some sort!"); 150 else if (!verifyIP(ipaddr)) 151 feepout("Invalid or missing value for IP address"); 152 else if (gateway[0] && !verifyIP(gateway)) 153 feepout("Invalid gateway IP address specified");
|
153 else if (dns[0] && !verifyIP(dns))
| 154 else if (nameserver[0] && !verifyIP(nameserver))
|
154 feepout("Invalid name server IP address specified"); 155 else if (netmask[0] < '0' || netmask[0] > '9') 156 feepout("Invalid or missing netmask"); 157 else 158 return 1; 159 return 0; 160} 161
| 155 feepout("Invalid name server IP address specified"); 156 else if (netmask[0] < '0' || netmask[0] > '9') 157 feepout("Invalid or missing netmask"); 158 else 159 return 1; 160 return 0; 161} 162
|
162/* Call this to initialize the TCP dialog */ 163void
| |
164/* This is it - how to get TCP setup values */
| 163/* This is it - how to get TCP setup values */
|
165void 166tcpOpenDialog(void)
| 164int 165tcpOpenDialog(char *str)
|
167{ 168 WINDOW *ds_win; 169 ComposeObj *obj = NULL; 170 ComposeObj *first, *last; 171 int n=0, quit=FALSE, cancel=FALSE, ret,
| 166{ 167 WINDOW *ds_win; 168 ComposeObj *obj = NULL; 169 ComposeObj *first, *last; 170 int n=0, quit=FALSE, cancel=FALSE, ret,
|
172 max;
| 171 max, n_iface;
|
173 char *tmp;
| 172 char *tmp;
|
| 173 Device **devs; 174 char old_iface[4];
|
174 175 ds_win = newwin(LINES, COLS, 0, 0);
| 175 176 ds_win = newwin(LINES, COLS, 0, 0);
|
176 if (ds_win == 0) {
| 177 if (ds_win == 0)
|
177 msgFatal("Cannot open TCP/IP dialog window!!");
| 178 msgFatal("Cannot open TCP/IP dialog window!!");
|
178 exit(1);
| 179 180 devs = deviceFind(NULL, DEVICE_TYPE_NETWORK); 181 if (!devs) { 182 msgConfirm("Couldn't find any potential network devices!"); 183 return 0;
|
179 }
| 184 }
|
| 185 186 while (devs[n] != NULL) { 187 iface_names[n] = (devs[n])->name; 188 ++n; 189 } 190 n_iface = --n; 191
|
180 draw_box(ds_win, TCP_DIALOG_Y, TCP_DIALOG_X, 181 TCP_DIALOG_HEIGHT, TCP_DIALOG_WIDTH, 182 dialog_attr, border_attr); 183 wattrset(ds_win, dialog_attr); 184 mvwaddstr(ds_win, TCP_DIALOG_Y, TCP_DIALOG_X + 20, 185 " Network Configuration ");
| 192 draw_box(ds_win, TCP_DIALOG_Y, TCP_DIALOG_X, 193 TCP_DIALOG_HEIGHT, TCP_DIALOG_WIDTH, 194 dialog_attr, border_attr); 195 wattrset(ds_win, dialog_attr); 196 mvwaddstr(ds_win, TCP_DIALOG_Y, TCP_DIALOG_X + 20, 197 " Network Configuration ");
|
| 198 draw_box(ds_win, TCP_DIALOG_Y + 9, TCP_DIALOG_X + 16, 199 TCP_DIALOG_HEIGHT - 13, TCP_DIALOG_WIDTH - 21, 200 dialog_attr, border_attr); 201 wattrset(ds_win, dialog_attr); 202 mvwaddstr(ds_win, TCP_DIALOG_Y + 9, TCP_DIALOG_X + 24, 203 " Per Interface Configuration ");
|
186
| 204
|
| 205
|
187 bzero(ipaddr, sizeof(ipaddr)); 188 bzero(netmask, sizeof(netmask)); 189 bzero(extras, sizeof(extras)); 190 191 tmp = getenv(VAR_HOSTNAME); 192 if (tmp) 193 strcpy(hostname, tmp); 194 else 195 bzero(hostname, sizeof(hostname)); 196 tmp = getenv(VAR_DOMAINNAME); 197 if (tmp) 198 strcpy(domainname, tmp); 199 else 200 bzero(domainname, sizeof(domainname)); 201 tmp = getenv(VAR_GATEWAY); 202 if (tmp) 203 strcpy(gateway, tmp); 204 else 205 bzero(gateway, sizeof(gateway)); 206 tmp = getenv(VAR_NAMESERVER); 207 if (tmp)
| 206 bzero(ipaddr, sizeof(ipaddr)); 207 bzero(netmask, sizeof(netmask)); 208 bzero(extras, sizeof(extras)); 209 210 tmp = getenv(VAR_HOSTNAME); 211 if (tmp) 212 strcpy(hostname, tmp); 213 else 214 bzero(hostname, sizeof(hostname)); 215 tmp = getenv(VAR_DOMAINNAME); 216 if (tmp) 217 strcpy(domainname, tmp); 218 else 219 bzero(domainname, sizeof(domainname)); 220 tmp = getenv(VAR_GATEWAY); 221 if (tmp) 222 strcpy(gateway, tmp); 223 else 224 bzero(gateway, sizeof(gateway)); 225 tmp = getenv(VAR_NAMESERVER); 226 if (tmp)
|
208 strcpy(dns, tmp);
| 227 strcpy(nameserver, tmp);
|
209 else
| 228 else
|
210 bzero(dns, sizeof(dns));
| 229 bzero(nameserver, sizeof(nameserver));
|
211
| 230
|
| 231 n=0;
|
212#define lt layout[n] 213 while (lt.help != NULL) { 214 switch (lt.type) { 215 case STRINGOBJ: 216 lt.obj = NewStringObj(ds_win, lt.prompt, lt.var, 217 lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X, 218 lt.len, lt.maxlen); 219 break; 220 221 case BUTTONOBJ: 222 lt.obj = NewButtonObj(ds_win, lt.prompt, lt.var, 223 lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X); 224 break; 225 226 case LISTOBJ:
| 232#define lt layout[n] 233 while (lt.help != NULL) { 234 switch (lt.type) { 235 case STRINGOBJ: 236 lt.obj = NewStringObj(ds_win, lt.prompt, lt.var, 237 lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X, 238 lt.len, lt.maxlen); 239 break; 240 241 case BUTTONOBJ: 242 lt.obj = NewButtonObj(ds_win, lt.prompt, lt.var, 243 lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X); 244 break; 245 246 case LISTOBJ:
|
227 lt.obj = NewListObj(ds_win, lt.prompt, lt.var, "lo0", 228 lt.y + TCP_DIALOG_Y, lt.x + TCP_DIALOG_X, 229 4, 12, 1);
| 247 lt.obj = NewListObj(ds_win, lt.prompt, (char **) iface_names, 248 lt.var, lt.y + TCP_DIALOG_Y, 249 lt.x + TCP_DIALOG_X, lt.len, 12, n_iface); 250 break;
|
230 default:
| 251 default:
|
231 printf("Don't support this object yet!\n"); 232 end_dialog(); 233 exit(1);
| 252 msgFatal("Don't support this object yet!");
|
234 } 235 AddObj(&obj, lt.type, (void *) lt.obj); 236 n++; 237 } 238 max = n-1; 239 240 last = obj; 241 while (last->next) 242 last = last->next; 243 244 /* find the first object in the list */ 245 first = obj; 246 while (first->prev) 247 first = first->prev;
| 253 } 254 AddObj(&obj, lt.type, (void *) lt.obj); 255 n++; 256 } 257 max = n-1; 258 259 last = obj; 260 while (last->next) 261 last = last->next; 262 263 /* find the first object in the list */ 264 first = obj; 265 while (first->prev) 266 first = first->prev;
|
248
| 267
|
249 n = 0;
| 268 n = 0;
|
250 while (quit != TRUE) {
| 269 cancelbutton = okbutton = 0; 270 strcpy(old_iface, iface); 271 272 while (!quit) {
|
251 char help_line[80]; 252 int i, len = strlen(lt.help); 253 254 for (i = 0; i < 79; i++) 255 help_line[i] = (i < len) ? lt.help[i] : ' '; 256 help_line[i] = '\0'; 257 use_helpline(help_line); 258 display_helpline(ds_win, LINES - 1, COLS - 1); 259 260 ret = PollObj(&obj); 261 262 switch (ret) { 263 case SEL_ESC:
| 273 char help_line[80]; 274 int i, len = strlen(lt.help); 275 276 for (i = 0; i < 79; i++) 277 help_line[i] = (i < len) ? lt.help[i] : ' '; 278 help_line[i] = '\0'; 279 use_helpline(help_line); 280 display_helpline(ds_win, LINES - 1, COLS - 1); 281 282 ret = PollObj(&obj); 283 284 switch (ret) { 285 case SEL_ESC:
|
264 quit=TRUE; 265 cancel=TRUE;
| 286 quit = TRUE, cancel=TRUE;
|
266 break; 267 268 case KEY_UP: 269 if (obj->prev !=NULL ) { 270 obj = obj->prev; 271 --n; 272 } 273 else { 274 obj = last; 275 n = max; 276 } 277 break; 278 279 case KEY_DOWN: 280 if (obj->next != NULL) { 281 obj = obj->next; 282 ++n; 283 } 284 else { 285 obj = first;
| 287 break; 288 289 case KEY_UP: 290 if (obj->prev !=NULL ) { 291 obj = obj->prev; 292 --n; 293 } 294 else { 295 obj = last; 296 n = max; 297 } 298 break; 299 300 case KEY_DOWN: 301 if (obj->next != NULL) { 302 obj = obj->next; 303 ++n; 304 } 305 else { 306 obj = first;
|
286 n=0;
| 307 n = 0;
|
287 } 288 break; 289 290 case SEL_BUTTON:
| 308 } 309 break; 310 311 case SEL_BUTTON:
|
291 if (verifySettings()) 292 quit=TRUE;
| 312 if (cancelbutton) { 313 cancel = TRUE, quit = TRUE; 314 } 315 else { 316 if (verifySettings()) 317 quit = TRUE; 318 }
|
293 break; 294 295 case SEL_CR: 296 case SEL_TAB:
| 319 break; 320 321 case SEL_CR: 322 case SEL_TAB:
|
| 323 if (strcmp(old_iface, iface)) { 324 n_iface=0; 325 while(strcmp(iface, iface_names[n_iface]) && 326 iface_names[n_iface]) 327 n_iface++; 328 329 if (iface_names[n_iface]) { 330 msgFatal("Erk - run off the end of the list of interfaces!"); 331 exit(1); 332 } 333 334 strcpy(ipaddr, 335 336 strcpy(old_iface, iface); 337 } 338
|
297 if (n < max) 298 ++n; 299 else 300 n = 0; 301 break; 302 303 case SEL_BACKTAB: 304 if (n) 305 --n; 306 else 307 n = max; 308 break; 309 310 default: 311 beep(); 312 } 313 314 if (n == 1) { 315 if ((tmp = index(hostname, '.')) != NULL) { 316 strncpy(domainname, tmp + 1, strlen(tmp + 1)); 317 RefreshStringObj(layout[1].obj); 318 } 319 } 320 }
| 339 if (n < max) 340 ++n; 341 else 342 n = 0; 343 break; 344 345 case SEL_BACKTAB: 346 if (n) 347 --n; 348 else 349 n = max; 350 break; 351 352 default: 353 beep(); 354 } 355 356 if (n == 1) { 357 if ((tmp = index(hostname, '.')) != NULL) { 358 strncpy(domainname, tmp + 1, strlen(tmp + 1)); 359 RefreshStringObj(layout[1].obj); 360 } 361 } 362 }
|
| 363 364 dialog_clear(); 365 refresh(); 366
|
321 if (!cancel) {
| 367 if (!cancel) {
|
322 variable_set2("hostname", hostname); 323 variable_set2("domainname", domainname); 324 variable_set2("ip_addr", ipaddr); 325 variable_set2("ip_gateway", gateway);
| 368 variable_set2(VAR_HOSTNAME, hostname); 369 variable_set2(VAR_DOMAINNAME, domainname); 370 if (gateway[0]) 371 variable_set2(VAR_GATEWAY, gateway); 372 if (nameserver[0]) 373 variable_set2(VAR_NAMESERVER, nameserver); 374 return 1; 375 } 376 377 return 0;
|
326}
| 378}
|