-/* 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
- * Stuff for setting up the DHCP server from the setup prog.\r
- * \r
- * $Id: dhcp.c,v 1.9.2.3 2004/12/03 06:46:50 eoberlander Exp $\r
- * \r
- */\r
- \r
-#include "setup.h"\r
-\r
-#define TOP 4\r
-\r
-#define START_ADDRESS 0\r
-#define END_ADDRESS 1\r
-#define PRIMARY_DNS 2\r
-#define SECONDARY_DNS 3\r
-#define DEFAULT_LEASE_TIME 4\r
-#define MAX_LEASE_TIME 5\r
-#define DOMAIN_NAME_SUFFIX 6\r
-#define MAX_BOXES 7\r
-\r
-extern FILE *flog;\r
-extern char *mylog;\r
-\r
-extern char **ctr;\r
-\r
-extern int automode;\r
-\r
-newtComponent dhcpform;\r
-newtComponent entries[MAX_BOXES];\r
-newtComponent enabledcheckbox;\r
-\r
-void dhcpdialogcallbackdhcp(newtComponent cm, void *data);\r
-\r
-int handledhcp(void)\r
-{\r
- char *results[MAX_BOXES];\r
- char enabledresult;\r
- char startenabled;\r
- struct newtExitStruct es;\r
- newtComponent header;\r
- newtComponent labels[MAX_BOXES];\r
- newtComponent ok, cancel; \r
- char message[1000];\r
- char *labeltexts[MAX_BOXES] = { ctr[TR_START_ADDRESS], ctr[TR_END_ADDRESS],\r
- ctr[TR_PRIMARY_DNS], ctr[TR_SECONDARY_DNS], ctr[TR_DEFAULT_LEASE],\r
- ctr[TR_MAX_LEASE], ctr[TR_DOMAIN_NAME_SUFFIX] };\r
- char *varnames[MAX_BOXES] = { "START_ADDR_GREEN", "END_ADDR_GREEN", \r
- "DNS1_GREEN", "DNS2_GREEN",\r
- "DEFAULT_LEASE_TIME_GREEN", "MAX_LEASE_TIME_GREEN", \r
- "DOMAIN_NAME_GREEN"};\r
- char defaults[MAX_BOXES][STRING_SIZE]; \r
- int result;\r
- int c;\r
- char temp[STRING_SIZE];\r
- struct keyvalue *mainkv = initkeyvalues();\r
- struct keyvalue *dhcpkv = initkeyvalues();\r
- struct keyvalue *ethernetkv = initkeyvalues();\r
- int error;\r
- FILE *file;\r
- char greenaddress[STRING_SIZE]; \r
- char greennetaddress[STRING_SIZE];\r
- char greennetmask[STRING_SIZE];\r
- \r
- memset(defaults, 0, sizeof(char) * STRING_SIZE * MAX_BOXES);\r
- \r
- if (!(readkeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings")))\r
- {\r
- freekeyvalues(dhcpkv);\r
- freekeyvalues(ethernetkv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
- if (!(readkeyvalues(ethernetkv, CONFIG_ROOT "/ethernet/settings")))\r
- {\r
- freekeyvalues(dhcpkv);\r
- freekeyvalues(ethernetkv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
- if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))\r
- {\r
- freekeyvalues(dhcpkv);\r
- freekeyvalues(ethernetkv);\r
- freekeyvalues(mainkv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- /* Set default values. */ \r
- findkey(ethernetkv, "GREEN_ADDRESS", defaults[PRIMARY_DNS]);\r
- findkey(mainkv, "DOMAINNAME", defaults[DOMAIN_NAME_SUFFIX]);\r
- strcpy(defaults[DEFAULT_LEASE_TIME], "60");\r
- strcpy(defaults[MAX_LEASE_TIME], "120");\r
-\r
- sprintf(message, ctr[TR_DHCP_SERVER_CONFIGURATION]);\r
- newtCenteredWindow(55, 18, message);\r
-\r
- dhcpform = newtForm(NULL, NULL, 0);\r
- \r
- sprintf(message, ctr[TR_CONFIGURE_DHCP]);\r
- header = newtTextboxReflowed(1, 1, message, 52, 0, 0, 0);\r
- newtFormAddComponent(dhcpform, header);\r
-\r
- strcpy(temp, ""); findkey(dhcpkv, "ENABLE_GREEN", temp);\r
- if (strcmp(temp, "on") == 0)\r
- startenabled = '*';\r
- else\r
- startenabled = ' ';\r
- enabledcheckbox = newtCheckbox(2, TOP + 0, ctr[TR_ENABLED], startenabled, " *", &enabledresult);\r
- newtFormAddComponent(dhcpform, enabledcheckbox);\r
- newtComponentAddCallback(enabledcheckbox, dhcpdialogcallbackdhcp, NULL); \r
-\r
- for (c = 0; c < MAX_BOXES; c++)\r
- {\r
- labels[c] = newtTextbox(2, TOP + 2 + c, 33, 1, 0);\r
- newtTextboxSetText(labels[c], labeltexts[c]);\r
- newtFormAddComponent(dhcpform, labels[c]); \r
- strcpy(temp, defaults[c]); findkey(dhcpkv, varnames[c], temp);\r
- entries[c] = newtEntry(34, TOP + 2 + c, temp, 18, &results[c], 0);\r
- newtFormAddComponent(dhcpform, entries[c]); \r
- if (startenabled == ' ')\r
- newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_SET); \r
- \r
- }\r
- \r
- ok = newtButton(10, c + 7, ctr[TR_OK]);\r
- cancel = newtButton(34, c + 7, ctr[TR_CANCEL]);\r
-\r
- newtFormAddComponents(dhcpform, ok, cancel, NULL);\r
- \r
- do\r
- {\r
- error = 0;\r
- newtFormRun(dhcpform, &es);\r
- \r
- if (es.u.co == ok)\r
- {\r
- /* OK was pressed; verify the contents of each entry. */ \r
- if (enabledresult == '*')\r
- {\r
- strcpy(message, ctr[TR_INVALID_FIELDS]); \r
- if (inet_addr(results[START_ADDRESS]) == INADDR_NONE)\r
- {\r
- strcat(message, ctr[TR_START_ADDRESS_CR]);\r
- error = 1;\r
- }\r
- if (inet_addr(results[END_ADDRESS]) == INADDR_NONE)\r
- {\r
- strcat(message, ctr[TR_END_ADDRESS_CR]);\r
- error = 1;\r
- }\r
- if (strlen(results[SECONDARY_DNS]))\r
- {\r
- if (inet_addr(results[PRIMARY_DNS]) == INADDR_NONE)\r
- {\r
- strcat(message, ctr[TR_PRIMARY_DNS_CR]);\r
- error = 1;\r
- }\r
- }\r
- if (strlen(results[SECONDARY_DNS]))\r
- {\r
- if (inet_addr(results[SECONDARY_DNS]) == INADDR_NONE)\r
- {\r
- strcat(message, ctr[TR_SECONDARY_DNS_CR]);\r
- error = 1;\r
- }\r
- }\r
- if (!(atol(results[DEFAULT_LEASE_TIME])))\r
- {\r
- strcat(message, ctr[TR_DEFAULT_LEASE_CR]);\r
- error = 1;\r
- }\r
- if (!(atol(results[MAX_LEASE_TIME])))\r
- {\r
- strcat(message, ctr[TR_MAX_LEASE_CR]);\r
- error = 1;\r
- }\r
- } \r
- \r
- if (error)\r
- errorbox(message);\r
- else\r
- {\r
- for (c = 0; c < MAX_BOXES; c++)\r
- replacekeyvalue(dhcpkv, varnames[c], results[c]);\r
- if (enabledresult == '*')\r
- {\r
- replacekeyvalue(dhcpkv, "ENABLE_GREEN", "on");\r
- fclose(fopen(CONFIG_ROOT "/dhcp/enable_green", "w"));\r
- chown(CONFIG_ROOT "/dhcp/enable_green", 99, 99);\r
- }\r
- else\r
- {\r
- replacekeyvalue(dhcpkv, "ENABLE_GREEN", "off");\r
- unlink(CONFIG_ROOT "/dhcp/enable_green");\r
- }\r
- replacekeyvalue(dhcpkv, "VALID", "yes");\r
- writekeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings");\r
- \r
- findkey(ethernetkv, "GREEN_ADDRESS", greenaddress); \r
- findkey(ethernetkv, "GREEN_NETADDRESS", greennetaddress);\r
- findkey(ethernetkv, "GREEN_NETMASK", greennetmask);\r
- \r
- file = fopen(CONFIG_ROOT "/dhcp/dhcpd.conf", "w");\r
- fprintf(file, "ddns-update-style none;\n");\r
- fprintf(file, "subnet %s netmask %s\n", greennetaddress, greennetmask);\r
- fprintf(file, "{\n");\r
- fprintf(file, "\toption subnet-mask %s;\n", greennetmask);\r
- fprintf(file, "\toption domain-name \"%s\";\n", results[DOMAIN_NAME_SUFFIX]); \r
- fprintf(file, "\toption routers %s;\n", greenaddress);\r
- if (strlen(results[PRIMARY_DNS]))\r
- {\r
- fprintf(file, "\toption domain-name-servers ");\r
- fprintf(file, "%s", results[PRIMARY_DNS]);\r
- if (strlen(results[SECONDARY_DNS]))\r
- fprintf(file, ", %s", results[SECONDARY_DNS]);\r
- fprintf(file, ";\n");\r
- }\r
- \r
- fprintf(file, "\trange %s %s;\n", results[START_ADDRESS], results[END_ADDRESS]);\r
- fprintf(file, "\tdefault-lease-time %d;\n", (int) atol(results[DEFAULT_LEASE_TIME]) * 60);\r
- fprintf(file, "\tmax-lease-time %d;\n", (int) atol(results[MAX_LEASE_TIME]) * 60);\r
- fprintf(file, "}\n");\r
- fclose(file);\r
- chown(CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);\r
- if (automode == 0)\r
- mysystem("/usr/local/bin/restartdhcp");\r
- }\r
- result = 1;\r
- }\r
- else\r
- result = 0;\r
- } \r
- while (error);\r
- \r
- newtFormDestroy(dhcpform);\r
- newtPopWindow();\r
- \r
- freekeyvalues(dhcpkv);\r
- freekeyvalues(ethernetkv);\r
- freekeyvalues(mainkv);\r
- \r
- return result;\r
-}\r
-\r
-/* Called when enabled flag is toggled. Toggle disabled state of other 3\r
- * controls. */\r
-void dhcpdialogcallbackdhcp(newtComponent cm, void *data)\r
-{\r
- int c;\r
- \r
- for (c = 0; c < MAX_BOXES; c++)\r
- newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);\r
- \r
- newtRefresh();\r
- newtDrawForm(dhcpform); \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
+ * Stuff for setting up the DHCP server from the setup prog.
+ *
+ */
+
+#include "setup.h"
+
+#define TOP 4
+
+#define START_ADDRESS 0
+#define END_ADDRESS 1
+#define PRIMARY_DNS 2
+#define SECONDARY_DNS 3
+#define DEFAULT_LEASE_TIME 4
+#define MAX_LEASE_TIME 5
+#define DOMAIN_NAME_SUFFIX 6
+#define MAX_BOXES 7
+
+extern FILE *flog;
+extern char *mylog;
+
+extern char **ctr;
+
+extern int automode;
+
+newtComponent dhcpform;
+newtComponent entries[MAX_BOXES];
+newtComponent enabledcheckbox;
+
+void dhcpdialogcallbackdhcp(newtComponent cm, void *data);
+
+int handledhcp(void)
+{
+ char *results[MAX_BOXES];
+ char enabledresult;
+ char startenabled;
+ struct newtExitStruct es;
+ newtComponent header;
+ newtComponent labels[MAX_BOXES];
+ newtComponent ok, cancel;
+ char message[1000];
+ char *labeltexts[MAX_BOXES] = { ctr[TR_START_ADDRESS], ctr[TR_END_ADDRESS],
+ ctr[TR_PRIMARY_DNS], ctr[TR_SECONDARY_DNS], ctr[TR_DEFAULT_LEASE],
+ ctr[TR_MAX_LEASE], ctr[TR_DOMAIN_NAME_SUFFIX] };
+ char *varnames[MAX_BOXES] = { "START_ADDR_GREEN", "END_ADDR_GREEN",
+ "DNS1_GREEN", "DNS2_GREEN",
+ "DEFAULT_LEASE_TIME_GREEN", "MAX_LEASE_TIME_GREEN",
+ "DOMAIN_NAME_GREEN"};
+ char defaults[MAX_BOXES][STRING_SIZE];
+ int result;
+ int c;
+ char temp[STRING_SIZE];
+ struct keyvalue *mainkv = initkeyvalues();
+ struct keyvalue *dhcpkv = initkeyvalues();
+ struct keyvalue *ethernetkv = initkeyvalues();
+ int error;
+ FILE *file;
+ char greenaddress[STRING_SIZE];
+ char greennetaddress[STRING_SIZE];
+ char greennetmask[STRING_SIZE];
+
+ memset(defaults, 0, sizeof(char) * STRING_SIZE * MAX_BOXES);
+
+ if (!(readkeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings")))
+ {
+ freekeyvalues(dhcpkv);
+ freekeyvalues(ethernetkv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+ if (!(readkeyvalues(ethernetkv, CONFIG_ROOT "/ethernet/settings")))
+ {
+ freekeyvalues(dhcpkv);
+ freekeyvalues(ethernetkv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+ if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))
+ {
+ freekeyvalues(dhcpkv);
+ freekeyvalues(ethernetkv);
+ freekeyvalues(mainkv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ /* Set default values. */
+ findkey(ethernetkv, "GREEN_ADDRESS", defaults[PRIMARY_DNS]);
+ findkey(mainkv, "DOMAINNAME", defaults[DOMAIN_NAME_SUFFIX]);
+ strcpy(defaults[DEFAULT_LEASE_TIME], "60");
+ strcpy(defaults[MAX_LEASE_TIME], "120");
+
+ sprintf(message, ctr[TR_DHCP_SERVER_CONFIGURATION]);
+ newtCenteredWindow(55, 18, message);
+
+ dhcpform = newtForm(NULL, NULL, 0);
+
+ sprintf(message, ctr[TR_CONFIGURE_DHCP]);
+ header = newtTextboxReflowed(1, 1, message, 52, 0, 0, 0);
+ newtFormAddComponent(dhcpform, header);
+
+ strcpy(temp, ""); findkey(dhcpkv, "ENABLE_GREEN", temp);
+ if (strcmp(temp, "on") == 0)
+ startenabled = '*';
+ else
+ startenabled = ' ';
+ enabledcheckbox = newtCheckbox(2, TOP + 0, ctr[TR_ENABLED], startenabled, " *", &enabledresult);
+ newtFormAddComponent(dhcpform, enabledcheckbox);
+ newtComponentAddCallback(enabledcheckbox, dhcpdialogcallbackdhcp, NULL);
+
+ for (c = 0; c < MAX_BOXES; c++)
+ {
+ labels[c] = newtTextbox(2, TOP + 2 + c, 33, 1, 0);
+ newtTextboxSetText(labels[c], labeltexts[c]);
+ newtFormAddComponent(dhcpform, labels[c]);
+ strcpy(temp, defaults[c]); findkey(dhcpkv, varnames[c], temp);
+ entries[c] = newtEntry(34, TOP + 2 + c, temp, 18, &results[c], 0);
+ newtFormAddComponent(dhcpform, entries[c]);
+ if (startenabled == ' ')
+ newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_SET);
+
+ }
+
+ ok = newtButton(10, c + 7, ctr[TR_OK]);
+ cancel = newtButton(34, c + 7, ctr[TR_CANCEL]);
+
+ newtFormAddComponents(dhcpform, ok, cancel, NULL);
+
+ do
+ {
+ error = 0;
+ newtFormRun(dhcpform, &es);
+
+ if (es.u.co == ok)
+ {
+ /* OK was pressed; verify the contents of each entry. */
+ if (enabledresult == '*')
+ {
+ strcpy(message, ctr[TR_INVALID_FIELDS]);
+ if (inet_addr(results[START_ADDRESS]) == INADDR_NONE)
+ {
+ strcat(message, ctr[TR_START_ADDRESS_CR]);
+ error = 1;
+ }
+ if (inet_addr(results[END_ADDRESS]) == INADDR_NONE)
+ {
+ strcat(message, ctr[TR_END_ADDRESS_CR]);
+ error = 1;
+ }
+ if (strlen(results[SECONDARY_DNS]))
+ {
+ if (inet_addr(results[PRIMARY_DNS]) == INADDR_NONE)
+ {
+ strcat(message, ctr[TR_PRIMARY_DNS_CR]);
+ error = 1;
+ }
+ }
+ if (strlen(results[SECONDARY_DNS]))
+ {
+ if (inet_addr(results[SECONDARY_DNS]) == INADDR_NONE)
+ {
+ strcat(message, ctr[TR_SECONDARY_DNS_CR]);
+ error = 1;
+ }
+ }
+ if (!(atol(results[DEFAULT_LEASE_TIME])))
+ {
+ strcat(message, ctr[TR_DEFAULT_LEASE_CR]);
+ error = 1;
+ }
+ if (!(atol(results[MAX_LEASE_TIME])))
+ {
+ strcat(message, ctr[TR_MAX_LEASE_CR]);
+ error = 1;
+ }
+ }
+
+ if (error)
+ errorbox(message);
+ else
+ {
+ for (c = 0; c < MAX_BOXES; c++)
+ replacekeyvalue(dhcpkv, varnames[c], results[c]);
+ if (enabledresult == '*')
+ {
+ replacekeyvalue(dhcpkv, "ENABLE_GREEN", "on");
+ fclose(fopen(CONFIG_ROOT "/dhcp/enable_green", "w"));
+ chown(CONFIG_ROOT "/dhcp/enable_green", 99, 99);
+ mysystem("/usr/local/bin/dhcpctrl enable");
+ }
+ else
+ {
+ replacekeyvalue(dhcpkv, "ENABLE_GREEN", "off");
+ unlink(CONFIG_ROOT "/dhcp/enable_green");
+ mysystem("/usr/local/bin/dhcpctrl disable");
+ }
+ replacekeyvalue(dhcpkv, "VALID", "yes");
+ writekeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings");
+
+ findkey(ethernetkv, "GREEN_ADDRESS", greenaddress);
+ findkey(ethernetkv, "GREEN_NETADDRESS", greennetaddress);
+ findkey(ethernetkv, "GREEN_NETMASK", greennetmask);
+
+ file = fopen(CONFIG_ROOT "/dhcp/dhcpd.conf", "w");
+ fprintf(file, "ddns-update-style none;\n");
+ fprintf(file, "subnet %s netmask %s\n", greennetaddress, greennetmask);
+ fprintf(file, "{\n");
+ fprintf(file, "\toption subnet-mask %s;\n", greennetmask);
+ fprintf(file, "\toption domain-name \"%s\";\n", results[DOMAIN_NAME_SUFFIX]);
+ fprintf(file, "\toption routers %s;\n", greenaddress);
+ if (strlen(results[PRIMARY_DNS]))
+ {
+ fprintf(file, "\toption domain-name-servers ");
+ fprintf(file, "%s", results[PRIMARY_DNS]);
+ if (strlen(results[SECONDARY_DNS]))
+ fprintf(file, ", %s", results[SECONDARY_DNS]);
+ fprintf(file, ";\n");
+ }
+
+ fprintf(file, "\trange %s %s;\n", results[START_ADDRESS], results[END_ADDRESS]);
+ fprintf(file, "\tdefault-lease-time %d;\n", (int) atol(results[DEFAULT_LEASE_TIME]) * 60);
+ fprintf(file, "\tmax-lease-time %d;\n", (int) atol(results[MAX_LEASE_TIME]) * 60);
+ fprintf(file, "}\n");
+ fclose(file);
+ chown(CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);
+ if (automode == 0)
+ mysystem("/usr/local/bin/dhcpctrl enable");
+ }
+ result = 1;
+ }
+ else
+ result = 0;
+ }
+ while (error);
+
+ newtFormDestroy(dhcpform);
+ newtPopWindow();
+
+ freekeyvalues(dhcpkv);
+ freekeyvalues(ethernetkv);
+ freekeyvalues(mainkv);
+
+ return result;
+}
+
+/* Called when enabled flag is toggled. Toggle disabled state of other 3
+ * controls. */
+void dhcpdialogcallbackdhcp(newtComponent cm, void *data)
+{
+ int c;
+
+ for (c = 0; c < MAX_BOXES; c++)
+ newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);
+
+ newtRefresh();
+ newtDrawForm(dhcpform);
+}