-/* SmoothWall setup program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence. See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * The big one: networking. \r
- * \r
- * $Id: networking.c,v 1.5.2.6 2006/02/06 22:00:13 gespinasse Exp $\r
- * \r
- */\r
- \r
-#include "setup.h"\r
-\r
-#define DNS1 0\r
-#define DNS2 1\r
-#define DEFAULT_GATEWAY 2\r
-#define DNSGATEWAY_TOTAL 3\r
-\r
-extern FILE *flog;\r
-extern char *mylog;\r
-\r
-extern char **ctr;\r
-\r
-extern int automode;\r
-\r
-#define HAS_ORANGE (configtype == 1 || configtype == 3 || configtype == 5 || configtype == 7)\r
-#define HAS_RED (configtype == 2 || configtype == 3 || configtype == 6 || configtype == 7)\r
-#define HAS_BLUE (configtype == 4 || configtype == 5 || configtype == 6 || configtype == 7)\r
-#define RED_IS_NOT_ETH (configtype == 0 || configtype == 1 || configtype == 4 || configtype == 5)\r
-\r
-extern struct nic nics[];\r
-\r
-char *configtypenames[] = { \r
- "GREEN (RED is modem/ISDN)", \r
- "GREEN + ORANGE (RED is modem/ISDN)", \r
- "GREEN + RED",\r
- "GREEN + ORANGE + RED", \r
- "GREEN + BLUE (RED is modem/ISDN) ",\r
- "GREEN + ORANGE + BLUE (RED is modem/ISDN)",\r
- "GREEN + BLUE + RED",\r
- "GREEN + ORANGE + BLUE + RED",\r
- NULL };\r
-int netaddresschange;\r
-\r
-int oktoleave(char *errormessage);\r
-int firstmenu(void);\r
-int configtypemenu(void);\r
-int drivermenu(void);\r
-int changedrivers(void);\r
-int greenaddressmenu(void);\r
-int addressesmenu(void);\r
-int dnsgatewaymenu(void);\r
-\r
-int handlenetworking(void)\r
-{\r
- int done;\r
- int choice;\r
- char errormessage[STRING_SIZE];\r
- \r
- netaddresschange = 0;\r
-\r
- done = 0;\r
- while (!done)\r
- {\r
- choice = firstmenu();\r
- \r
- switch (choice)\r
- {\r
- case 1:\r
- configtypemenu();\r
- break;\r
-\r
- case 2:\r
- drivermenu();\r
- break;\r
- \r
- case 3:\r
- addressesmenu();\r
- break;\r
- \r
- case 4:\r
- dnsgatewaymenu();\r
- break;\r
- \r
- case 0:\r
- if (oktoleave(errormessage))\r
- done = 1;\r
- else\r
- errorbox(errormessage);\r
- break;\r
- \r
- default:\r
- break;\r
- } \r
- }\r
-\r
- if (automode == 0)\r
- {\r
- /* Restart networking! */ \r
- if (netaddresschange)\r
- {\r
- runcommandwithstatus("/etc/rc.d/rc.netaddress.down",\r
- ctr[TR_PUSHING_NETWORK_DOWN]);\r
- runcommandwithstatus("/etc/rc.d/rc.netaddress.up",\r
- ctr[TR_PULLING_NETWORK_UP]);\r
- mysystem("/etc/rc.d/rc.pcmcia start");\r
- }\r
- }\r
- \r
- return 1;\r
-}\r
-\r
-int oktoleave(char *errormessage)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char temp[STRING_SIZE];\r
- int configtype;\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- } \r
-\r
- strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp); configtype = atol(temp);\r
- if (configtype < 0 || configtype > 7) configtype = 0;\r
-\r
- if (HAS_BLUE)\r
- {\r
- strcpy(temp, ""); findkey(kv, "BLUE_DEV", temp);\r
- if (!(strlen(temp)))\r
- {\r
- strcpy(errormessage, ctr[TR_NO_BLUE_INTERFACE]);\r
- goto EXIT;\r
- }\r
- if (!(interfacecheck(kv, "BLUE")))\r
- {\r
- strcpy(errormessage, ctr[TR_MISSING_BLUE_IP]);\r
- goto EXIT;\r
- }\r
- }\r
- if (HAS_ORANGE)\r
- {\r
- strcpy(temp, ""); findkey(kv, "ORANGE_DEV", temp);\r
- if (!(strlen(temp)))\r
- {\r
- strcpy(errormessage, ctr[TR_NO_ORANGE_INTERFACE]);\r
- goto EXIT;\r
- }\r
- if (!(interfacecheck(kv, "ORANGE")))\r
- {\r
- strcpy(errormessage, ctr[TR_MISSING_ORANGE_IP]);\r
- goto EXIT;\r
- }\r
- }\r
- if (HAS_RED)\r
- {\r
- strcpy(temp, ""); findkey(kv, "RED_DEV", temp);\r
- if (!(strlen(temp)))\r
- {\r
- strcpy(errormessage, ctr[TR_NO_RED_INTERFACE]);\r
- goto EXIT;\r
- }\r
- if (!(interfacecheck(kv, "RED")))\r
- {\r
- strcpy(errormessage, ctr[TR_MISSING_RED_IP]);\r
- goto EXIT;\r
- }\r
- }\r
- strcpy(errormessage, "");\r
-EXIT:\r
- freekeyvalues(kv);\r
- \r
- if (strlen(errormessage))\r
- return 0;\r
- else\r
- return 1;\r
-}\r
-\r
- \r
-/* Shows the main menu and a summary of the current settings. */\r
-int firstmenu(void)\r
-{\r
- char *sections[] = { ctr[TR_NETWORK_CONFIGURATION_TYPE],\r
- ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS],\r
- ctr[TR_ADDRESS_SETTINGS],\r
- ctr[TR_DNS_AND_GATEWAY_SETTINGS], NULL };\r
- int rc;\r
- static int choice = 0;\r
- struct keyvalue *kv = initkeyvalues();\r
- char message[1000];\r
- char temp[STRING_SIZE];\r
- int x;\r
- int result;\r
- char networkrestart[STRING_SIZE] = "";\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- } \r
-\r
- if (netaddresschange) \r
- strcpy(networkrestart, ctr[TR_RESTART_REQUIRED]);\r
-\r
- strcpy(temp, ""); findkey(kv, "CONFIG_TYPE", temp); x = atol(temp);\r
- if (x < 0 || x > 7) x = 0;\r
- /* Format heading bit. */\r
- snprintf(message, 1000, ctr[TR_CURRENT_CONFIG], configtypenames[x],\r
- networkrestart);\r
- rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_MENU], message, 50, 5, 5, 6,\r
- sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL);\r
-\r
- if (rc == 0 || rc == 1)\r
- result = choice + 1;\r
- else\r
- result = 0;\r
-\r
- return result;\r
-}\r
-\r
-/* Here they choose general network config, number of nics etc. */\r
-int configtypemenu(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char temp[STRING_SIZE] = "0";\r
- char message[1000];\r
- int choice;\r
- int rc;\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
- \r
- findkey(kv, "CONFIG_TYPE", temp); choice = atol(temp);\r
- sprintf(message, ctr[TR_NETWORK_CONFIGURATION_TYPE_LONG], NAME);\r
- rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_TYPE], message, 50, 5, 5,\r
- 6, configtypenames, &choice, ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
-\r
- if (rc == 0 || rc == 1)\r
- {\r
- runcommandwithstatus("/etc/rc.d/rc.netaddress.down NOTGREEN",\r
- ctr[TR_PUSHING_NON_LOCAL_NETWORK_DOWN]);\r
- \r
- sprintf(temp, "%d", choice);\r
- replacekeyvalue(kv, "CONFIG_TYPE", temp);\r
- replacekeyvalue(kv, "ORANGE_DEV", "");\r
- replacekeyvalue(kv, "BLUE_DEV", "");\r
- replacekeyvalue(kv, "RED_DEV", "");\r
- writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");\r
- netaddresschange = 1;\r
- }\r
- \r
- freekeyvalues(kv);\r
- \r
- return 0;\r
-}\r
-\r
-/* Driver menu. Choose drivers.. */\r
-int drivermenu(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char message[1000];\r
- char temp[STRING_SIZE], temp1[STRING_SIZE];\r
- char driver[STRING_SIZE], dev[STRING_SIZE];\r
- int configtype;\r
- int rc;\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp);\r
- configtype = atol(temp);\r
- \r
- if (configtype == 0)\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_YOUR_CONFIGURATION_IS_SINGLE_GREEN_ALREADY_HAS_DRIVER]);\r
- return 0;\r
- }\r
-\r
- strcpy(message, ctr[TR_CONFIGURE_NETWORK_DRIVERS]);\r
- \r
- /* This horrible big formats the heading :( */\r
- strcpy(driver, ""); findkey(kv, "GREEN_DISPLAYDRIVER", driver);\r
- findnicdescription(driver, temp);\r
- strcpy(dev, ctr[TR_UNSET]); findkey(kv, "GREEN_DEV", dev);\r
- if (!strlen(dev)) strcpy(dev, ctr[TR_UNSET]);\r
- sprintf(temp1, "GREEN: %s (%s)\n", temp, dev);\r
- strcat(message, temp1);\r
- if (HAS_BLUE)\r
- {\r
- strcpy(driver, ""); findkey(kv, "BLUE_DISPLAYDRIVER", driver);\r
- findnicdescription(driver, temp);\r
- strcpy(dev, ctr[TR_UNSET]); findkey(kv, "BLUE_DEV", dev);\r
- if (!strlen(dev)) strcpy(dev, ctr[TR_UNSET]);\r
- sprintf(temp1, "BLUE: %s (%s)\n", temp, dev);\r
- strcat(message, temp1);\r
- }\r
- if (HAS_ORANGE)\r
- {\r
- strcpy(driver, ""); findkey(kv, "ORANGE_DISPLAYDRIVER", driver);\r
- findnicdescription(driver, temp);\r
- strcpy(dev, ctr[TR_UNSET]); findkey(kv, "ORANGE_DEV", dev);\r
- if (!strlen(dev)) strcpy(dev, ctr[TR_UNSET]);\r
- sprintf(temp1, "ORANGE: %s (%s)\n", temp, dev);\r
- strcat(message, temp1);\r
- }\r
- if (HAS_RED)\r
- {\r
- strcpy(driver, ""); findkey(kv, "RED_DISPLAYDRIVER", driver);\r
- findnicdescription(driver, temp);\r
- strcpy(dev, ctr[TR_UNSET]); findkey(kv, "RED_DEV", dev);\r
- if (!strlen(dev)) strcpy(dev, ctr[TR_UNSET]);\r
- sprintf(temp1, "RED: %s (%s)\n", temp, dev);\r
- strcat(message, temp1);\r
- }\r
- strcat(message, ctr[TR_DO_YOU_WISH_TO_CHANGE_THESE_SETTINGS]);\r
- rc = newtWinChoice(ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS], ctr[TR_OK],\r
- ctr[TR_CANCEL], message);\r
- if (rc == 0 || rc == 1)\r
- {\r
- /* Shit, got to do something.. */\r
- changedrivers();\r
- }\r
- \r
- freekeyvalues(kv);\r
-\r
- return 1;\r
-}\r
-\r
-int changedrivers(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char message[1000];\r
- char temp[STRING_SIZE];\r
- char driver[STRING_SIZE];\r
- int configtype;\r
- int rc;\r
- int c;\r
- int needcards, sofarallocated, countofcards, toallocate;\r
- char *orange = "ORANGE";\r
- char *blue = "BLUE";\r
- char *red = "RED";\r
- char *sections[4];\r
- int choice;\r
- char nexteth[STRING_SIZE];\r
- int abort;\r
- char currentdriver[STRING_SIZE], currentdriveroptions[STRING_SIZE];\r
- char displaydriver[STRING_SIZE];\r
- struct stat st;\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp);\r
- configtype = atol(temp);\r
-\r
- runcommandwithstatus("/etc/rc.d/rc.netaddress.down NOTGREEN",\r
- ctr[TR_PUSHING_NON_LOCAL_NETWORK_DOWN]);\r
- \r
- /* Remove all modules not needed for green networking. */\r
- c = 0;\r
- strcpy(driver, ""); findkey(kv, "GREEN_DRIVER", driver);\r
- if (strcmp(driver, "pcmcia") != 0) {\r
- stat("/proc/bus/pccard", &st);\r
- mysystem("/etc/rc.d/rc.pcmcia stop");\r
- if (S_ISDIR(st.st_mode)) {\r
- mysystem("/sbin/modprobe pcmcia_core");\r
- mysystem("/sbin/modprobe pcmcia-controller");\r
- mysystem("/sbin/modprobe ds");\r
- }\r
- }\r
- while (nics[c].modulename)\r
- {\r
- if (strcmp(nics[c].modulename, driver) != 0)\r
- {\r
- if (checkformodule(nics[c].modulename))\r
- {\r
- sprintf(temp, "/sbin/rmmod %s", nics[c].modulename);\r
- mysystem(temp);\r
- }\r
- }\r
- c++;\r
- }\r
- \r
- /* Blank them so the rc.netaddress.up does not get confused. */\r
- replacekeyvalue(kv, "ORANGE_DEV", "");\r
- replacekeyvalue(kv, "BLUE_DEV", "");\r
- replacekeyvalue(kv, "RED_DEV", "");\r
- \r
- if (configtype == 0)\r
- needcards = 1;\r
- else if (configtype == 1 || configtype == 2 || configtype == 4)\r
- needcards = 2;\r
- else if (configtype == 7)\r
- needcards = 4;\r
- else\r
- needcards = 3;\r
-\r
- /* This is the green card. */ \r
- sofarallocated = 1;\r
-\r
- findkey(kv, "GREEN_DRIVER", currentdriver);\r
- findkey(kv, "GREEN_DRIVER_OPTIONS", currentdriveroptions);\r
- strcpy(displaydriver, currentdriver);\r
- \r
- if (countcards() > 1)\r
- strcpy(currentdriver, "");\r
- \r
- abort = 0;\r
- /* Keep going till all cards are got, or they give up. */\r
- while (sofarallocated < needcards && !abort)\r
- {\r
- countofcards = countcards();\r
-\r
- /* This is how many cards were added by the last module. */\r
- toallocate = countofcards - sofarallocated;\r
- while (toallocate > 0 && sofarallocated < needcards)\r
- {\r
- findnicdescription(displaydriver, temp);\r
- sprintf(message, ctr[TR_UNCLAIMED_DRIVER], temp);\r
- c = 0; choice = 0;\r
- strcpy(temp, ""); findkey(kv, "BLUE_DEV", temp);\r
- if (HAS_BLUE && !strlen(temp))\r
- {\r
- sections[c] = blue;\r
- c++;\r
- }\r
- strcpy(temp, ""); findkey(kv, "ORANGE_DEV", temp);\r
- if (HAS_ORANGE && !strlen(temp))\r
- {\r
- sections[c] = orange;\r
- c++;\r
- }\r
- strcpy(temp, ""); findkey(kv, "RED_DEV", temp); \r
- if (HAS_RED && !strlen(temp))\r
- {\r
- sections[c] = red;\r
- c++;\r
- }\r
- sections[c] = NULL;\r
- rc = newtWinMenu(ctr[TR_CARD_ASSIGNMENT],\r
- message, 50, 5, 5, 6, sections, &choice, ctr[TR_OK],\r
- ctr[TR_CANCEL], NULL); \r
- if (rc == 0 || rc == 1)\r
- {\r
- /* Now we see which iface needs its settings changed. */\r
- sprintf(nexteth, "eth%d", sofarallocated);\r
- if (strcmp(sections[choice], blue) == 0)\r
- {\r
- replacekeyvalue(kv, "BLUE_DEV", nexteth);\r
- replacekeyvalue(kv, "BLUE_DRIVER", currentdriver);\r
- replacekeyvalue(kv, "BLUE_DRIVER_OPTIONS", currentdriveroptions);\r
- replacekeyvalue(kv, "BLUE_DISPLAYDRIVER", displaydriver);\r
- sofarallocated++;\r
- toallocate--;\r
- strcpy(currentdriver, "");\r
- strcpy(currentdriveroptions, "");\r
- }\r
- if (strcmp(sections[choice], orange) == 0)\r
- {\r
- replacekeyvalue(kv, "ORANGE_DEV", nexteth);\r
- replacekeyvalue(kv, "ORANGE_DRIVER", currentdriver);\r
- replacekeyvalue(kv, "ORANGE_DRIVER_OPTIONS", currentdriveroptions);\r
- replacekeyvalue(kv, "ORANGE_DISPLAYDRIVER", displaydriver);\r
- sofarallocated++;\r
- toallocate--;\r
- strcpy(currentdriver, "");\r
- strcpy(currentdriveroptions, "");\r
- }\r
- if (strcmp(sections[choice], red) == 0)\r
- {\r
- replacekeyvalue(kv, "RED_DEV", nexteth);\r
- replacekeyvalue(kv, "RED_DRIVER", currentdriver);\r
- replacekeyvalue(kv, "RED_DRIVER_OPTIONS", currentdriveroptions);\r
- replacekeyvalue(kv, "RED_DISPLAYDRIVER", displaydriver);\r
- sofarallocated++;\r
- toallocate--;\r
- strcpy(currentdriver, "");\r
- strcpy(currentdriveroptions, "");\r
- }\r
- }\r
- else\r
- {\r
- break;\r
- }\r
- }\r
- \r
- /* Need another module! The nitty gritty code is in libsmooth. */\r
- if (sofarallocated < needcards)\r
- {\r
- rc = newtWinTernary(ctr[TR_CARD_ASSIGNMENT], ctr[TR_PROBE], \r
- ctr[TR_SELECT], ctr[TR_CANCEL], ctr[TR_NO_UNALLOCATED_CARDS]);\r
- \r
- if (rc == 0 || rc == 1)\r
- {\r
- probecards(currentdriver, currentdriveroptions);\r
- if (!strlen(currentdriver))\r
- errorbox(ctr[TR_PROBE_FAILED]);\r
- } \r
- else if (rc == 2)\r
- choosecards(currentdriver, currentdriveroptions);\r
- else\r
- abort = 1;\r
- \r
- strcpy(displaydriver, currentdriver);\r
- }\r
- }\r
- \r
- countofcards = countcards();\r
-\r
- if (countofcards >= needcards)\r
- {\r
- newtWinMessage(ctr[TR_CARD_ASSIGNMENT], ctr[TR_OK],\r
- ctr[TR_ALL_CARDS_SUCCESSFULLY_ALLOCATED]);\r
- }\r
- else\r
- errorbox(ctr[TR_NOT_ENOUGH_CARDS_WERE_ALLOCATED]);\r
- \r
- writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");\r
-\r
- freekeyvalues(kv);\r
-\r
- netaddresschange = 1;\r
- \r
- return 1;\r
-}\r
-\r
-/* Let user change GREEN address. */\r
-int greenaddressmenu(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char message[1000];\r
- int rc;\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- sprintf(message, ctr[TR_WARNING_LONG], NAME);\r
- rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL], message);\r
- \r
- if (rc == 0 || rc == 1)\r
- {\r
- if (changeaddress(kv, "GREEN", 0, ""))\r
- {\r
- netaddresschange = 1;\r
- writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings"); \r
- writehostsfiles(); \r
- }\r
- }\r
- \r
- freekeyvalues(kv);\r
-\r
- return 0;\r
-}\r
-\r
-/* They can change BLUE, ORANGE and GREEN too :) */\r
-int addressesmenu(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- struct keyvalue *mainkv = initkeyvalues();\r
- int rc = 0;\r
- char *sections[5];\r
- char *green = "GREEN";\r
- char *orange = "ORANGE";\r
- char *blue = "BLUE";\r
- char *red = "RED";\r
- int c = 0;\r
- char greenaddress[STRING_SIZE];\r
- char oldgreenaddress[STRING_SIZE];\r
- char temp[STRING_SIZE];\r
- char temp2[STRING_SIZE];\r
- char message[1000];\r
- int configtype;\r
- int done;\r
- int choice;\r
- char hostname[STRING_SIZE];\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- freekeyvalues(mainkv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
- if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))\r
- {\r
- freekeyvalues(kv);\r
- freekeyvalues(mainkv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp);\r
- configtype = atol(temp);\r
- \r
- sections[c] = green;\r
- c++;\r
- if (HAS_BLUE)\r
- {\r
- sections[c] = blue;\r
- c++;\r
- }\r
- if (HAS_ORANGE)\r
- {\r
- sections[c] = orange;\r
- c++;\r
- }\r
- if (HAS_RED)\r
- {\r
- sections[c] = red;\r
- c++;\r
- }\r
- sections[c] = NULL;\r
-\r
- choice = 0; \r
- done = 0; \r
- while (!done)\r
- {\r
- rc = newtWinMenu(ctr[TR_ADDRESS_SETTINGS],\r
- ctr[TR_SELECT_THE_INTERFACE_YOU_WISH_TO_RECONFIGURE], 50, 5,\r
- 5, 6, sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL); \r
-\r
- if (rc == 0 || rc == 1)\r
- {\r
- if (strcmp(sections[choice], "GREEN") == 0)\r
- {\r
- findkey(kv, "GREEN_ADDRESS", oldgreenaddress);\r
- sprintf(message, ctr[TR_WARNING_LONG], NAME);\r
- rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL],\r
- message);\r
- if (rc == 0 || rc == 1)\r
- {\r
- if (changeaddress(kv, "GREEN", 0, ""))\r
- {\r
- netaddresschange = 1;\r
- writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");\r
- writehostsfiles();\r
- findkey(kv, "GREEN_ADDRESS", greenaddress);\r
- snprintf(temp, STRING_SIZE-1, "option routers %s", oldgreenaddress);\r
- snprintf(temp2, STRING_SIZE-1, "option routers %s", greenaddress);\r
- replace (CONFIG_ROOT "/dhcp/dhcpd.conf", temp, temp2);\r
- chown (CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);\r
- }\r
- }\r
- }\r
- if (strcmp(sections[choice], "BLUE") == 0)\r
- {\r
- if (changeaddress(kv, "BLUE", 0, ""))\r
- netaddresschange = 1;\r
- }\r
- if (strcmp(sections[choice], "ORANGE") == 0)\r
- {\r
- if (changeaddress(kv, "ORANGE", 0, ""))\r
- netaddresschange = 1;\r
- }\r
- if (strcmp(sections[choice], "RED") == 0)\r
- {\r
- strcpy(hostname, "");\r
- findkey(mainkv, "HOSTNAME", hostname);\r
- if (changeaddress(kv, "RED", 1, hostname))\r
- netaddresschange = 1;\r
- }\r
- }\r
- else\r
- done = 1;\r
- }\r
- \r
- writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");\r
- freekeyvalues(kv);\r
- freekeyvalues(mainkv);\r
- \r
- return 0;\r
-}\r
-\r
-/* DNS and default gateway.... */\r
-int dnsgatewaymenu(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char message[1000];\r
- char temp[STRING_SIZE] = "0";\r
- struct newtWinEntry entries[DNSGATEWAY_TOTAL+1];\r
- char *values[DNSGATEWAY_TOTAL]; /* pointers for the values. */\r
- int error;\r
- int configtype;\r
- int rc;\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp);\r
- configtype = atol(temp);\r
- \r
- if (RED_IS_NOT_ETH)\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_DNS_GATEWAY_WITH_GREEN]);\r
- return 0;\r
- }\r
-\r
- entries[DNS1].text = ctr[TR_PRIMARY_DNS];\r
- strcpy(temp, ""); findkey(kv, "DNS1", temp);\r
- values[DNS1] = strdup(temp);\r
- entries[DNS1].value = &values[DNS1];\r
- entries[DNS1].flags = 0;\r
- \r
- entries[DNS2].text = ctr[TR_SECONDARY_DNS];\r
- strcpy(temp, ""); findkey(kv, "DNS2", temp);\r
- values[DNS2] = strdup(temp);\r
- entries[DNS2].value = &values[DNS2];\r
- entries[DNS2].flags = 0;\r
- \r
- entries[DEFAULT_GATEWAY].text = ctr[TR_DEFAULT_GATEWAY];\r
- strcpy(temp, ""); findkey(kv, "DEFAULT_GATEWAY", temp);\r
- values[DEFAULT_GATEWAY] = strdup(temp);\r
- entries[DEFAULT_GATEWAY].value = &values[DEFAULT_GATEWAY];\r
- entries[DEFAULT_GATEWAY].flags = 0;\r
- \r
- entries[DNSGATEWAY_TOTAL].text = NULL;\r
- entries[DNSGATEWAY_TOTAL].value = NULL;\r
- entries[DNSGATEWAY_TOTAL].flags = 0;\r
- \r
- do\r
- {\r
- error = 0;\r
- \r
- rc = newtWinEntries(ctr[TR_DNS_AND_GATEWAY_SETTINGS], \r
- ctr[TR_DNS_AND_GATEWAY_SETTINGS_LONG], 50, 5, 5, 18, entries,\r
- ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
- if (rc == 0 || rc == 1)\r
- {\r
- strcpy(message, ctr[TR_INVALID_FIELDS]);\r
- if (strlen(values[DNS1]))\r
- {\r
- if (inet_addr(values[DNS1]) == INADDR_NONE)\r
- {\r
- strcat(message, ctr[TR_PRIMARY_DNS_CR]);\r
- error = 1;\r
- }\r
- }\r
- if (strlen(values[DNS2]))\r
- {\r
- if (inet_addr(values[DNS2]) == INADDR_NONE)\r
- {\r
- strcat(message, ctr[TR_SECONDARY_DNS_CR]);\r
- error = 1;\r
- }\r
- }\r
- if (strlen(values[DEFAULT_GATEWAY]))\r
- {\r
- if (inet_addr(values[DEFAULT_GATEWAY]) == INADDR_NONE)\r
- {\r
- strcat(message, ctr[TR_DEFAULT_GATEWAY_CR]);\r
- error = 1;\r
- }\r
- }\r
- if (!strlen(values[DNS1]) && strlen(values[DNS2]))\r
- {\r
- strcpy(message, ctr[TR_SECONDARY_WITHOUT_PRIMARY_DNS]);\r
- error = 1;\r
- }\r
-\r
- if (error)\r
- errorbox(message);\r
- else\r
- {\r
- replacekeyvalue(kv, "DNS1", values[DNS1]);\r
- replacekeyvalue(kv, "DNS2", values[DNS2]);\r
- replacekeyvalue(kv, "DEFAULT_GATEWAY", values[DEFAULT_GATEWAY]);\r
- netaddresschange = 1;\r
- free(values[DNS1]);\r
- free(values[DNS2]);\r
- free(values[DEFAULT_GATEWAY]);\r
- writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");\r
- }\r
- }\r
- }\r
- while (error);\r
- \r
- freekeyvalues(kv);\r
- \r
- return 1;\r
-} \r
+/* SmoothWall setup program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence. See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * The big one: networking.
+ *
+ */
+
+#include "setup.h"
+
+#define DNS1 0
+#define DNS2 1
+#define DEFAULT_GATEWAY 2
+#define DNSGATEWAY_TOTAL 3
+
+extern FILE *flog;
+extern char *mylog;
+
+extern char **ctr;
+
+extern int automode;
+
+#define HAS_GREEN 1
+#define HAS_RED (configtype == 1 || configtype == 2 || configtype == 3 || configtype == 4)
+#define HAS_ORANGE (configtype == 2 || configtype == 4)
+#define HAS_BLUE (configtype == 3 || configtype == 4)
+#define RED_IS_NOT_ETH (configtype == 0)
+
+extern struct nic nics[];
+extern struct knic knics[];
+
+char *configtypenames[] = {
+ "GREEN + RED",
+ "GREEN + RED + ORANGE",
+ "GREEN + RED + BLUE",
+ "GREEN + RED + ORANGE + BLUE",
+ NULL };
+int configtypecards[] = {
+ 2, // "GREEN + RED",
+ 3, // "GREEN + RED + ORANGE",
+ 3, // "GREEN + RED + BLUE",
+ 4 // "GREEN + RED + ORANGE + BLUE",
+};
+
+
+int netaddresschange;
+
+int oktoleave(void);
+int firstmenu(void);
+int configtypemenu(void);
+int drivermenu(void);
+int changedrivers(void);
+int greenaddressmenu(void);
+int addressesmenu(void);
+int dnsgatewaymenu(void);
+
+int handlenetworking(void)
+{
+ int done;
+ int choice;
+ int found;
+
+ netaddresschange = 0;
+
+ found = scan_network_cards();
+ found = init_knics();
+
+ done = 0;
+ while (!done)
+ {
+ choice = firstmenu();
+
+ switch (choice)
+ {
+ case 1:
+ configtypemenu();
+ break;
+
+ case 2:
+ drivermenu();
+ break;
+
+ case 3:
+ addressesmenu();
+ break;
+
+ case 4:
+ dnsgatewaymenu();
+ break;
+
+ case 0:
+ if (oktoleave()) done = 1;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (automode == 0)
+ {
+ /* Restart networking! */
+ if (netaddresschange)
+ {
+ runcommandwithstatus("/etc/rc.d/init.d/network stop",
+ ctr[TR_PUSHING_NETWORK_DOWN]);
+
+ rename_nics();
+
+ runcommandwithstatus("/etc/rc.d/init.d/network start",
+ ctr[TR_PULLING_NETWORK_UP]);
+ }
+ }
+ create_udev();
+ return 1;
+}
+
+int oktoleave(void)
+{
+ struct keyvalue *kv = initkeyvalues();
+ char temp[STRING_SIZE];
+ int configtype;
+ int rc;
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ strcpy(temp, "1"); findkey(kv, "CONFIG_TYPE", temp); configtype = atol(temp);
+ if (configtype < 1 || configtype > 4) configtype = 1;
+
+ if (HAS_GREEN)
+ {
+ strcpy(temp, ""); findkey(kv, "GREEN_DEV", temp);
+ if (!(strlen(temp)))
+ {
+ errorbox(ctr[TR_NO_GREEN_INTERFACE]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ if (!(interfacecheck(kv, "GREEN")))
+ {
+ errorbox(ctr[TR_MISSING_GREEN_IP]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ }
+ if (HAS_RED)
+ {
+
+ strcpy(temp, ""); findkey(kv, "RED_DEV", temp);
+ if (!(strlen(temp)))
+ {
+ rc = newtWinChoice(ctr[TR_ERROR], ctr[TR_OK], ctr[TR_IGNORE], ctr[TR_NO_RED_INTERFACE]);
+ if (rc == 0 || rc == 1)
+ {
+ freekeyvalues(kv);
+ return 0;
+ }
+ }
+ if (!(interfacecheck(kv, "RED")))
+ {
+ errorbox(ctr[TR_MISSING_RED_IP]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ }
+ if (HAS_ORANGE)
+ {
+ strcpy(temp, ""); findkey(kv, "ORANGE_DEV", temp);
+ if (!(strlen(temp)))
+ {
+ errorbox(ctr[TR_NO_ORANGE_INTERFACE]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ if (!(interfacecheck(kv, "ORANGE")))
+ {
+ errorbox(ctr[TR_MISSING_ORANGE_IP]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ }
+ if (HAS_BLUE)
+ {
+ strcpy(temp, ""); findkey(kv, "BLUE_DEV", temp);
+ if (!(strlen(temp)))
+ {
+ errorbox(ctr[TR_NO_BLUE_INTERFACE]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ if (!(interfacecheck(kv, "BLUE")))
+ {
+ errorbox(ctr[TR_MISSING_BLUE_IP]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ }
+
+ strcpy(temp, ""); findkey(kv, "RED_TYPE", temp);
+ if ((configtype == 0) || (strcmp(temp, "STATIC") == 0))
+ {
+ strcpy(temp, ""); findkey(kv, "DNS1", temp);
+ if (!(strlen(temp)))
+ {
+ errorbox(ctr[TR_MISSING_DNS]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ strcpy(temp, ""); findkey(kv, "DEFAULT_GATEWAY", temp);
+ if (!(strlen(temp)))
+ {
+ errorbox(ctr[TR_MISSING_DEFAULT]);
+ freekeyvalues(kv);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+
+/* Shows the main menu and a summary of the current settings. */
+int firstmenu(void)
+{
+ char *sections[] = { ctr[TR_NETWORK_CONFIGURATION_TYPE],
+ ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS],
+ ctr[TR_ADDRESS_SETTINGS],
+ ctr[TR_DNS_AND_GATEWAY_SETTINGS], NULL };
+ int rc;
+ static int choice = 0;
+ struct keyvalue *kv = initkeyvalues();
+ char message[1000];
+ char temp[STRING_SIZE] = "1";
+ int x;
+ int result;
+ char networkrestart[STRING_SIZE] = "";
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ if (netaddresschange)
+ strcpy(networkrestart, ctr[TR_RESTART_REQUIRED]);
+
+ strcpy(temp, ""); findkey(kv, "CONFIG_TYPE", temp);
+ x = atol(temp);
+ x--;
+ if (x < 0 || x > 4) x = 0;
+ /* Format heading bit. */
+ snprintf(message, 1000, ctr[TR_CURRENT_CONFIG], configtypenames[x],
+ networkrestart);
+ rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_MENU], message, 50, 5, 5, 6,
+ sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL);
+
+ if (rc == 0 || rc == 1)
+ result = choice + 1;
+ else
+ result = 0;
+
+ return result;
+}
+
+/* Here they choose general network config, number of nics etc. */
+int configtypemenu(void)
+{
+ struct keyvalue *kv = initkeyvalues();
+ char temp[STRING_SIZE] = "1";
+ char message[1000];
+ int choise, found;
+ int rc, configtype;
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ found = scan_network_cards();
+
+ findkey(kv, "CONFIG_TYPE", temp); choise = atol(temp);
+ choise--;
+
+ sprintf(message, ctr[TR_NETWORK_CONFIGURATION_TYPE_LONG], NAME);
+ rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_TYPE], message, 50, 5, 5,
+ 6, configtypenames, &choise, ctr[TR_OK], ctr[TR_CANCEL], NULL);
+ if ( configtypecards[choise] > found ) {
+ sprintf(message, ctr[TR_NOT_ENOUGH_INTERFACES] , configtypecards[choise], found);
+ errorbox(message);
+ }
+
+ if (rc == 0 || rc == 1)
+ {
+ choise++;
+ sprintf(temp, "%d", choise);
+ replacekeyvalue(kv, "CONFIG_TYPE", temp);
+ configtype = atol(temp);
+ if (!HAS_RED)
+ clear_card_entry(_RED_CARD_);
+ if (!HAS_ORANGE)
+ clear_card_entry(_ORANGE_CARD_);
+ if (!HAS_BLUE)
+ clear_card_entry(_BLUE_CARD_);
+
+ writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
+ netaddresschange = 1;
+ }
+ freekeyvalues(kv);
+
+ return 0;
+}
+
+/* Driver menu. Choose drivers.. */
+int drivermenu(void)
+{
+ struct keyvalue *kv = initkeyvalues();
+ char message[STRING_SIZE];
+ char temp[STRING_SIZE] = "1";
+
+ int configtype;
+ int i, rc, kcount = 0, neednics;
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ if (findkey(kv, "CONFIG_TYPE", temp))
+ configtype = atol(temp);
+ else {
+ fprintf(flog,"setting CONFIG_TYPE = %s\n",temp);
+ configtype = atol(temp);
+ replacekeyvalue(kv, "CONFIG_TYPE", temp);
+ writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
+ }
+
+ strcpy(message, ctr[TR_CONFIGURE_NETWORK_DRIVERS]);
+
+ kcount = 0;
+ neednics = 0;
+ if (HAS_GREEN) {
+ sprintf(temp, "GREEN: %s\n", knics[_GREEN_CARD_].description);
+ strcat(message, temp);
+ if (strlen(knics[_GREEN_CARD_].macaddr) ) {
+ sprintf(temp, "GREEN: (%s) %s green0\n", knics[_GREEN_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ neednics++;
+ }
+ if (HAS_RED) {
+ sprintf(temp, "RED: %s\n", knics[_RED_CARD_].description);
+ strcat(message, temp);
+ if (strlen(knics[_RED_CARD_].macaddr) ) {
+ sprintf(temp, "RED: (%s) %s red0\n", knics[_RED_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ neednics++;
+ }
+ if (HAS_ORANGE) {
+ sprintf(temp, "ORANGE: %s\n", knics[_ORANGE_CARD_].description);
+ strcat(message, temp);
+ if ( strlen(knics[_ORANGE_CARD_].macaddr) ) {
+ sprintf(temp, "ORANGE: (%s) %s orange0\n", knics[_ORANGE_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ neednics++;
+ }
+ if (HAS_BLUE) {
+ sprintf(temp, "BLUE: %s\n", knics[_BLUE_CARD_].description);
+ strcat(message, temp);
+ if (strlen(knics[_BLUE_CARD_].macaddr)) {
+ sprintf(temp, "BLUE: (%s) %s blue0\n", knics[_BLUE_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ neednics++;
+ }
+
+ for ( i=0 ; i<4; i++)
+ if (strcmp(knics[i].macaddr, ""))
+ kcount++;
+
+ if (neednics = kcount)
+ {
+ strcat(message, ctr[TR_DO_YOU_WISH_TO_CHANGE_THESE_SETTINGS]);
+ rc = newtWinChoice(ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS], ctr[TR_OK],
+ ctr[TR_CANCEL], message);
+ if (rc == 0 || rc == 1)
+ {
+ changedrivers();
+ }
+ } else {
+ changedrivers();
+ }
+ freekeyvalues(kv);
+
+ return 1;
+}
+
+int set_menu_entry_for(int *nr, int *card)
+{
+
+}
+
+int changedrivers(void)
+{
+ struct keyvalue *kv = initkeyvalues();
+ char temp[STRING_SIZE], message[STRING_SIZE];
+ int configtype;
+ int green = 0, red = 0, blue = 0, orange = 0;
+ char MenuInhalt[10][180];
+ char *pMenuInhalt[10];
+ int count = 0, choise = 0, rc;
+ int NicEntry[10];
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+ if (automode == 0)
+ runcommandwithstatus("/etc/rc.d/init.d/network stop red blue orange",
+ ctr[TR_PUSHING_NON_LOCAL_NETWORK_DOWN]);
+
+ findkey(kv, "CONFIG_TYPE", temp); configtype = atol(temp);
+ if (configtype == 1)
+ { green = 1; red = 1; }
+ else if (configtype == 2)
+ { green = 1; red = 1; orange = 1; }
+ else if (configtype == 3)
+ { green = 1; red = 1; blue = 1; }
+ else if (configtype == 4)
+ { green = 1; red=1; orange=1; blue = 1; }
+ else if (configtype == "")
+ { green = 1; red = 1; }
+
+ do
+ {
+ count = 0;
+ strcpy(message, ctr[TR_INTERFACE_CHANGE]);
+
+ if (green) {
+ strcpy(MenuInhalt[count], "GREEN");
+ pMenuInhalt[count] = MenuInhalt[count];
+ NicEntry[_GREEN_CARD_] = count;
+ sprintf(temp, "GREEN: %s\n", knics[_GREEN_CARD_].description);
+ strcat(message, temp);
+ if ( strlen(knics[_GREEN_CARD_].macaddr) ) {
+ sprintf(temp, "GREEN: (%s) %s green0\n", knics[_GREEN_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ count++;
+ }
+
+ if (red) {
+ strcpy(MenuInhalt[count], "RED");
+ pMenuInhalt[count] = MenuInhalt[count];
+ NicEntry[_RED_CARD_] = count;
+ sprintf(temp, "RED: %s\n", knics[_RED_CARD_].description);
+ strcat(message, temp);
+ if ( strlen(knics[_RED_CARD_].macaddr) ) {
+ sprintf(temp, "RED: (%s) %s red0\n", knics[_RED_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ count++;
+ }
+
+ if (orange) {
+ strcpy(MenuInhalt[count], "ORANGE");
+ pMenuInhalt[count] = MenuInhalt[count];
+ NicEntry[_ORANGE_CARD_] = count;
+ sprintf(temp, "ORANGE: %s\n", knics[_ORANGE_CARD_].description);
+ strcat(message, temp);
+ if ( strlen(knics[_ORANGE_CARD_].macaddr) ) {
+ sprintf(temp, "ORANGE: (%s) %s orange0\n", knics[_ORANGE_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ count++;
+ }
+
+ if (blue) {
+ strcpy(MenuInhalt[count], "BLUE");
+ pMenuInhalt[count] = MenuInhalt[count];
+ NicEntry[_BLUE_CARD_] = count;
+ sprintf(temp, "BLUE: %s\n", knics[_BLUE_CARD_].description);
+ strcat(message, temp);
+ if ( strlen(knics[_BLUE_CARD_].macaddr) ) {
+ sprintf(temp, "BLUE: (%s) %s blue0\n", knics[_BLUE_CARD_].macaddr, ctr[TR_AS]);
+ strcat(message, temp);
+ }
+ count++;
+ }
+ pMenuInhalt[count] = NULL;
+
+ rc = newtWinMenu( ctr[TR_NETCARD_COLOR], message, 70, 5, 5, 6, pMenuInhalt, &choise, ctr[TR_SELECT], ctr[TR_REMOVE], ctr[TR_DONE], NULL);
+
+ if ( rc == 0 || rc == 1) {
+ if ((green) && ( choise == NicEntry[0])) nicmenu(_GREEN_CARD_);
+ if ((red) && ( choise == NicEntry[1])) nicmenu(_RED_CARD_);
+ if ((orange) && ( choise == NicEntry[2])) nicmenu(_ORANGE_CARD_);
+ if ((blue) && ( choise == NicEntry[3])) nicmenu(_BLUE_CARD_);
+ netaddresschange = 1;
+ } else if (rc == 2) {
+ if ((green) && ( choise == NicEntry[0])) ask_clear_card_entry(_GREEN_CARD_);
+ if ((red) && ( choise == NicEntry[1])) ask_clear_card_entry(_RED_CARD_);
+ if ((orange) && ( choise == NicEntry[2])) ask_clear_card_entry(_ORANGE_CARD_);
+ if ((blue) && ( choise == NicEntry[3])) ask_clear_card_entry(_BLUE_CARD_);
+ netaddresschange = 1;
+ }
+ }
+ while ( rc <= 2);
+
+ freekeyvalues(kv);
+ return 1;
+}
+
+// Let user change GREEN address.
+int greenaddressmenu(void)
+{
+ struct keyvalue *kv = initkeyvalues();
+ char message[1000];
+ int rc;
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ sprintf(message, ctr[TR_WARNING_LONG], NAME);
+ rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL], message);
+
+ if (rc == 0 || rc == 1)
+ {
+ if (changeaddress(kv, "GREEN", 0, ""))
+ {
+ netaddresschange = 1;
+ writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
+ writehostsfiles();
+ }
+ }
+
+ freekeyvalues(kv);
+
+ return 0;
+}
+
+// They can change BLUE, ORANGE and GREEN too :)
+int addressesmenu(void)
+{
+ struct keyvalue *kv = initkeyvalues();
+ struct keyvalue *mainkv = initkeyvalues();
+ int rc = 0;
+ char *sections[5];
+ char *green = "GREEN";
+ char *orange = "ORANGE";
+ char *blue = "BLUE";
+ char *red = "RED";
+ int c = 0;
+ char greenaddress[STRING_SIZE];
+ char oldgreenaddress[STRING_SIZE];
+ char temp[STRING_SIZE];
+ char temp2[STRING_SIZE];
+ char message[1000];
+ int configtype;
+ int done;
+ int choice;
+ char hostname[STRING_SIZE];
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ freekeyvalues(mainkv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+ if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))
+ {
+ freekeyvalues(kv);
+ freekeyvalues(mainkv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp);
+ configtype = atol(temp);
+
+ sections[c] = green;
+ c++;
+ if (HAS_BLUE)
+ {
+ sections[c] = blue;
+ c++;
+ }
+ if (HAS_ORANGE)
+ {
+ sections[c] = orange;
+ c++;
+ }
+ if (HAS_RED)
+ {
+ sections[c] = red;
+ c++;
+ }
+ sections[c] = NULL;
+
+ choice = 0;
+ done = 0;
+ while (!done)
+ {
+ rc = newtWinMenu(ctr[TR_ADDRESS_SETTINGS],
+ ctr[TR_SELECT_THE_INTERFACE_YOU_WISH_TO_RECONFIGURE], 50, 5,
+ 5, 6, sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL);
+
+ if (rc == 0 || rc == 1)
+ {
+ if (strcmp(sections[choice], "GREEN") == 0)
+ {
+ findkey(kv, "GREEN_ADDRESS", oldgreenaddress);
+ sprintf(message, ctr[TR_WARNING_LONG], NAME);
+ rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL],
+ message);
+ if (rc == 0 || rc == 1)
+ {
+ if (changeaddress(kv, "GREEN", 0, ""))
+ {
+ netaddresschange = 1;
+ writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
+ writehostsfiles();
+ findkey(kv, "GREEN_ADDRESS", greenaddress);
+ snprintf(temp, STRING_SIZE-1, "option routers %s", oldgreenaddress);
+ snprintf(temp2, STRING_SIZE-1, "option routers %s", greenaddress);
+ replace (CONFIG_ROOT "/dhcp/dhcpd.conf", temp, temp2);
+ chown (CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);
+ }
+ }
+ }
+ if (strcmp(sections[choice], "BLUE") == 0)
+ {
+ if (changeaddress(kv, "BLUE", 0, ""))
+ netaddresschange = 1;
+ }
+ if (strcmp(sections[choice], "ORANGE") == 0)
+ {
+ if (changeaddress(kv, "ORANGE", 0, ""))
+ netaddresschange = 1;
+ }
+ if (strcmp(sections[choice], "RED") == 0)
+ {
+ strcpy(hostname, "");
+ findkey(mainkv, "HOSTNAME", hostname);
+ if (changeaddress(kv, "RED", 1, hostname))
+ netaddresschange = 1;
+ }
+ }
+ else
+ done = 1;
+ }
+
+ writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
+ freekeyvalues(kv);
+ freekeyvalues(mainkv);
+
+ return 0;
+}
+
+/* DNS and default gateway.... */
+int dnsgatewaymenu(void)
+{
+ struct keyvalue *kv = initkeyvalues();
+ char message[1000];
+ char temp[STRING_SIZE] = "0";
+ struct newtWinEntry entries[DNSGATEWAY_TOTAL+1];
+ char *values[DNSGATEWAY_TOTAL]; /* pointers for the values. */
+ int error;
+ int configtype;
+ int rc;
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ entries[DNS1].text = ctr[TR_PRIMARY_DNS];
+ strcpy(temp, ""); findkey(kv, "DNS1", temp);
+ values[DNS1] = strdup(temp);
+ entries[DNS1].value = &values[DNS1];
+ entries[DNS1].flags = 0;
+
+ entries[DNS2].text = ctr[TR_SECONDARY_DNS];
+ strcpy(temp, ""); findkey(kv, "DNS2", temp);
+ values[DNS2] = strdup(temp);
+ entries[DNS2].value = &values[DNS2];
+ entries[DNS2].flags = 0;
+
+ entries[DEFAULT_GATEWAY].text = ctr[TR_DEFAULT_GATEWAY];
+ strcpy(temp, ""); findkey(kv, "DEFAULT_GATEWAY", temp);
+ values[DEFAULT_GATEWAY] = strdup(temp);
+ entries[DEFAULT_GATEWAY].value = &values[DEFAULT_GATEWAY];
+ entries[DEFAULT_GATEWAY].flags = 0;
+
+ entries[DNSGATEWAY_TOTAL].text = NULL;
+ entries[DNSGATEWAY_TOTAL].value = NULL;
+ entries[DNSGATEWAY_TOTAL].flags = 0;
+
+ do
+ {
+ error = 0;
+
+ rc = newtWinEntries(ctr[TR_DNS_AND_GATEWAY_SETTINGS],
+ ctr[TR_DNS_AND_GATEWAY_SETTINGS_LONG], 50, 5, 5, 18, entries,
+ ctr[TR_OK], ctr[TR_CANCEL], NULL);
+ if (rc == 0 || rc == 1)
+ {
+ strcpy(message, ctr[TR_INVALID_FIELDS]);
+ if (strlen(values[DNS1]))
+ {
+ if (inet_addr(values[DNS1]) == INADDR_NONE)
+ {
+ strcat(message, ctr[TR_PRIMARY_DNS_CR]);
+ error = 1;
+ }
+ }
+ if (strlen(values[DNS2]))
+ {
+ if (inet_addr(values[DNS2]) == INADDR_NONE)
+ {
+ strcat(message, ctr[TR_SECONDARY_DNS_CR]);
+ error = 1;
+ }
+ }
+ if (strlen(values[DEFAULT_GATEWAY]))
+ {
+ if (inet_addr(values[DEFAULT_GATEWAY]) == INADDR_NONE)
+ {
+ strcat(message, ctr[TR_DEFAULT_GATEWAY_CR]);
+ error = 1;
+ }
+ }
+ if (!strlen(values[DNS1]) && strlen(values[DNS2]))
+ {
+ strcpy(message, ctr[TR_SECONDARY_WITHOUT_PRIMARY_DNS]);
+ error = 1;
+ }
+
+ if (error)
+ errorbox(message);
+ else
+ {
+ replacekeyvalue(kv, "DNS1", values[DNS1]);
+ replacekeyvalue(kv, "DNS2", values[DNS2]);
+ replacekeyvalue(kv, "DEFAULT_GATEWAY", values[DEFAULT_GATEWAY]);
+ netaddresschange = 1;
+ free(values[DNS1]);
+ free(values[DNS2]);
+ free(values[DEFAULT_GATEWAY]);
+ writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
+ }
+ }
+ }
+ while (error);
+
+ freekeyvalues(kv);
+
+ return 1;
+}