]> git.ipfire.org Git - ipfire-2.x.git/blame - src/install+setup/setup/networking.c
Das ein wenige instabile Sender der Emails gefixt.
[ipfire-2.x.git] / src / install+setup / setup / networking.c
CommitLineData
069680ac
MT
1/* SmoothWall setup program.
2 *
3 * This program is distributed under the terms of the GNU General Public
4 * Licence. See the file COPYING for details.
5 *
6 * (c) Lawrence Manning, 2001
7 * The big one: networking.
8 *
069680ac
MT
9 */
10
11#include "setup.h"
12
13#define DNS1 0
14#define DNS2 1
15#define DEFAULT_GATEWAY 2
16#define DNSGATEWAY_TOTAL 3
17
18extern FILE *flog;
19extern char *mylog;
20
21extern char **ctr;
22
23extern int automode;
24
5057b611 25#define HAS_GREEN 1
9b040aa0
HS
26#define HAS_RED (configtype == 1 || configtype == 2 || configtype == 3 || configtype == 4)
27#define HAS_ORANGE (configtype == 2 || configtype == 4)
28#define HAS_BLUE (configtype == 3 || configtype == 4)
29#define RED_IS_NOT_ETH (configtype == 0)
30
069680ac 31extern struct nic nics[];
5057b611 32extern struct knic knics[];
069680ac 33
a358af8c 34char *configtypenames[] = {
9b040aa0
HS
35 "GREEN + RED",
36 "GREEN + RED + ORANGE",
37 "GREEN + RED + BLUE",
38 "GREEN + RED + ORANGE + BLUE",
39 NULL };
40int configtypecards[] = {
9b040aa0
HS
41 2, // "GREEN + RED",
42 3, // "GREEN + RED + ORANGE",
43 3, // "GREEN + RED + BLUE",
6fc15159 44 4 // "GREEN + RED + ORANGE + BLUE",
9b040aa0
HS
45};
46
47
069680ac
MT
48int netaddresschange;
49
50int oktoleave(char *errormessage);
51int firstmenu(void);
52int configtypemenu(void);
53int drivermenu(void);
54int changedrivers(void);
55int greenaddressmenu(void);
56int addressesmenu(void);
57int dnsgatewaymenu(void);
58
59int handlenetworking(void)
60{
61 int done;
62 int choice;
9b040aa0 63 int found;
069680ac
MT
64 char errormessage[STRING_SIZE];
65
66 netaddresschange = 0;
67
9b040aa0 68 found = scan_network_cards();
9c1c1c57 69 found = init_knics();
9b040aa0 70
069680ac
MT
71 done = 0;
72 while (!done)
73 {
74 choice = firstmenu();
75
76 switch (choice)
77 {
78 case 1:
79 configtypemenu();
80 break;
81
82 case 2:
83 drivermenu();
84 break;
85
86 case 3:
87 addressesmenu();
88 break;
89
90 case 4:
91 dnsgatewaymenu();
92 break;
93
94 case 0:
95 if (oktoleave(errormessage))
96 done = 1;
97 else
98 errorbox(errormessage);
99 break;
100
101 default:
102 break;
103 }
104 }
105
106 if (automode == 0)
107 {
108 /* Restart networking! */
109 if (netaddresschange)
110 {
111 runcommandwithstatus("/etc/rc.d/init.d/network stop",
112 ctr[TR_PUSHING_NETWORK_DOWN]);
eea0467a
HS
113
114 rename_nics();
115
069680ac
MT
116 runcommandwithstatus("/etc/rc.d/init.d/network start",
117 ctr[TR_PULLING_NETWORK_UP]);
069680ac
MT
118 }
119 }
84e975ba 120 create_udev();
069680ac
MT
121 return 1;
122}
123
124int oktoleave(char *errormessage)
125{
126 struct keyvalue *kv = initkeyvalues();
127 char temp[STRING_SIZE];
128 int configtype;
129
130 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
131 {
132 freekeyvalues(kv);
133 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
134 return 0;
135 }
136
0db33b56
MT
137 strcpy(temp, "1"); findkey(kv, "CONFIG_TYPE", temp); configtype = atol(temp);
138 if (configtype < 1 || configtype > 4) configtype = 1;
069680ac 139
f93a4b4f 140 if (HAS_GREEN)
069680ac 141 {
f93a4b4f 142 strcpy(temp, ""); findkey(kv, "GREEN_DEV", temp);
069680ac
MT
143 if (!(strlen(temp)))
144 {
f93a4b4f 145 strcpy(errormessage, ctr[TR_NO_GREEN_INTERFACE]);
069680ac
MT
146 goto EXIT;
147 }
f93a4b4f 148 if (!(interfacecheck(kv, "GREEN")))
069680ac 149 {
1700769c 150 strcpy(errormessage, ctr[TR_MISSING_GREEN_IP]);
f93a4b4f
HS
151 goto EXIT;
152 }
153 }
154 if (HAS_RED)
155 {
156 strcpy(temp, ""); findkey(kv, "RED_DEV", temp);
157 if (!(strlen(temp)))
158 {
159 strcpy(errormessage, ctr[TR_NO_RED_INTERFACE]);
160 goto EXIT;
161 }
162 if (!(interfacecheck(kv, "RED")))
163 {
164 strcpy(errormessage, ctr[TR_MISSING_RED_IP]);
069680ac
MT
165 goto EXIT;
166 }
167 }
168 if (HAS_ORANGE)
169 {
170 strcpy(temp, ""); findkey(kv, "ORANGE_DEV", temp);
171 if (!(strlen(temp)))
172 {
173 strcpy(errormessage, ctr[TR_NO_ORANGE_INTERFACE]);
174 goto EXIT;
175 }
176 if (!(interfacecheck(kv, "ORANGE")))
177 {
178 strcpy(errormessage, ctr[TR_MISSING_ORANGE_IP]);
179 goto EXIT;
180 }
181 }
f93a4b4f 182 if (HAS_BLUE)
069680ac 183 {
f93a4b4f 184 strcpy(temp, ""); findkey(kv, "BLUE_DEV", temp);
069680ac
MT
185 if (!(strlen(temp)))
186 {
f93a4b4f 187 strcpy(errormessage, ctr[TR_NO_BLUE_INTERFACE]);
069680ac
MT
188 goto EXIT;
189 }
f93a4b4f 190 if (!(interfacecheck(kv, "BLUE")))
069680ac 191 {
f93a4b4f
HS
192 strcpy(errormessage, ctr[TR_MISSING_BLUE_IP]);
193 goto EXIT;
194 }
195 }
196 if (configtype == 0)
197 {
198 strcpy(temp, ""); findkey(kv, "DNS1", temp);
199 if (!(strlen(temp)))
200 {
1700769c 201 strcpy(errormessage, ctr[TR_MISSING_DNS]);
f93a4b4f
HS
202 goto EXIT;
203 }
204 strcpy(temp, ""); findkey(kv, "DEFAULT_GATEWAY", temp);
205 if (!(strlen(temp)))
206 {
1700769c 207 strcpy(errormessage, ctr[TR_MISSING_DEFAULT]);
069680ac
MT
208 goto EXIT;
209 }
210 }
211 strcpy(errormessage, "");
212EXIT:
213 freekeyvalues(kv);
214
215 if (strlen(errormessage))
216 return 0;
217 else
218 return 1;
219}
220
221
222/* Shows the main menu and a summary of the current settings. */
223int firstmenu(void)
224{
225 char *sections[] = { ctr[TR_NETWORK_CONFIGURATION_TYPE],
226 ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS],
227 ctr[TR_ADDRESS_SETTINGS],
228 ctr[TR_DNS_AND_GATEWAY_SETTINGS], NULL };
229 int rc;
230 static int choice = 0;
231 struct keyvalue *kv = initkeyvalues();
232 char message[1000];
0db33b56 233 char temp[STRING_SIZE] = "1";
069680ac
MT
234 int x;
235 int result;
236 char networkrestart[STRING_SIZE] = "";
237
238 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
239 {
240 freekeyvalues(kv);
241 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
242 return 0;
243 }
244
245 if (netaddresschange)
246 strcpy(networkrestart, ctr[TR_RESTART_REQUIRED]);
247
d0f2cc42
MT
248 strcpy(temp, ""); findkey(kv, "CONFIG_TYPE", temp);
249 x = atol(temp);
250 x--;
0db33b56 251 if (x < 0 || x > 4) x = 0;
069680ac 252 /* Format heading bit. */
d0f2cc42 253 snprintf(message, 1000, ctr[TR_CURRENT_CONFIG], configtypenames[x],
069680ac
MT
254 networkrestart);
255 rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_MENU], message, 50, 5, 5, 6,
256 sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL);
257
258 if (rc == 0 || rc == 1)
259 result = choice + 1;
260 else
261 result = 0;
262
263 return result;
264}
265
266/* Here they choose general network config, number of nics etc. */
267int configtypemenu(void)
268{
269 struct keyvalue *kv = initkeyvalues();
0db33b56 270 char temp[STRING_SIZE] = "1";
069680ac 271 char message[1000];
9b040aa0 272 int choise, found;
0db33b56 273 int rc, configtype;
9b040aa0 274
069680ac
MT
275 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
276 {
277 freekeyvalues(kv);
278 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
279 return 0;
280 }
9b040aa0
HS
281
282 found = scan_network_cards();
069680ac 283
9b040aa0 284 findkey(kv, "CONFIG_TYPE", temp); choise = atol(temp);
6fc15159 285 choise--;
9b040aa0
HS
286
287 do
288 {
289 sprintf(message, ctr[TR_NETWORK_CONFIGURATION_TYPE_LONG], NAME);
290 rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_TYPE], message, 50, 5, 5,
291 6, configtypenames, &choise, ctr[TR_OK], ctr[TR_CANCEL], NULL);
292 if ( configtypecards[choise] > found ) {
1700769c 293 sprintf(message, ctr[TR_NOT_ENOUGH_INTERFACES] , configtypecards[choise], found);
9b040aa0
HS
294 errorbox(message);
295 }
296 }
297 while ( configtypecards[choise] > found);
069680ac
MT
298
299 if (rc == 0 || rc == 1)
300 {
a358af8c 301 choise++;
9b040aa0 302 sprintf(temp, "%d", choise);
069680ac 303 replacekeyvalue(kv, "CONFIG_TYPE", temp);
0db33b56
MT
304 configtype = atol(temp);
305 if (!HAS_RED)
306 clear_card_entry(_RED_CARD_);
307 if (!HAS_ORANGE)
308 clear_card_entry(_ORANGE_CARD_);
309 if (!HAS_BLUE)
310 clear_card_entry(_BLUE_CARD_);
9b040aa0 311
069680ac
MT
312 writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
313 netaddresschange = 1;
314 }
069680ac
MT
315 freekeyvalues(kv);
316
317 return 0;
318}
319
320/* Driver menu. Choose drivers.. */
321int drivermenu(void)
322{
323 struct keyvalue *kv = initkeyvalues();
5057b611 324 char message[STRING_SIZE];
0db33b56 325 char temp[STRING_SIZE] = "1";
9c1c1c57 326
069680ac 327 int configtype;
0db33b56 328 int i, rc, kcount = 0, neednics;
069680ac
MT
329
330 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
331 {
332 freekeyvalues(kv);
333 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
334 return 0;
335 }
336
0db33b56 337 findkey(kv, "CONFIG_TYPE", temp);
069680ac
MT
338 configtype = atol(temp);
339
069680ac 340 strcpy(message, ctr[TR_CONFIGURE_NETWORK_DRIVERS]);
5057b611 341
0db33b56
MT
342 kcount = 0;
343 neednics = 0;
5057b611 344 if (HAS_GREEN) {
5057b611
HS
345 sprintf(temp, "GREEN: %s\n", knics[_GREEN_CARD_].description);
346 strcat(message, temp);
347 if (strlen(knics[_GREEN_CARD_].macaddr) ) {
348 sprintf(temp, "GREEN: (%s) %s green0\n", knics[_GREEN_CARD_].macaddr, ctr[TR_AS]);
349 strcat(message, temp);
350 }
351 neednics++;
75ae2191 352 }
5057b611 353 if (HAS_RED) {
5057b611
HS
354 sprintf(temp, "RED: %s\n", knics[_RED_CARD_].description);
355 strcat(message, temp);
356 if (strlen(knics[_RED_CARD_].macaddr) ) {
357 sprintf(temp, "RED: (%s) %s red0\n", knics[_RED_CARD_].macaddr, ctr[TR_AS]);
358 strcat(message, temp);
75ae2191 359 }
5057b611 360 neednics++;
069680ac 361 }
75ae2191 362 if (HAS_ORANGE) {
5057b611
HS
363 sprintf(temp, "ORANGE: %s\n", knics[_ORANGE_CARD_].description);
364 strcat(message, temp);
365 if ( strlen(knics[_ORANGE_CARD_].macaddr) ) {
366 sprintf(temp, "ORANGE: (%s) %s orange0\n", knics[_ORANGE_CARD_].macaddr, ctr[TR_AS]);
367 strcat(message, temp);
368 }
369 neednics++;
75ae2191 370 }
5057b611 371 if (HAS_BLUE) {
5057b611
HS
372 sprintf(temp, "BLUE: %s\n", knics[_BLUE_CARD_].description);
373 strcat(message, temp);
374 if (strlen(knics[_BLUE_CARD_].macaddr)) {
375 sprintf(temp, "BLUE: (%s) %s blue0\n", knics[_BLUE_CARD_].macaddr, ctr[TR_AS]);
376 strcat(message, temp);
75ae2191 377 }
5057b611 378 neednics++;
069680ac 379 }
5057b611 380
0db33b56
MT
381 for ( i=0 ; i<4; i++)
382 if (strcmp(knics[i].macaddr, ""))
383 kcount++;
5057b611 384
f93a4b4f
HS
385 if (neednics = kcount)
386 {
5057b611
HS
387 strcat(message, ctr[TR_DO_YOU_WISH_TO_CHANGE_THESE_SETTINGS]);
388 rc = newtWinChoice(ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS], ctr[TR_OK],
069680ac 389 ctr[TR_CANCEL], message);
5057b611
HS
390 if (rc == 0 || rc == 1)
391 {
5057b611
HS
392 changedrivers();
393 }
394 } else {
069680ac
MT
395 changedrivers();
396 }
069680ac
MT
397 freekeyvalues(kv);
398
399 return 1;
400}
401
9b040aa0
HS
402int set_menu_entry_for(int *nr, int *card)
403{
404
405}
406
069680ac
MT
407int changedrivers(void)
408{
409 struct keyvalue *kv = initkeyvalues();
5057b611 410 char temp[STRING_SIZE], message[STRING_SIZE];
069680ac 411 int configtype;
75ae2191 412 int green = 0, red = 0, blue = 0, orange = 0;
5057b611
HS
413 char MenuInhalt[10][180];
414 char *pMenuInhalt[10];
415 int count = 0, choise = 0, rc;
416 int NicEntry[10];
59de0b00 417
069680ac
MT
418 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
419 {
420 freekeyvalues(kv);
421 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
422 return 0;
423 }
0db33b56
MT
424 if (automode == 0)
425 runcommandwithstatus("/etc/rc.d/init.d/network stop red blue orange",
426 ctr[TR_PUSHING_NON_LOCAL_NETWORK_DOWN]);
59de0b00 427
5057b611 428 findkey(kv, "CONFIG_TYPE", temp); configtype = atol(temp);
a358af8c 429 if (configtype == 1)
75ae2191 430 { green = 1; red = 1; }
9b040aa0 431 else if (configtype == 2)
75ae2191 432 { green = 1; red = 1; orange = 1; }
9b040aa0 433 else if (configtype == 3)
75ae2191 434 { green = 1; red = 1; blue = 1; }
9b040aa0
HS
435 else if (configtype == 4)
436 { green = 1; red=1; orange=1; blue = 1; }
5057b611
HS
437
438 do
439 {
440 count = 0;
1700769c 441 strcpy(message, ctr[TR_INTERFACE_CHANGE]);
5057b611
HS
442
443 if (green) {
444 strcpy(MenuInhalt[count], "GREEN");
445 pMenuInhalt[count] = MenuInhalt[count];
446 NicEntry[_GREEN_CARD_] = count;
5057b611
HS
447 sprintf(temp, "GREEN: %s\n", knics[_GREEN_CARD_].description);
448 strcat(message, temp);
449 if ( strlen(knics[_GREEN_CARD_].macaddr) ) {
450 sprintf(temp, "GREEN: (%s) %s green0\n", knics[_GREEN_CARD_].macaddr, ctr[TR_AS]);
451 strcat(message, temp);
452 }
453 count++;
454 }
455
456 if (red) {
457 strcpy(MenuInhalt[count], "RED");
458 pMenuInhalt[count] = MenuInhalt[count];
459 NicEntry[_RED_CARD_] = count;
5057b611
HS
460 sprintf(temp, "RED: %s\n", knics[_RED_CARD_].description);
461 strcat(message, temp);
462 if ( strlen(knics[_RED_CARD_].macaddr) ) {
463 sprintf(temp, "RED: (%s) %s red0\n", knics[_RED_CARD_].macaddr, ctr[TR_AS]);
464 strcat(message, temp);
465 }
466 count++;
467 }
468
469 if (orange) {
470 strcpy(MenuInhalt[count], "ORANGE");
471 pMenuInhalt[count] = MenuInhalt[count];
472 NicEntry[_ORANGE_CARD_] = count;
5057b611
HS
473 sprintf(temp, "ORANGE: %s\n", knics[_ORANGE_CARD_].description);
474 strcat(message, temp);
475 if ( strlen(knics[_ORANGE_CARD_].macaddr) ) {
476 sprintf(temp, "ORANGE: (%s) %s orange0\n", knics[_ORANGE_CARD_].macaddr, ctr[TR_AS]);
477 strcat(message, temp);
478 }
479 count++;
480 }
481
482 if (blue) {
483 strcpy(MenuInhalt[count], "BLUE");
484 pMenuInhalt[count] = MenuInhalt[count];
485 NicEntry[_BLUE_CARD_] = count;
5057b611
HS
486 sprintf(temp, "BLUE: %s\n", knics[_BLUE_CARD_].description);
487 strcat(message, temp);
488 if ( strlen(knics[_BLUE_CARD_].macaddr) ) {
489 sprintf(temp, "BLUE: (%s) %s blue0\n", knics[_BLUE_CARD_].macaddr, ctr[TR_AS]);
490 strcat(message, temp);
491 }
492 count++;
493 }
494 pMenuInhalt[count] = NULL;
495
1700769c 496 rc = newtWinMenu( ctr[TR_NETCARD_COLOR], message, 70, 5, 5, 6, pMenuInhalt, &choise, ctr[TR_SELECT], ctr[TR_REMOVE], ctr[TR_DONE], NULL);
5057b611
HS
497
498 if ( rc == 0 || rc == 1) {
9b040aa0
HS
499 if ((green) && ( choise == NicEntry[0])) nicmenu(_GREEN_CARD_);
500 if ((red) && ( choise == NicEntry[1])) nicmenu(_RED_CARD_);
501 if ((orange) && ( choise == NicEntry[2])) nicmenu(_ORANGE_CARD_);
502 if ((blue) && ( choise == NicEntry[3])) nicmenu(_BLUE_CARD_);
eea0467a 503 netaddresschange = 1;
5057b611 504 } else if (rc == 2) {
9b040aa0
HS
505 if ((green) && ( choise == NicEntry[0])) ask_clear_card_entry(_GREEN_CARD_);
506 if ((red) && ( choise == NicEntry[1])) ask_clear_card_entry(_RED_CARD_);
507 if ((orange) && ( choise == NicEntry[2])) ask_clear_card_entry(_ORANGE_CARD_);
508 if ((blue) && ( choise == NicEntry[3])) ask_clear_card_entry(_BLUE_CARD_);
eea0467a 509 netaddresschange = 1;
a358af8c 510 }
5057b611
HS
511 }
512 while ( rc <= 2);
069680ac
MT
513
514 freekeyvalues(kv);
069680ac
MT
515 return 1;
516}
517
75ae2191 518// Let user change GREEN address.
069680ac
MT
519int greenaddressmenu(void)
520{
521 struct keyvalue *kv = initkeyvalues();
522 char message[1000];
523 int rc;
524
525 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
526 {
527 freekeyvalues(kv);
528 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
529 return 0;
530 }
531
532 sprintf(message, ctr[TR_WARNING_LONG], NAME);
533 rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL], message);
534
535 if (rc == 0 || rc == 1)
536 {
537 if (changeaddress(kv, "GREEN", 0, ""))
538 {
539 netaddresschange = 1;
540 writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
541 writehostsfiles();
542 }
543 }
544
545 freekeyvalues(kv);
546
547 return 0;
548}
549
75ae2191 550// They can change BLUE, ORANGE and GREEN too :)
069680ac
MT
551int addressesmenu(void)
552{
553 struct keyvalue *kv = initkeyvalues();
554 struct keyvalue *mainkv = initkeyvalues();
555 int rc = 0;
556 char *sections[5];
557 char *green = "GREEN";
558 char *orange = "ORANGE";
559 char *blue = "BLUE";
560 char *red = "RED";
561 int c = 0;
562 char greenaddress[STRING_SIZE];
563 char oldgreenaddress[STRING_SIZE];
564 char temp[STRING_SIZE];
565 char temp2[STRING_SIZE];
566 char message[1000];
567 int configtype;
568 int done;
569 int choice;
570 char hostname[STRING_SIZE];
571
572 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
573 {
574 freekeyvalues(kv);
575 freekeyvalues(mainkv);
576 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
577 return 0;
578 }
579 if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))
580 {
581 freekeyvalues(kv);
582 freekeyvalues(mainkv);
583 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
584 return 0;
585 }
586
587 strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp);
588 configtype = atol(temp);
589
590 sections[c] = green;
591 c++;
592 if (HAS_BLUE)
593 {
594 sections[c] = blue;
595 c++;
596 }
597 if (HAS_ORANGE)
598 {
599 sections[c] = orange;
600 c++;
601 }
602 if (HAS_RED)
603 {
604 sections[c] = red;
605 c++;
606 }
607 sections[c] = NULL;
608
609 choice = 0;
610 done = 0;
611 while (!done)
612 {
613 rc = newtWinMenu(ctr[TR_ADDRESS_SETTINGS],
614 ctr[TR_SELECT_THE_INTERFACE_YOU_WISH_TO_RECONFIGURE], 50, 5,
615 5, 6, sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL);
616
617 if (rc == 0 || rc == 1)
618 {
619 if (strcmp(sections[choice], "GREEN") == 0)
620 {
621 findkey(kv, "GREEN_ADDRESS", oldgreenaddress);
622 sprintf(message, ctr[TR_WARNING_LONG], NAME);
623 rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL],
624 message);
625 if (rc == 0 || rc == 1)
626 {
627 if (changeaddress(kv, "GREEN", 0, ""))
628 {
629 netaddresschange = 1;
630 writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
631 writehostsfiles();
632 findkey(kv, "GREEN_ADDRESS", greenaddress);
633 snprintf(temp, STRING_SIZE-1, "option routers %s", oldgreenaddress);
634 snprintf(temp2, STRING_SIZE-1, "option routers %s", greenaddress);
635 replace (CONFIG_ROOT "/dhcp/dhcpd.conf", temp, temp2);
636 chown (CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);
637 }
638 }
639 }
640 if (strcmp(sections[choice], "BLUE") == 0)
641 {
642 if (changeaddress(kv, "BLUE", 0, ""))
643 netaddresschange = 1;
644 }
645 if (strcmp(sections[choice], "ORANGE") == 0)
646 {
647 if (changeaddress(kv, "ORANGE", 0, ""))
648 netaddresschange = 1;
649 }
650 if (strcmp(sections[choice], "RED") == 0)
651 {
652 strcpy(hostname, "");
653 findkey(mainkv, "HOSTNAME", hostname);
654 if (changeaddress(kv, "RED", 1, hostname))
655 netaddresschange = 1;
656 }
657 }
658 else
659 done = 1;
660 }
661
662 writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
663 freekeyvalues(kv);
664 freekeyvalues(mainkv);
665
666 return 0;
667}
668
669/* DNS and default gateway.... */
670int dnsgatewaymenu(void)
671{
672 struct keyvalue *kv = initkeyvalues();
673 char message[1000];
674 char temp[STRING_SIZE] = "0";
675 struct newtWinEntry entries[DNSGATEWAY_TOTAL+1];
676 char *values[DNSGATEWAY_TOTAL]; /* pointers for the values. */
677 int error;
678 int configtype;
679 int rc;
680
681 if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
682 {
683 freekeyvalues(kv);
684 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
685 return 0;
686 }
687
069680ac
MT
688 entries[DNS1].text = ctr[TR_PRIMARY_DNS];
689 strcpy(temp, ""); findkey(kv, "DNS1", temp);
690 values[DNS1] = strdup(temp);
691 entries[DNS1].value = &values[DNS1];
692 entries[DNS1].flags = 0;
693
694 entries[DNS2].text = ctr[TR_SECONDARY_DNS];
695 strcpy(temp, ""); findkey(kv, "DNS2", temp);
696 values[DNS2] = strdup(temp);
697 entries[DNS2].value = &values[DNS2];
698 entries[DNS2].flags = 0;
699
700 entries[DEFAULT_GATEWAY].text = ctr[TR_DEFAULT_GATEWAY];
701 strcpy(temp, ""); findkey(kv, "DEFAULT_GATEWAY", temp);
702 values[DEFAULT_GATEWAY] = strdup(temp);
703 entries[DEFAULT_GATEWAY].value = &values[DEFAULT_GATEWAY];
704 entries[DEFAULT_GATEWAY].flags = 0;
705
706 entries[DNSGATEWAY_TOTAL].text = NULL;
707 entries[DNSGATEWAY_TOTAL].value = NULL;
708 entries[DNSGATEWAY_TOTAL].flags = 0;
709
710 do
711 {
712 error = 0;
713
714 rc = newtWinEntries(ctr[TR_DNS_AND_GATEWAY_SETTINGS],
715 ctr[TR_DNS_AND_GATEWAY_SETTINGS_LONG], 50, 5, 5, 18, entries,
716 ctr[TR_OK], ctr[TR_CANCEL], NULL);
717 if (rc == 0 || rc == 1)
718 {
719 strcpy(message, ctr[TR_INVALID_FIELDS]);
720 if (strlen(values[DNS1]))
721 {
722 if (inet_addr(values[DNS1]) == INADDR_NONE)
723 {
724 strcat(message, ctr[TR_PRIMARY_DNS_CR]);
725 error = 1;
726 }
727 }
728 if (strlen(values[DNS2]))
729 {
730 if (inet_addr(values[DNS2]) == INADDR_NONE)
731 {
732 strcat(message, ctr[TR_SECONDARY_DNS_CR]);
733 error = 1;
734 }
735 }
736 if (strlen(values[DEFAULT_GATEWAY]))
737 {
738 if (inet_addr(values[DEFAULT_GATEWAY]) == INADDR_NONE)
739 {
740 strcat(message, ctr[TR_DEFAULT_GATEWAY_CR]);
741 error = 1;
742 }
743 }
744 if (!strlen(values[DNS1]) && strlen(values[DNS2]))
745 {
746 strcpy(message, ctr[TR_SECONDARY_WITHOUT_PRIMARY_DNS]);
747 error = 1;
748 }
749
750 if (error)
751 errorbox(message);
752 else
753 {
754 replacekeyvalue(kv, "DNS1", values[DNS1]);
755 replacekeyvalue(kv, "DNS2", values[DNS2]);
756 replacekeyvalue(kv, "DEFAULT_GATEWAY", values[DEFAULT_GATEWAY]);
757 netaddresschange = 1;
758 free(values[DNS1]);
759 free(values[DNS2]);
760 free(values[DEFAULT_GATEWAY]);
761 writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
762 }
763 }
764 }
765 while (error);
766
767 freekeyvalues(kv);
768
769 return 1;
770}