]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/install+setup/setup/isdn.c
PPP Menue angepasst
[people/pmueller/ipfire-2.x.git] / src / install+setup / setup / isdn.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 * ISDN probing.\r
8 * \r
9 * $Id: isdn.c,v 1.6.2.1 2004/04/14 22:05:41 gespinasse Exp $\r
10 * \r
11 */\r
12 \r
13#include "setup.h"\r
14 \r
15extern FILE *flog;\r
16extern char *mylog;\r
17\r
18extern char **ctr;\r
19\r
20extern int automode;\r
21\r
22struct card\r
23{\r
24 char *name;\r
25 int type;\r
26};\r
27\r
28struct card cards[] = {\r
29 { "", 0 },\r
30 { "Teles 16.0", 1 },\r
31 { "Teles 8.0", 2 },\r
32 { "Teles 16.3 (non PnP)", 3 },\r
33 { "Teles 16.3c", 14 }, \r
34 { "Teles PCI", 21 }, \r
35 { "Creatix/Teles PnP", 4 },\r
36 { "AVM A1 (Fritz)", 5 },\r
37 { "AVM ISA/PCI", 27 }, \r
38 { "AVM PCI/PNP (EXPERIMENTAL driver)", 999 },\r
39 { "ELSA PCC/PCF cards", 6 },\r
40 { "ELSA Quickstep 1000", 7 },\r
41 { "ELSA Quickstep 1000PCI", 18 },\r
42 { "Eicon Diva ISA Pnp and PCI", 11 },\r
43 { "ASUS COM ISDNLink", 12 },\r
44 { "HFC-2BS0 based cards", 13 },\r
45 { "HFC 2BDS0 PCI", 35 }, \r
46 { "Sedlbauer cards", 15 },\r
47 { "USR Sportster internal", 16 },\r
48 { "MIC Card", 17 },\r
49 { "Compaq ISDN S00 ISA", 19 },\r
50 { "NETjet PCI card", 20 },\r
51 { "Dr. Neuhauss Niccy ISA/PCI", 24 },\r
52 { "Teles S0Box", 25 },\r
53 { "Sedlbauer Speed Fax+", 28 },\r
54 { "Siemens I-Surf 1.0", 29 },\r
55 { "ACER P10", 30 },\r
56 { "HST Saphir", 31 },\r
57 { "Telekom A4T", 32 },\r
58 { "Scitel Quadro", 33 },\r
59 { "Gazel ISA/PCI", 34 },\r
60 { "W6692 based PCI cards", 36 },\r
61 { "ITK ix1-micro Rev.2", 9 }, \r
62 { "NETspider U PCI card", 38 },\r
63 { "USB ST5481", 998 },\r
64 { NULL, 0 }\r
65};\r
66\r
67void handleisdnprotocol(char **protocolnames);\r
68int isdnenabledpressed(void);\r
69int isdndisabledpressed(void);\r
70void handleisdncard(void);\r
71void handlemoduleparams(void);\r
72int probeisdncard(void);\r
73int probeusbisdncard(char *s);\r
74void handleisdnmsn(void);\r
75\r
76int handleisdn(void)\r
77{\r
78 char *protocolnames[] = { ctr[TR_GERMAN_1TR6], ctr[TR_EURO_EDSS1],\r
79 ctr[TR_LEASED_LINE], ctr[TR_US_NI1], NULL };\r
80 struct keyvalue *kv;\r
81 int rc;\r
82 char protocolname[STRING_SIZE] = "";\r
83 char cardname[STRING_SIZE] = "";\r
84 char msn[STRING_SIZE] = "";\r
85 char temps[STRING_SIZE];\r
86 int tempd;\r
87 char message[1000];\r
88 int c;\r
89 char *sections[] = { ctr[TR_PROTOCOL_COUNTRY],\r
90 ctr[TR_SET_ADDITIONAL_MODULE_PARAMETERS], ctr[TR_ISDN_CARD],\r
91 ctr[TR_MSN_CONFIGURATION], NULL };\r
92 int choice;\r
93 char enableddisabled[STRING_SIZE];\r
94 FILE *f;\r
95 \r
96 if ((f = fopen(CONFIG_ROOT "/red/active", "r")))\r
97 {\r
98 fclose(f);\r
99 errorbox(ctr[TR_RED_IN_USE]);\r
100 return 1;\r
101 }\r
102 \r
103 /* rc.isdn is a small script to bring down ippp0 and kill ipppd\r
104 * and removes the ISDN modules. */\r
105 mysystem("/etc/rc.d/rc.isdn stop");\r
106\r
107 choice = 0; \r
108 for (;;)\r
109 {\r
110 kv = initkeyvalues();\r
111 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
112 {\r
113 freekeyvalues(kv);\r
114 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
115 return 0;\r
116 }\r
117\r
118 strcpy(enableddisabled, ctr[TR_DISABLED]);\r
119 findkey(kv, "ENABLED", temps);\r
120 if (strcmp(temps, "on") == 0)\r
121 strcpy(enableddisabled, ctr[TR_ENABLED]);\r
122 \r
123 strcpy(temps, "-1");\r
124 findkey(kv, "PROTOCOL", temps);\r
125 tempd = atol(temps);\r
126 if (tempd < 1 || tempd > 4)\r
127 strcpy(protocolname, ctr[TR_UNSET]);\r
128 else\r
129 strcpy(protocolname, protocolnames[tempd - 1]);\r
130 \r
131 strcpy(temps, "-1");\r
132 findkey(kv, "TYPE", temps);\r
133 tempd = atol(temps);\r
134 c = 0;\r
135 while (cards[c].name)\r
136 {\r
137 if (cards[c].type == tempd)\r
138 {\r
139 strcpy(cardname, cards[c].name);\r
140 break;\r
141 }\r
142 c++;\r
143 }\r
144 if (!strlen(cardname))\r
145 strcpy(cardname, ctr[TR_UNSET]); \r
146\r
147 strcpy(temps, ""); \r
148 findkey(kv, "MSN", temps);\r
149 if (strlen(temps))\r
150 strcpy(msn, temps);\r
151 else\r
152 strcpy(msn, ctr[TR_UNSET]);\r
153 sprintf(message, ctr[TR_ISDN_STATUS], enableddisabled, protocolname,\r
154 cardname, msn);\r
155 \r
156 freekeyvalues(kv);\r
157 \r
158 rc = newtWinMenu(ctr[TR_ISDN_CONFIGURATION_MENU], message, 50, 5, 5, 6,\r
159 sections, &choice, ctr[TR_OK], ctr[TR_ENABLE_ISDN],\r
160 ctr[TR_DISABLE_ISDN], NULL);\r
161 \r
162 if (rc == 1 || rc == 0)\r
163 {\r
164 switch (choice)\r
165 {\r
166 case 0:\r
167 handleisdnprotocol(protocolnames);\r
168 break;\r
169 \r
170 case 1:\r
171 handlemoduleparams();\r
172 break;\r
173 \r
174 case 2:\r
175 handleisdncard();\r
176 break;\r
177 \r
178 case 3:\r
179 handleisdnmsn();\r
180 break;\r
181 \r
182 default:\r
183 break;\r
184 }\r
185 }\r
186\r
187 else if (rc == 2)\r
188 {\r
189 if (!isdnenabledpressed())\r
190 break;\r
191 }\r
192 else\r
193 {\r
194 if (!(isdndisabledpressed()))\r
195 break;\r
196 } \r
197 }\r
198 \r
199 return 1;\r
200}\r
201\r
202/* Returns 0 if main ISDN setup loop should exit. */\r
203int isdndisabledpressed(void)\r
204{\r
205 struct keyvalue *kv = initkeyvalues();\r
206\r
207 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
208 {\r
209 freekeyvalues(kv);\r
210 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
211 return 0;\r
212 }\r
213\r
214 replacekeyvalue(kv, "ENABLED", "off");\r
215 writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
216\r
217 freekeyvalues(kv);\r
218 \r
219 return 0;\r
220}\r
221\r
222/* Returns 0 if main ISDN setup loop should exit. */\r
223int isdnenabledpressed(void)\r
224{\r
225 struct keyvalue *kv = initkeyvalues();\r
226 char protocol[STRING_SIZE] = "";\r
227 char type[STRING_SIZE] = "";\r
228 char msn[STRING_SIZE] = "";\r
229 char moduleparams[STRING_SIZE] = "";\r
230 char commandstring[STRING_SIZE];\r
231 int result = 0;\r
232\r
233 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
234 {\r
235 freekeyvalues(kv);\r
236 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
237 return 0;\r
238 }\r
239\r
240 findkey(kv, "PROTOCOL", protocol);\r
241 findkey(kv, "TYPE", type);\r
242 findkey(kv, "MSN", msn);\r
243 findkey(kv, "MODULE_PARAMS", moduleparams);\r
244 \r
245 if (strlen(protocol) && strlen(type) && strlen(msn))\r
246 {\r
247 if (atol(type) == 998)\r
248 {\r
249 sprintf(commandstring, "/sbin/modprobe hisax_st5481 protocol=%s %s",\r
250 protocol, moduleparams);\r
251 }\r
252 else if (atol(type) == 999)\r
253 {\r
254 sprintf(commandstring, "/sbin/modprobe hisax_fcpcipnp protocol=%s %s",\r
255 protocol, moduleparams);\r
256 }\r
257 else\r
258 {\r
259 sprintf(commandstring, "/sbin/modprobe hisax protocol=%s type=%s %s",\r
260 protocol, type, moduleparams);\r
261 }\r
262 if (runcommandwithstatus(commandstring, ctr[TR_INITIALISING_ISDN]) != 0)\r
263 {\r
264 errorbox(ctr[TR_UNABLE_TO_INITIALISE_ISDN]);\r
265 replacekeyvalue(kv, "ENABLED", "off");\r
266 result = 1;\r
267 }\r
268 else\r
269 replacekeyvalue(kv, "ENABLED", "on");\r
270 }\r
271 else\r
272 {\r
273 errorbox(ctr[TR_ISDN_NOT_SETUP]);\r
274 replacekeyvalue(kv, "ENABLED", "off");\r
275 result = 1;\r
276 }\r
277 writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
278\r
279 freekeyvalues(kv);\r
280 \r
281 return result;\r
282}\r
283\r
284void handleisdnprotocol(char **protocolnames)\r
285{\r
286 int rc;\r
287 int choice;\r
288 struct keyvalue *kv = initkeyvalues();\r
289 char temp[STRING_SIZE] = "1";\r
290\r
291 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
292 {\r
293 freekeyvalues(kv);\r
294 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
295 return;\r
296 }\r
297 findkey(kv, "PROTOCOL", temp);\r
298 choice = atol(temp) - 1;\r
299 \r
300 rc = newtWinMenu(ctr[TR_ISDN_PROTOCOL_SELECTION], ctr[TR_CHOOSE_THE_ISDN_PROTOCOL],\r
301 50, 5, 5, 6, protocolnames, &choice, ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
302 \r
303 if (rc == 2)\r
304 return;\r
305\r
306 sprintf(temp, "%d", choice + 1);\r
307 replacekeyvalue(kv, "PROTOCOL", temp);\r
308 writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
309 freekeyvalues(kv);\r
310}\r
311 \r
312void handlemoduleparams(void)\r
313{\r
314 struct keyvalue *kv = initkeyvalues();\r
315 char moduleparams[STRING_SIZE] = "";\r
316 char *values[] = { moduleparams, NULL }; /* pointers for the values. */\r
317 struct newtWinEntry entries[] =\r
318 { { "", &values[0], 0,}, { NULL, NULL, 0 } };\r
319 char title[STRING_SIZE];\r
320 int rc;\r
321\r
322 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
323 {\r
324 freekeyvalues(kv);\r
325 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
326 return;\r
327 }\r
328\r
329 findkey(kv, "MODULE_PARAMS", moduleparams);\r
330\r
331 for (;;)\r
332 { \r
333 sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
334 rc = newtWinEntries(title, ctr[TR_ENTER_ADDITIONAL_MODULE_PARAMS],\r
335 50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL); \r
336 \r
337 if (rc == 1)\r
338 {\r
339 replacekeyvalue(kv, "MODULE_PARAMS", values[0]);\r
340 writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
341 free(values[0]);\r
342 break;\r
343 }\r
344 else\r
345 break;\r
346 }\r
347 freekeyvalues(kv);\r
348}\r
349\r
350void handleisdncard(void)\r
351{\r
352 char **selection;\r
353 int c;\r
354 int rc;\r
355 int choice;\r
356 int type;\r
357 struct keyvalue *kv = initkeyvalues();\r
358 char temp[STRING_SIZE] = "0";\r
359 int card;\r
360 char message[STRING_SIZE];\r
361 char commandstring[STRING_SIZE];\r
362 char moduleparams[STRING_SIZE] = "";\r
363 int done = 0;\r
364 \r
365 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
366 {\r
367 freekeyvalues(kv);\r
368 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
369 return;\r
370 }\r
371 \r
372 findkey(kv, "TYPE", temp);\r
373 type = atol(temp);\r
374 findkey(kv, "MODULE_PARAMS", moduleparams);\r
375 \r
376 /* Count cards. */\r
377 c = 0;\r
378 while (cards[c].name) c++;\r
379 selection = malloc((c + 1) * sizeof(char *));\r
380 \r
381 /* Fill out section. */\r
382 c = 0;\r
383 selection[c] = ctr[TR_AUTODETECT];\r
384 c++;\r
385 while (cards[c].name)\r
386 {\r
387 selection[c] = cards[c].name;\r
388 c++;\r
389 }\r
390 selection[c] = NULL;\r
391 \r
392 /* Determine inital value for choice. */\r
393 c = 0; choice = 0;\r
394 while (cards[c].name)\r
395 {\r
396 if (cards[c].type == type)\r
397 {\r
398 choice = c;\r
399 break;\r
400 }\r
401 c++;\r
402 }\r
403 \r
404 while (!done)\r
405 {\r
406 rc = newtWinMenu(ctr[TR_ISDN_CARD_SELECTION], ctr[TR_CHOOSE_THE_ISDN_CARD_INSTALLED],\r
407 50, 5, 5, 10, selection, &choice, ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
408 \r
409 if (rc == 2)\r
410 done = 1;\r
411 else\r
412 { \r
413 if (choice == 0)\r
414 card = probeisdncard();\r
415 else\r
416 {\r
417 sprintf(message, ctr[TR_CHECKING_FOR], cards[choice].name);\r
418 if (cards[choice].type == 998)\r
419 {\r
420 sprintf(commandstring, "/sbin/modprobe hisax_st5481 protocol=1 %s",\r
421 moduleparams);\r
422 }\r
423 else if (cards[choice].type == 999)\r
424 {\r
425 sprintf(commandstring, "/sbin/modprobe hisax_fcpcipnp protocol=1 %s",\r
426 moduleparams);\r
427 }\r
428 else\r
429 {\r
430 sprintf(commandstring, "/sbin/modprobe hisax type=%d protocol=1 %s",\r
431 cards[choice].type, moduleparams);\r
432 }\r
433 if (runcommandwithstatus(commandstring, message) == 0)\r
434 card = cards[choice].type;\r
435 else\r
436 {\r
437 errorbox(ctr[TR_ISDN_CARD_NOT_DETECTED]);\r
438 card = -1;\r
439 }\r
440 mysystem("/etc/rc.d/rc.isdn stop");\r
441 }\r
442\r
443 if (card != -1)\r
444 {\r
445 sprintf(temp, "%d", card);\r
446 replacekeyvalue(kv, "TYPE", temp);\r
447 writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
448 done = 1;\r
449 }\r
450 }\r
451 }\r
452\r
453 free(selection); \r
454 freekeyvalues(kv);\r
455}\r
456\r
457int probeusbisdncard(char *s)\r
458{\r
459 FILE *file;\r
460 char buf[STRING_SIZE]; \r
461 int found = 0;\r
462\r
463 if (!(file = fopen("/proc/bus/usb/devices", "r")))\r
464 {\r
465 fprintf(flog, "Unable to open /proc/bus/usb/devices in probeusbisdncard()\n");\r
466 return 0;\r
467 }\r
468\r
469 while (fgets(buf, STRING_SIZE, file)) {\r
470 if (strstr(buf, s)) {\r
471 found = 1;\r
472 }\r
473 }\r
474\r
475 fclose(file);\r
476\r
477 return found;\r
478}\r
479\r
480int probeisdncard(void)\r
481{\r
482 int c;\r
483 char message[STRING_SIZE];\r
484 char commandstring[STRING_SIZE];\r
485 char moduleparams[STRING_SIZE] = "";\r
486 struct keyvalue *kv = initkeyvalues();\r
487 char title[STRING_SIZE];\r
488 int result = -1;\r
489 \r
490 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
491 {\r
492 freekeyvalues(kv);\r
493 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
494 return -1;\r
495 }\r
496 findkey(kv, "MODULE_PARAMS", moduleparams);\r
497 \r
498 c = 1;\r
499 while (cards[c].name)\r
500 {\r
501 sprintf(message, ctr[TR_CHECKING_FOR], cards[c].name);\r
502 if (cards[c].type == 998)\r
503 {\r
504 /* Try to find if it exists, but should generalize\r
505 * probeusbisdncard to pass Vendor and ProdID\r
506 * independently, rather than a string\r
507 */\r
508 if (probeusbisdncard("Vendor=0483 ProdID=481"))\r
509 sprintf(commandstring, "/sbin/modprobe hisax_st5481 protocol=1 %s", moduleparams);\r
510 }\r
511 else if (cards[c].type == 999)\r
512 {\r
513 sprintf(commandstring, "/sbin/modprobe hisax_fcpcipnp protocol=1 %s", \r
514 moduleparams);\r
515 }\r
516 else\r
517 {\r
518 sprintf(commandstring, "/sbin/modprobe hisax type=%d protocol=1 %s", \r
519 cards[c].type, moduleparams);\r
520 }\r
521 if (runcommandwithstatus(commandstring, message) == 0)\r
522 {\r
523 mysystem("/etc/rc.d/rc.isdn stop");\r
524 sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
525 sprintf(message, ctr[TR_DETECTED], cards[c].name);\r
526 newtWinMessage(title, ctr[TR_OK], message);\r
527 result = cards[c].type;\r
528 goto EXIT;\r
529 }\r
530 c++;\r
531 }\r
532\r
533 errorbox(ctr[TR_UNABLE_TO_FIND_AN_ISDN_CARD]);\r
534 \r
535EXIT:\r
536 freekeyvalues(kv);\r
537 \r
538 return result;\r
539}\r
540\r
541void handleisdnmsn(void)\r
542{\r
543 struct keyvalue *kv = initkeyvalues();\r
544 char msn[STRING_SIZE] = "";\r
545 char *values[] = { msn, NULL }; /* pointers for the values. */\r
546 struct newtWinEntry entries[] =\r
547 { { "", &values[0], 0,}, { NULL, NULL, 0 } };\r
548 char title[STRING_SIZE];\r
549 int rc;\r
550\r
551 if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
552 {\r
553 freekeyvalues(kv);\r
554 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
555 return;\r
556 }\r
557 findkey(kv, "MSN", msn);\r
558\r
559 for (;;)\r
560 { \r
561 sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
562 rc = newtWinEntries(title, ctr[TR_ENTER_THE_LOCAL_MSN],\r
563 50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL); \r
564 \r
565 if (rc == 1)\r
566 {\r
567 if (!(strlen(values[0])))\r
568 errorbox(ctr[TR_PHONENUMBER_CANNOT_BE_EMPTY]);\r
569 else\r
570 { \r
571 replacekeyvalue(kv, "MSN", values[0]);\r
572 writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
573 free(values[0]);\r
574 break;\r
575 }\r
576 }\r
577 else\r
578 break;\r
579 }\r
580 freekeyvalues(kv);\r
581}\r