]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/install+setup/setup/dhcp.c
Am Pakfire weitergearbeitet.
[people/teissler/ipfire-2.x.git] / src / install+setup / setup / dhcp.c
index 8f7438e42ec68d1c41f29070b03687a544e2265d..f96975944d69a7db65bf809550afa2d1fb7d5642 100644 (file)
-/* 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); 
+}