]> git.ipfire.org Git - ipfire-2.x.git/blame - src/install+setup/setup/dhcp.c
Kleine Fixes am Pakfire - brauche Binary.
[ipfire-2.x.git] / src / install+setup / setup / dhcp.c
CommitLineData
cd1a2927
MT
1/* SmoothWall setup program.\r
2 *\r
3 * This program is distributed under the terms of the GNU General Public\r
4 * Licence. See the file COPYING for details.\r
5 *\r
6 * (c) Lawrence Manning, 2001\r
7 * Stuff for setting up the DHCP server from the setup prog.\r
8 * \r
9 * $Id: dhcp.c,v 1.9.2.3 2004/12/03 06:46:50 eoberlander Exp $\r
10 * \r
11 */\r
12 \r
13#include "setup.h"\r
14\r
15#define TOP 4\r
16\r
17#define START_ADDRESS 0\r
18#define END_ADDRESS 1\r
19#define PRIMARY_DNS 2\r
20#define SECONDARY_DNS 3\r
21#define DEFAULT_LEASE_TIME 4\r
22#define MAX_LEASE_TIME 5\r
23#define DOMAIN_NAME_SUFFIX 6\r
24#define MAX_BOXES 7\r
25\r
26extern FILE *flog;\r
27extern char *mylog;\r
28\r
29extern char **ctr;\r
30\r
31extern int automode;\r
32\r
33newtComponent dhcpform;\r
34newtComponent entries[MAX_BOXES];\r
35newtComponent enabledcheckbox;\r
36\r
37void dhcpdialogcallbackdhcp(newtComponent cm, void *data);\r
38\r
39int handledhcp(void)\r
40{\r
41 char *results[MAX_BOXES];\r
42 char enabledresult;\r
43 char startenabled;\r
44 struct newtExitStruct es;\r
45 newtComponent header;\r
46 newtComponent labels[MAX_BOXES];\r
47 newtComponent ok, cancel; \r
48 char message[1000];\r
49 char *labeltexts[MAX_BOXES] = { ctr[TR_START_ADDRESS], ctr[TR_END_ADDRESS],\r
50 ctr[TR_PRIMARY_DNS], ctr[TR_SECONDARY_DNS], ctr[TR_DEFAULT_LEASE],\r
51 ctr[TR_MAX_LEASE], ctr[TR_DOMAIN_NAME_SUFFIX] };\r
52 char *varnames[MAX_BOXES] = { "START_ADDR_GREEN", "END_ADDR_GREEN", \r
53 "DNS1_GREEN", "DNS2_GREEN",\r
54 "DEFAULT_LEASE_TIME_GREEN", "MAX_LEASE_TIME_GREEN", \r
55 "DOMAIN_NAME_GREEN"};\r
56 char defaults[MAX_BOXES][STRING_SIZE]; \r
57 int result;\r
58 int c;\r
59 char temp[STRING_SIZE];\r
60 struct keyvalue *mainkv = initkeyvalues();\r
61 struct keyvalue *dhcpkv = initkeyvalues();\r
62 struct keyvalue *ethernetkv = initkeyvalues();\r
63 int error;\r
64 FILE *file;\r
65 char greenaddress[STRING_SIZE]; \r
66 char greennetaddress[STRING_SIZE];\r
67 char greennetmask[STRING_SIZE];\r
68 \r
69 memset(defaults, 0, sizeof(char) * STRING_SIZE * MAX_BOXES);\r
70 \r
71 if (!(readkeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings")))\r
72 {\r
73 freekeyvalues(dhcpkv);\r
74 freekeyvalues(ethernetkv);\r
75 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
76 return 0;\r
77 }\r
78 if (!(readkeyvalues(ethernetkv, CONFIG_ROOT "/ethernet/settings")))\r
79 {\r
80 freekeyvalues(dhcpkv);\r
81 freekeyvalues(ethernetkv);\r
82 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
83 return 0;\r
84 }\r
85 if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))\r
86 {\r
87 freekeyvalues(dhcpkv);\r
88 freekeyvalues(ethernetkv);\r
89 freekeyvalues(mainkv);\r
90 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
91 return 0;\r
92 }\r
93\r
94 /* Set default values. */ \r
95 findkey(ethernetkv, "GREEN_ADDRESS", defaults[PRIMARY_DNS]);\r
96 findkey(mainkv, "DOMAINNAME", defaults[DOMAIN_NAME_SUFFIX]);\r
97 strcpy(defaults[DEFAULT_LEASE_TIME], "60");\r
98 strcpy(defaults[MAX_LEASE_TIME], "120");\r
99\r
100 sprintf(message, ctr[TR_DHCP_SERVER_CONFIGURATION]);\r
101 newtCenteredWindow(55, 18, message);\r
102\r
103 dhcpform = newtForm(NULL, NULL, 0);\r
104 \r
105 sprintf(message, ctr[TR_CONFIGURE_DHCP]);\r
106 header = newtTextboxReflowed(1, 1, message, 52, 0, 0, 0);\r
107 newtFormAddComponent(dhcpform, header);\r
108\r
109 strcpy(temp, ""); findkey(dhcpkv, "ENABLE_GREEN", temp);\r
110 if (strcmp(temp, "on") == 0)\r
111 startenabled = '*';\r
112 else\r
113 startenabled = ' ';\r
114 enabledcheckbox = newtCheckbox(2, TOP + 0, ctr[TR_ENABLED], startenabled, " *", &enabledresult);\r
115 newtFormAddComponent(dhcpform, enabledcheckbox);\r
116 newtComponentAddCallback(enabledcheckbox, dhcpdialogcallbackdhcp, NULL); \r
117\r
118 for (c = 0; c < MAX_BOXES; c++)\r
119 {\r
120 labels[c] = newtTextbox(2, TOP + 2 + c, 33, 1, 0);\r
121 newtTextboxSetText(labels[c], labeltexts[c]);\r
122 newtFormAddComponent(dhcpform, labels[c]); \r
123 strcpy(temp, defaults[c]); findkey(dhcpkv, varnames[c], temp);\r
124 entries[c] = newtEntry(34, TOP + 2 + c, temp, 18, &results[c], 0);\r
125 newtFormAddComponent(dhcpform, entries[c]); \r
126 if (startenabled == ' ')\r
127 newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_SET); \r
128 \r
129 }\r
130 \r
131 ok = newtButton(10, c + 7, ctr[TR_OK]);\r
132 cancel = newtButton(34, c + 7, ctr[TR_CANCEL]);\r
133\r
134 newtFormAddComponents(dhcpform, ok, cancel, NULL);\r
135 \r
136 do\r
137 {\r
138 error = 0;\r
139 newtFormRun(dhcpform, &es);\r
140 \r
141 if (es.u.co == ok)\r
142 {\r
143 /* OK was pressed; verify the contents of each entry. */ \r
144 if (enabledresult == '*')\r
145 {\r
146 strcpy(message, ctr[TR_INVALID_FIELDS]); \r
147 if (inet_addr(results[START_ADDRESS]) == INADDR_NONE)\r
148 {\r
149 strcat(message, ctr[TR_START_ADDRESS_CR]);\r
150 error = 1;\r
151 }\r
152 if (inet_addr(results[END_ADDRESS]) == INADDR_NONE)\r
153 {\r
154 strcat(message, ctr[TR_END_ADDRESS_CR]);\r
155 error = 1;\r
156 }\r
157 if (strlen(results[SECONDARY_DNS]))\r
158 {\r
159 if (inet_addr(results[PRIMARY_DNS]) == INADDR_NONE)\r
160 {\r
161 strcat(message, ctr[TR_PRIMARY_DNS_CR]);\r
162 error = 1;\r
163 }\r
164 }\r
165 if (strlen(results[SECONDARY_DNS]))\r
166 {\r
167 if (inet_addr(results[SECONDARY_DNS]) == INADDR_NONE)\r
168 {\r
169 strcat(message, ctr[TR_SECONDARY_DNS_CR]);\r
170 error = 1;\r
171 }\r
172 }\r
173 if (!(atol(results[DEFAULT_LEASE_TIME])))\r
174 {\r
175 strcat(message, ctr[TR_DEFAULT_LEASE_CR]);\r
176 error = 1;\r
177 }\r
178 if (!(atol(results[MAX_LEASE_TIME])))\r
179 {\r
180 strcat(message, ctr[TR_MAX_LEASE_CR]);\r
181 error = 1;\r
182 }\r
183 } \r
184 \r
185 if (error)\r
186 errorbox(message);\r
187 else\r
188 {\r
189 for (c = 0; c < MAX_BOXES; c++)\r
190 replacekeyvalue(dhcpkv, varnames[c], results[c]);\r
191 if (enabledresult == '*')\r
192 {\r
193 replacekeyvalue(dhcpkv, "ENABLE_GREEN", "on");\r
194 fclose(fopen(CONFIG_ROOT "/dhcp/enable_green", "w"));\r
195 chown(CONFIG_ROOT "/dhcp/enable_green", 99, 99);\r
196 }\r
197 else\r
198 {\r
199 replacekeyvalue(dhcpkv, "ENABLE_GREEN", "off");\r
200 unlink(CONFIG_ROOT "/dhcp/enable_green");\r
201 }\r
202 replacekeyvalue(dhcpkv, "VALID", "yes");\r
203 writekeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings");\r
204 \r
205 findkey(ethernetkv, "GREEN_ADDRESS", greenaddress); \r
206 findkey(ethernetkv, "GREEN_NETADDRESS", greennetaddress);\r
207 findkey(ethernetkv, "GREEN_NETMASK", greennetmask);\r
208 \r
209 file = fopen(CONFIG_ROOT "/dhcp/dhcpd.conf", "w");\r
210 fprintf(file, "ddns-update-style none;\n");\r
211 fprintf(file, "subnet %s netmask %s\n", greennetaddress, greennetmask);\r
212 fprintf(file, "{\n");\r
213 fprintf(file, "\toption subnet-mask %s;\n", greennetmask);\r
214 fprintf(file, "\toption domain-name \"%s\";\n", results[DOMAIN_NAME_SUFFIX]); \r
215 fprintf(file, "\toption routers %s;\n", greenaddress);\r
216 if (strlen(results[PRIMARY_DNS]))\r
217 {\r
218 fprintf(file, "\toption domain-name-servers ");\r
219 fprintf(file, "%s", results[PRIMARY_DNS]);\r
220 if (strlen(results[SECONDARY_DNS]))\r
221 fprintf(file, ", %s", results[SECONDARY_DNS]);\r
222 fprintf(file, ";\n");\r
223 }\r
224 \r
225 fprintf(file, "\trange %s %s;\n", results[START_ADDRESS], results[END_ADDRESS]);\r
226 fprintf(file, "\tdefault-lease-time %d;\n", (int) atol(results[DEFAULT_LEASE_TIME]) * 60);\r
227 fprintf(file, "\tmax-lease-time %d;\n", (int) atol(results[MAX_LEASE_TIME]) * 60);\r
228 fprintf(file, "}\n");\r
229 fclose(file);\r
230 chown(CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);\r
231 if (automode == 0)\r
232 mysystem("/usr/local/bin/restartdhcp");\r
233 }\r
234 result = 1;\r
235 }\r
236 else\r
237 result = 0;\r
238 } \r
239 while (error);\r
240 \r
241 newtFormDestroy(dhcpform);\r
242 newtPopWindow();\r
243 \r
244 freekeyvalues(dhcpkv);\r
245 freekeyvalues(ethernetkv);\r
246 freekeyvalues(mainkv);\r
247 \r
248 return result;\r
249}\r
250\r
251/* Called when enabled flag is toggled. Toggle disabled state of other 3\r
252 * controls. */\r
253void dhcpdialogcallbackdhcp(newtComponent cm, void *data)\r
254{\r
255 int c;\r
256 \r
257 for (c = 0; c < MAX_BOXES; c++)\r
258 newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);\r
259 \r
260 newtRefresh();\r
261 newtDrawForm(dhcpform); \r
262}\r