1 /* SmoothWall setup program.
3 * This program is distributed under the terms of the GNU General Public
4 * Licence. See the file COPYING for details.
6 * (c) Lawrence Manning, 2001
7 * The big one: networking.
9 * $Id: networking.c,v 1.5.2.6 2006/02/06 22:00:13 gespinasse Exp $
17 #define DEFAULT_GATEWAY 2
18 #define DNSGATEWAY_TOTAL 3
27 #define HAS_ORANGE (configtype == 1 || configtype == 3 || configtype == 5 || configtype == 7)
28 #define HAS_RED (configtype == 2 || configtype == 3 || configtype == 6 || configtype == 7)
29 #define HAS_BLUE (configtype == 4 || configtype == 5 || configtype == 6 || configtype == 7)
30 #define RED_IS_NOT_ETH (configtype == 0 || configtype == 1 || configtype == 4 || configtype == 5)
32 extern struct nic nics
[];
34 char *configtypenames
[] = {
35 "GREEN (RED is modem/ISDN)",
36 "GREEN + ORANGE (RED is modem/ISDN)",
38 "GREEN + ORANGE + RED",
39 "GREEN + BLUE (RED is modem/ISDN) ",
40 "GREEN + ORANGE + BLUE (RED is modem/ISDN)",
42 "GREEN + ORANGE + BLUE + RED",
46 int oktoleave(char *errormessage
);
48 int configtypemenu(void);
50 int changedrivers(void);
51 int greenaddressmenu(void);
52 int addressesmenu(void);
53 int dnsgatewaymenu(void);
55 int handlenetworking(void)
59 char errormessage
[STRING_SIZE
];
87 if (oktoleave(errormessage
))
90 errorbox(errormessage
);
100 /* Restart networking! */
101 if (netaddresschange
)
103 runcommandwithstatus("/etc/rc.d/init.d/network stop",
104 ctr
[TR_PUSHING_NETWORK_DOWN
]);
105 runcommandwithstatus("/etc/rc.d/init.d/network start",
106 ctr
[TR_PULLING_NETWORK_UP
]);
107 // mysystem("/etc/rc.d/rc.pcmcia start");
114 int oktoleave(char *errormessage
)
116 struct keyvalue
*kv
= initkeyvalues();
117 char temp
[STRING_SIZE
];
120 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
123 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
127 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
); configtype
= atol(temp
);
128 if (configtype
< 0 || configtype
> 7) configtype
= 0;
132 strcpy(temp
, ""); findkey(kv
, "BLUE_DEV", temp
);
135 strcpy(errormessage
, ctr
[TR_NO_BLUE_INTERFACE
]);
138 if (!(interfacecheck(kv
, "BLUE")))
140 strcpy(errormessage
, ctr
[TR_MISSING_BLUE_IP
]);
146 strcpy(temp
, ""); findkey(kv
, "ORANGE_DEV", temp
);
149 strcpy(errormessage
, ctr
[TR_NO_ORANGE_INTERFACE
]);
152 if (!(interfacecheck(kv
, "ORANGE")))
154 strcpy(errormessage
, ctr
[TR_MISSING_ORANGE_IP
]);
160 strcpy(temp
, ""); findkey(kv
, "RED_DEV", temp
);
163 strcpy(errormessage
, ctr
[TR_NO_RED_INTERFACE
]);
166 if (!(interfacecheck(kv
, "RED")))
168 strcpy(errormessage
, ctr
[TR_MISSING_RED_IP
]);
172 strcpy(errormessage
, "");
176 if (strlen(errormessage
))
183 /* Shows the main menu and a summary of the current settings. */
186 char *sections
[] = { ctr
[TR_NETWORK_CONFIGURATION_TYPE
],
187 ctr
[TR_DRIVERS_AND_CARD_ASSIGNMENTS
],
188 ctr
[TR_ADDRESS_SETTINGS
],
189 ctr
[TR_DNS_AND_GATEWAY_SETTINGS
], NULL
};
191 static int choice
= 0;
192 struct keyvalue
*kv
= initkeyvalues();
194 char temp
[STRING_SIZE
];
197 char networkrestart
[STRING_SIZE
] = "";
199 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
202 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
206 if (netaddresschange
)
207 strcpy(networkrestart
, ctr
[TR_RESTART_REQUIRED
]);
209 strcpy(temp
, ""); findkey(kv
, "CONFIG_TYPE", temp
); x
= atol(temp
);
210 if (x
< 0 || x
> 7) x
= 0;
211 /* Format heading bit. */
212 snprintf(message
, 1000, ctr
[TR_CURRENT_CONFIG
], configtypenames
[x
],
214 rc
= newtWinMenu(ctr
[TR_NETWORK_CONFIGURATION_MENU
], message
, 50, 5, 5, 6,
215 sections
, &choice
, ctr
[TR_OK
], ctr
[TR_DONE
], NULL
);
217 if (rc
== 0 || rc
== 1)
225 /* Here they choose general network config, number of nics etc. */
226 int configtypemenu(void)
228 struct keyvalue
*kv
= initkeyvalues();
229 char temp
[STRING_SIZE
] = "0";
234 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
237 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
241 findkey(kv
, "CONFIG_TYPE", temp
); choice
= atol(temp
);
242 sprintf(message
, ctr
[TR_NETWORK_CONFIGURATION_TYPE_LONG
], NAME
);
243 rc
= newtWinMenu(ctr
[TR_NETWORK_CONFIGURATION_TYPE
], message
, 50, 5, 5,
244 6, configtypenames
, &choice
, ctr
[TR_OK
], ctr
[TR_CANCEL
], NULL
);
246 if (rc
== 0 || rc
== 1)
248 runcommandwithstatus("/etc/rc.d/init.d/network red down",
249 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
250 runcommandwithstatus("/etc/rc.d/init.d/network blue down",
251 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
252 runcommandwithstatus("/etc/rc.d/init.d/network orange down",
253 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
255 sprintf(temp
, "%d", choice
);
256 replacekeyvalue(kv
, "CONFIG_TYPE", temp
);
257 replacekeyvalue(kv
, "ORANGE_DEV", "");
258 replacekeyvalue(kv
, "BLUE_DEV", "");
259 replacekeyvalue(kv
, "RED_DEV", "");
260 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
261 netaddresschange
= 1;
269 /* Driver menu. Choose drivers.. */
272 struct keyvalue
*kv
= initkeyvalues();
274 char temp
[STRING_SIZE
], temp1
[STRING_SIZE
];
275 char driver
[STRING_SIZE
], dev
[STRING_SIZE
];
279 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
282 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
286 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
287 configtype
= atol(temp
);
292 errorbox(ctr
[TR_YOUR_CONFIGURATION_IS_SINGLE_GREEN_ALREADY_HAS_DRIVER
]);
296 strcpy(message
, ctr
[TR_CONFIGURE_NETWORK_DRIVERS
]);
298 /* This horrible big formats the heading :( */
299 strcpy(driver
, ""); findkey(kv
, "GREEN_DISPLAYDRIVER", driver
);
300 findnicdescription(driver
, temp
);
301 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "GREEN_DEV", dev
);
302 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
303 sprintf(temp1
, "GREEN: %s (%s)\n", temp
, dev
);
304 strcat(message
, temp1
);
307 strcpy(driver
, ""); findkey(kv
, "BLUE_DISPLAYDRIVER", driver
);
308 findnicdescription(driver
, temp
);
309 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "BLUE_DEV", dev
);
310 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
311 sprintf(temp1
, "BLUE: %s (%s)\n", temp
, dev
);
312 strcat(message
, temp1
);
316 strcpy(driver
, ""); findkey(kv
, "ORANGE_DISPLAYDRIVER", driver
);
317 findnicdescription(driver
, temp
);
318 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "ORANGE_DEV", dev
);
319 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
320 sprintf(temp1
, "ORANGE: %s (%s)\n", temp
, dev
);
321 strcat(message
, temp1
);
325 strcpy(driver
, ""); findkey(kv
, "RED_DISPLAYDRIVER", driver
);
326 findnicdescription(driver
, temp
);
327 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "RED_DEV", dev
);
328 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
329 sprintf(temp1
, "RED: %s (%s)\n", temp
, dev
);
330 strcat(message
, temp1
);
332 strcat(message
, ctr
[TR_DO_YOU_WISH_TO_CHANGE_THESE_SETTINGS
]);
333 rc
= newtWinChoice(ctr
[TR_DRIVERS_AND_CARD_ASSIGNMENTS
], ctr
[TR_OK
],
334 ctr
[TR_CANCEL
], message
);
335 if (rc
== 0 || rc
== 1)
337 /* Shit, got to do something.. */
346 int changedrivers(void)
348 struct keyvalue
*kv
= initkeyvalues();
350 char temp
[STRING_SIZE
];
351 char driver
[STRING_SIZE
];
355 int needcards
, sofarallocated
, countofcards
, toallocate
;
356 char *orange
= "ORANGE";
361 char nexteth
[STRING_SIZE
];
363 char currentdriver
[STRING_SIZE
], currentdriveroptions
[STRING_SIZE
];
364 char displaydriver
[STRING_SIZE
];
367 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
370 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
374 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
375 configtype
= atol(temp
);
377 runcommandwithstatus("/etc/rc.d/init.d/network red down",
378 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
379 runcommandwithstatus("/etc/rc.d/init.d/network blue down",
380 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
381 runcommandwithstatus("/etc/rc.d/init.d/network orange down",
382 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
384 /* Remove all modules not needed for green networking. */
386 strcpy(driver
, ""); findkey(kv
, "GREEN_DRIVER", driver
);
387 if (strcmp(driver
, "pcmcia") != 0) {
388 stat("/proc/bus/pccard", &st
);
389 mysystem("/etc/rc.d/rc.pcmcia stop");
390 if (S_ISDIR(st
.st_mode
)) {
391 mysystem("/sbin/modprobe pcmcia_core");
392 mysystem("/sbin/modprobe pcmcia-controller");
393 mysystem("/sbin/modprobe ds");
396 while (nics
[c
].modulename
)
398 if (strcmp(nics
[c
].modulename
, driver
) != 0)
400 if (checkformodule(nics
[c
].modulename
))
402 sprintf(temp
, "/sbin/rmmod %s", nics
[c
].modulename
);
409 /* Blank them so the rc.netaddress.up does not get confused. */
410 replacekeyvalue(kv
, "ORANGE_DEV", "");
411 replacekeyvalue(kv
, "BLUE_DEV", "");
412 replacekeyvalue(kv
, "RED_DEV", "");
416 else if (configtype
== 1 || configtype
== 2 || configtype
== 4)
418 else if (configtype
== 7)
423 /* This is the green card. */
426 findkey(kv
, "GREEN_DRIVER", currentdriver
);
427 findkey(kv
, "GREEN_DRIVER_OPTIONS", currentdriveroptions
);
428 strcpy(displaydriver
, currentdriver
);
430 if (countcards() > 1)
431 strcpy(currentdriver
, "");
434 /* Keep going till all cards are got, or they give up. */
435 while (sofarallocated
< needcards
&& !abort
)
437 countofcards
= countcards();
439 /* This is how many cards were added by the last module. */
440 toallocate
= countofcards
- sofarallocated
;
441 while (toallocate
> 0 && sofarallocated
< needcards
)
443 findnicdescription(displaydriver
, temp
);
444 sprintf(message
, ctr
[TR_UNCLAIMED_DRIVER
], temp
);
446 strcpy(temp
, ""); findkey(kv
, "BLUE_DEV", temp
);
447 if (HAS_BLUE
&& !strlen(temp
))
452 strcpy(temp
, ""); findkey(kv
, "ORANGE_DEV", temp
);
453 if (HAS_ORANGE
&& !strlen(temp
))
455 sections
[c
] = orange
;
458 strcpy(temp
, ""); findkey(kv
, "RED_DEV", temp
);
459 if (HAS_RED
&& !strlen(temp
))
465 rc
= newtWinMenu(ctr
[TR_CARD_ASSIGNMENT
],
466 message
, 50, 5, 5, 6, sections
, &choice
, ctr
[TR_OK
],
467 ctr
[TR_CANCEL
], NULL
);
468 if (rc
== 0 || rc
== 1)
470 /* Now we see which iface needs its settings changed. */
471 sprintf(nexteth
, "eth%d", sofarallocated
);
472 if (strcmp(sections
[choice
], blue
) == 0)
474 replacekeyvalue(kv
, "BLUE_DEV", nexteth
);
475 replacekeyvalue(kv
, "BLUE_DRIVER", currentdriver
);
476 replacekeyvalue(kv
, "BLUE_DRIVER_OPTIONS", currentdriveroptions
);
477 replacekeyvalue(kv
, "BLUE_DISPLAYDRIVER", displaydriver
);
480 strcpy(currentdriver
, "");
481 strcpy(currentdriveroptions
, "");
483 if (strcmp(sections
[choice
], orange
) == 0)
485 replacekeyvalue(kv
, "ORANGE_DEV", nexteth
);
486 replacekeyvalue(kv
, "ORANGE_DRIVER", currentdriver
);
487 replacekeyvalue(kv
, "ORANGE_DRIVER_OPTIONS", currentdriveroptions
);
488 replacekeyvalue(kv
, "ORANGE_DISPLAYDRIVER", displaydriver
);
491 strcpy(currentdriver
, "");
492 strcpy(currentdriveroptions
, "");
494 if (strcmp(sections
[choice
], red
) == 0)
496 replacekeyvalue(kv
, "RED_DEV", nexteth
);
497 replacekeyvalue(kv
, "RED_DRIVER", currentdriver
);
498 replacekeyvalue(kv
, "RED_DRIVER_OPTIONS", currentdriveroptions
);
499 replacekeyvalue(kv
, "RED_DISPLAYDRIVER", displaydriver
);
502 strcpy(currentdriver
, "");
503 strcpy(currentdriveroptions
, "");
512 /* Need another module! The nitty gritty code is in libsmooth. */
513 if (sofarallocated
< needcards
)
515 rc
= newtWinTernary(ctr
[TR_CARD_ASSIGNMENT
], ctr
[TR_PROBE
],
516 ctr
[TR_SELECT
], ctr
[TR_CANCEL
], ctr
[TR_NO_UNALLOCATED_CARDS
]);
518 if (rc
== 0 || rc
== 1)
520 probecards(currentdriver
, currentdriveroptions
);
521 if (!strlen(currentdriver
))
522 errorbox(ctr
[TR_PROBE_FAILED
]);
525 choosecards(currentdriver
, currentdriveroptions
);
529 strcpy(displaydriver
, currentdriver
);
533 countofcards
= countcards();
535 if (countofcards
>= needcards
)
537 newtWinMessage(ctr
[TR_CARD_ASSIGNMENT
], ctr
[TR_OK
],
538 ctr
[TR_ALL_CARDS_SUCCESSFULLY_ALLOCATED
]);
541 errorbox(ctr
[TR_NOT_ENOUGH_CARDS_WERE_ALLOCATED
]);
543 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
547 netaddresschange
= 1;
552 /* Let user change GREEN address. */
553 int greenaddressmenu(void)
555 struct keyvalue
*kv
= initkeyvalues();
559 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
562 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
566 sprintf(message
, ctr
[TR_WARNING_LONG
], NAME
);
567 rc
= newtWinChoice(ctr
[TR_WARNING
], ctr
[TR_OK
], ctr
[TR_CANCEL
], message
);
569 if (rc
== 0 || rc
== 1)
571 if (changeaddress(kv
, "GREEN", 0, ""))
573 netaddresschange
= 1;
574 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
584 /* They can change BLUE, ORANGE and GREEN too :) */
585 int addressesmenu(void)
587 struct keyvalue
*kv
= initkeyvalues();
588 struct keyvalue
*mainkv
= initkeyvalues();
591 char *green
= "GREEN";
592 char *orange
= "ORANGE";
596 char greenaddress
[STRING_SIZE
];
597 char oldgreenaddress
[STRING_SIZE
];
598 char temp
[STRING_SIZE
];
599 char temp2
[STRING_SIZE
];
604 char hostname
[STRING_SIZE
];
606 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
609 freekeyvalues(mainkv
);
610 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
613 if (!(readkeyvalues(mainkv
, CONFIG_ROOT
"/main/settings")))
616 freekeyvalues(mainkv
);
617 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
621 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
622 configtype
= atol(temp
);
633 sections
[c
] = orange
;
647 rc
= newtWinMenu(ctr
[TR_ADDRESS_SETTINGS
],
648 ctr
[TR_SELECT_THE_INTERFACE_YOU_WISH_TO_RECONFIGURE
], 50, 5,
649 5, 6, sections
, &choice
, ctr
[TR_OK
], ctr
[TR_DONE
], NULL
);
651 if (rc
== 0 || rc
== 1)
653 if (strcmp(sections
[choice
], "GREEN") == 0)
655 findkey(kv
, "GREEN_ADDRESS", oldgreenaddress
);
656 sprintf(message
, ctr
[TR_WARNING_LONG
], NAME
);
657 rc
= newtWinChoice(ctr
[TR_WARNING
], ctr
[TR_OK
], ctr
[TR_CANCEL
],
659 if (rc
== 0 || rc
== 1)
661 if (changeaddress(kv
, "GREEN", 0, ""))
663 netaddresschange
= 1;
664 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
666 findkey(kv
, "GREEN_ADDRESS", greenaddress
);
667 snprintf(temp
, STRING_SIZE
-1, "option routers %s", oldgreenaddress
);
668 snprintf(temp2
, STRING_SIZE
-1, "option routers %s", greenaddress
);
669 replace (CONFIG_ROOT
"/dhcp/dhcpd.conf", temp
, temp2
);
670 chown (CONFIG_ROOT
"/dhcp/dhcpd.conf", 99, 99);
674 if (strcmp(sections
[choice
], "BLUE") == 0)
676 if (changeaddress(kv
, "BLUE", 0, ""))
677 netaddresschange
= 1;
679 if (strcmp(sections
[choice
], "ORANGE") == 0)
681 if (changeaddress(kv
, "ORANGE", 0, ""))
682 netaddresschange
= 1;
684 if (strcmp(sections
[choice
], "RED") == 0)
686 strcpy(hostname
, "");
687 findkey(mainkv
, "HOSTNAME", hostname
);
688 if (changeaddress(kv
, "RED", 1, hostname
))
689 netaddresschange
= 1;
696 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
698 freekeyvalues(mainkv
);
703 /* DNS and default gateway.... */
704 int dnsgatewaymenu(void)
706 struct keyvalue
*kv
= initkeyvalues();
708 char temp
[STRING_SIZE
] = "0";
709 struct newtWinEntry entries
[DNSGATEWAY_TOTAL
+1];
710 char *values
[DNSGATEWAY_TOTAL
]; /* pointers for the values. */
715 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
718 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
722 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
723 configtype
= atol(temp
);
728 errorbox(ctr
[TR_DNS_GATEWAY_WITH_GREEN
]);
732 entries
[DNS1
].text
= ctr
[TR_PRIMARY_DNS
];
733 strcpy(temp
, ""); findkey(kv
, "DNS1", temp
);
734 values
[DNS1
] = strdup(temp
);
735 entries
[DNS1
].value
= &values
[DNS1
];
736 entries
[DNS1
].flags
= 0;
738 entries
[DNS2
].text
= ctr
[TR_SECONDARY_DNS
];
739 strcpy(temp
, ""); findkey(kv
, "DNS2", temp
);
740 values
[DNS2
] = strdup(temp
);
741 entries
[DNS2
].value
= &values
[DNS2
];
742 entries
[DNS2
].flags
= 0;
744 entries
[DEFAULT_GATEWAY
].text
= ctr
[TR_DEFAULT_GATEWAY
];
745 strcpy(temp
, ""); findkey(kv
, "DEFAULT_GATEWAY", temp
);
746 values
[DEFAULT_GATEWAY
] = strdup(temp
);
747 entries
[DEFAULT_GATEWAY
].value
= &values
[DEFAULT_GATEWAY
];
748 entries
[DEFAULT_GATEWAY
].flags
= 0;
750 entries
[DNSGATEWAY_TOTAL
].text
= NULL
;
751 entries
[DNSGATEWAY_TOTAL
].value
= NULL
;
752 entries
[DNSGATEWAY_TOTAL
].flags
= 0;
758 rc
= newtWinEntries(ctr
[TR_DNS_AND_GATEWAY_SETTINGS
],
759 ctr
[TR_DNS_AND_GATEWAY_SETTINGS_LONG
], 50, 5, 5, 18, entries
,
760 ctr
[TR_OK
], ctr
[TR_CANCEL
], NULL
);
761 if (rc
== 0 || rc
== 1)
763 strcpy(message
, ctr
[TR_INVALID_FIELDS
]);
764 if (strlen(values
[DNS1
]))
766 if (inet_addr(values
[DNS1
]) == INADDR_NONE
)
768 strcat(message
, ctr
[TR_PRIMARY_DNS_CR
]);
772 if (strlen(values
[DNS2
]))
774 if (inet_addr(values
[DNS2
]) == INADDR_NONE
)
776 strcat(message
, ctr
[TR_SECONDARY_DNS_CR
]);
780 if (strlen(values
[DEFAULT_GATEWAY
]))
782 if (inet_addr(values
[DEFAULT_GATEWAY
]) == INADDR_NONE
)
784 strcat(message
, ctr
[TR_DEFAULT_GATEWAY_CR
]);
788 if (!strlen(values
[DNS1
]) && strlen(values
[DNS2
]))
790 strcpy(message
, ctr
[TR_SECONDARY_WITHOUT_PRIMARY_DNS
]);
798 replacekeyvalue(kv
, "DNS1", values
[DNS1
]);
799 replacekeyvalue(kv
, "DNS2", values
[DNS2
]);
800 replacekeyvalue(kv
, "DEFAULT_GATEWAY", values
[DEFAULT_GATEWAY
]);
801 netaddresschange
= 1;
804 free(values
[DEFAULT_GATEWAY
]);
805 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");