-/* 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
- * ISDN probing.\r
- * \r
- * $Id: isdn.c,v 1.6.2.1 2004/04/14 22:05:41 gespinasse Exp $\r
- * \r
- */\r
- \r
-#include "setup.h"\r
- \r
-extern FILE *flog;\r
-extern char *mylog;\r
-\r
-extern char **ctr;\r
-\r
-extern int automode;\r
-\r
-struct card\r
-{\r
- char *name;\r
- int type;\r
-};\r
-\r
-struct card cards[] = {\r
- { "", 0 },\r
- { "Teles 16.0", 1 },\r
- { "Teles 8.0", 2 },\r
- { "Teles 16.3 (non PnP)", 3 },\r
- { "Teles 16.3c", 14 }, \r
- { "Teles PCI", 21 }, \r
- { "Creatix/Teles PnP", 4 },\r
- { "AVM A1 (Fritz)", 5 },\r
- { "AVM ISA/PCI", 27 }, \r
- { "AVM PCI/PNP (EXPERIMENTAL driver)", 999 },\r
- { "ELSA PCC/PCF cards", 6 },\r
- { "ELSA Quickstep 1000", 7 },\r
- { "ELSA Quickstep 1000PCI", 18 },\r
- { "Eicon Diva ISA Pnp and PCI", 11 },\r
- { "ASUS COM ISDNLink", 12 },\r
- { "HFC-2BS0 based cards", 13 },\r
- { "HFC 2BDS0 PCI", 35 }, \r
- { "Sedlbauer cards", 15 },\r
- { "USR Sportster internal", 16 },\r
- { "MIC Card", 17 },\r
- { "Compaq ISDN S00 ISA", 19 },\r
- { "NETjet PCI card", 20 },\r
- { "Dr. Neuhauss Niccy ISA/PCI", 24 },\r
- { "Teles S0Box", 25 },\r
- { "Sedlbauer Speed Fax+", 28 },\r
- { "Siemens I-Surf 1.0", 29 },\r
- { "ACER P10", 30 },\r
- { "HST Saphir", 31 },\r
- { "Telekom A4T", 32 },\r
- { "Scitel Quadro", 33 },\r
- { "Gazel ISA/PCI", 34 },\r
- { "W6692 based PCI cards", 36 },\r
- { "ITK ix1-micro Rev.2", 9 }, \r
- { "NETspider U PCI card", 38 },\r
- { "USB ST5481", 998 },\r
- { NULL, 0 }\r
-};\r
-\r
-void handleisdnprotocol(char **protocolnames);\r
-int isdnenabledpressed(void);\r
-int isdndisabledpressed(void);\r
-void handleisdncard(void);\r
-void handlemoduleparams(void);\r
-int probeisdncard(void);\r
-int probeusbisdncard(char *s);\r
-void handleisdnmsn(void);\r
-\r
-int handleisdn(void)\r
-{\r
- char *protocolnames[] = { ctr[TR_GERMAN_1TR6], ctr[TR_EURO_EDSS1],\r
- ctr[TR_LEASED_LINE], ctr[TR_US_NI1], NULL };\r
- struct keyvalue *kv;\r
- int rc;\r
- char protocolname[STRING_SIZE] = "";\r
- char cardname[STRING_SIZE] = "";\r
- char msn[STRING_SIZE] = "";\r
- char temps[STRING_SIZE];\r
- int tempd;\r
- char message[1000];\r
- int c;\r
- char *sections[] = { ctr[TR_PROTOCOL_COUNTRY],\r
- ctr[TR_SET_ADDITIONAL_MODULE_PARAMETERS], ctr[TR_ISDN_CARD],\r
- ctr[TR_MSN_CONFIGURATION], NULL };\r
- int choice;\r
- char enableddisabled[STRING_SIZE];\r
- FILE *f;\r
- \r
- if ((f = fopen(CONFIG_ROOT "/red/active", "r")))\r
- {\r
- fclose(f);\r
- errorbox(ctr[TR_RED_IN_USE]);\r
- return 1;\r
- }\r
- \r
- /* rc.isdn is a small script to bring down ippp0 and kill ipppd\r
- * and removes the ISDN modules. */\r
- mysystem("/etc/rc.d/rc.isdn stop");\r
-\r
- choice = 0; \r
- for (;;)\r
- {\r
- kv = initkeyvalues();\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- strcpy(enableddisabled, ctr[TR_DISABLED]);\r
- findkey(kv, "ENABLED", temps);\r
- if (strcmp(temps, "on") == 0)\r
- strcpy(enableddisabled, ctr[TR_ENABLED]);\r
- \r
- strcpy(temps, "-1");\r
- findkey(kv, "PROTOCOL", temps);\r
- tempd = atol(temps);\r
- if (tempd < 1 || tempd > 4)\r
- strcpy(protocolname, ctr[TR_UNSET]);\r
- else\r
- strcpy(protocolname, protocolnames[tempd - 1]);\r
- \r
- strcpy(temps, "-1");\r
- findkey(kv, "TYPE", temps);\r
- tempd = atol(temps);\r
- c = 0;\r
- while (cards[c].name)\r
- {\r
- if (cards[c].type == tempd)\r
- {\r
- strcpy(cardname, cards[c].name);\r
- break;\r
- }\r
- c++;\r
- }\r
- if (!strlen(cardname))\r
- strcpy(cardname, ctr[TR_UNSET]); \r
-\r
- strcpy(temps, ""); \r
- findkey(kv, "MSN", temps);\r
- if (strlen(temps))\r
- strcpy(msn, temps);\r
- else\r
- strcpy(msn, ctr[TR_UNSET]);\r
- sprintf(message, ctr[TR_ISDN_STATUS], enableddisabled, protocolname,\r
- cardname, msn);\r
- \r
- freekeyvalues(kv);\r
- \r
- rc = newtWinMenu(ctr[TR_ISDN_CONFIGURATION_MENU], message, 50, 5, 5, 6,\r
- sections, &choice, ctr[TR_OK], ctr[TR_ENABLE_ISDN],\r
- ctr[TR_DISABLE_ISDN], NULL);\r
- \r
- if (rc == 1 || rc == 0)\r
- {\r
- switch (choice)\r
- {\r
- case 0:\r
- handleisdnprotocol(protocolnames);\r
- break;\r
- \r
- case 1:\r
- handlemoduleparams();\r
- break;\r
- \r
- case 2:\r
- handleisdncard();\r
- break;\r
- \r
- case 3:\r
- handleisdnmsn();\r
- break;\r
- \r
- default:\r
- break;\r
- }\r
- }\r
-\r
- else if (rc == 2)\r
- {\r
- if (!isdnenabledpressed())\r
- break;\r
- }\r
- else\r
- {\r
- if (!(isdndisabledpressed()))\r
- break;\r
- } \r
- }\r
- \r
- return 1;\r
-}\r
-\r
-/* Returns 0 if main ISDN setup loop should exit. */\r
-int isdndisabledpressed(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- replacekeyvalue(kv, "ENABLED", "off");\r
- writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
-\r
- freekeyvalues(kv);\r
- \r
- return 0;\r
-}\r
-\r
-/* Returns 0 if main ISDN setup loop should exit. */\r
-int isdnenabledpressed(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char protocol[STRING_SIZE] = "";\r
- char type[STRING_SIZE] = "";\r
- char msn[STRING_SIZE] = "";\r
- char moduleparams[STRING_SIZE] = "";\r
- char commandstring[STRING_SIZE];\r
- int result = 0;\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- }\r
-\r
- findkey(kv, "PROTOCOL", protocol);\r
- findkey(kv, "TYPE", type);\r
- findkey(kv, "MSN", msn);\r
- findkey(kv, "MODULE_PARAMS", moduleparams);\r
- \r
- if (strlen(protocol) && strlen(type) && strlen(msn))\r
- {\r
- if (atol(type) == 998)\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax_st5481 protocol=%s %s",\r
- protocol, moduleparams);\r
- }\r
- else if (atol(type) == 999)\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax_fcpcipnp protocol=%s %s",\r
- protocol, moduleparams);\r
- }\r
- else\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax protocol=%s type=%s %s",\r
- protocol, type, moduleparams);\r
- }\r
- if (runcommandwithstatus(commandstring, ctr[TR_INITIALISING_ISDN]) != 0)\r
- {\r
- errorbox(ctr[TR_UNABLE_TO_INITIALISE_ISDN]);\r
- replacekeyvalue(kv, "ENABLED", "off");\r
- result = 1;\r
- }\r
- else\r
- replacekeyvalue(kv, "ENABLED", "on");\r
- }\r
- else\r
- {\r
- errorbox(ctr[TR_ISDN_NOT_SETUP]);\r
- replacekeyvalue(kv, "ENABLED", "off");\r
- result = 1;\r
- }\r
- writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
-\r
- freekeyvalues(kv);\r
- \r
- return result;\r
-}\r
-\r
-void handleisdnprotocol(char **protocolnames)\r
-{\r
- int rc;\r
- int choice;\r
- struct keyvalue *kv = initkeyvalues();\r
- char temp[STRING_SIZE] = "1";\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return;\r
- }\r
- findkey(kv, "PROTOCOL", temp);\r
- choice = atol(temp) - 1;\r
- \r
- rc = newtWinMenu(ctr[TR_ISDN_PROTOCOL_SELECTION], ctr[TR_CHOOSE_THE_ISDN_PROTOCOL],\r
- 50, 5, 5, 6, protocolnames, &choice, ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
- \r
- if (rc == 2)\r
- return;\r
-\r
- sprintf(temp, "%d", choice + 1);\r
- replacekeyvalue(kv, "PROTOCOL", temp);\r
- writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
- freekeyvalues(kv);\r
-}\r
- \r
-void handlemoduleparams(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char moduleparams[STRING_SIZE] = "";\r
- char *values[] = { moduleparams, NULL }; /* pointers for the values. */\r
- struct newtWinEntry entries[] =\r
- { { "", &values[0], 0,}, { NULL, NULL, 0 } };\r
- char title[STRING_SIZE];\r
- int rc;\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return;\r
- }\r
-\r
- findkey(kv, "MODULE_PARAMS", moduleparams);\r
-\r
- for (;;)\r
- { \r
- sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
- rc = newtWinEntries(title, ctr[TR_ENTER_ADDITIONAL_MODULE_PARAMS],\r
- 50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL); \r
- \r
- if (rc == 1)\r
- {\r
- replacekeyvalue(kv, "MODULE_PARAMS", values[0]);\r
- writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
- free(values[0]);\r
- break;\r
- }\r
- else\r
- break;\r
- }\r
- freekeyvalues(kv);\r
-}\r
-\r
-void handleisdncard(void)\r
-{\r
- char **selection;\r
- int c;\r
- int rc;\r
- int choice;\r
- int type;\r
- struct keyvalue *kv = initkeyvalues();\r
- char temp[STRING_SIZE] = "0";\r
- int card;\r
- char message[STRING_SIZE];\r
- char commandstring[STRING_SIZE];\r
- char moduleparams[STRING_SIZE] = "";\r
- int done = 0;\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return;\r
- }\r
- \r
- findkey(kv, "TYPE", temp);\r
- type = atol(temp);\r
- findkey(kv, "MODULE_PARAMS", moduleparams);\r
- \r
- /* Count cards. */\r
- c = 0;\r
- while (cards[c].name) c++;\r
- selection = malloc((c + 1) * sizeof(char *));\r
- \r
- /* Fill out section. */\r
- c = 0;\r
- selection[c] = ctr[TR_AUTODETECT];\r
- c++;\r
- while (cards[c].name)\r
- {\r
- selection[c] = cards[c].name;\r
- c++;\r
- }\r
- selection[c] = NULL;\r
- \r
- /* Determine inital value for choice. */\r
- c = 0; choice = 0;\r
- while (cards[c].name)\r
- {\r
- if (cards[c].type == type)\r
- {\r
- choice = c;\r
- break;\r
- }\r
- c++;\r
- }\r
- \r
- while (!done)\r
- {\r
- rc = newtWinMenu(ctr[TR_ISDN_CARD_SELECTION], ctr[TR_CHOOSE_THE_ISDN_CARD_INSTALLED],\r
- 50, 5, 5, 10, selection, &choice, ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
- \r
- if (rc == 2)\r
- done = 1;\r
- else\r
- { \r
- if (choice == 0)\r
- card = probeisdncard();\r
- else\r
- {\r
- sprintf(message, ctr[TR_CHECKING_FOR], cards[choice].name);\r
- if (cards[choice].type == 998)\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax_st5481 protocol=1 %s",\r
- moduleparams);\r
- }\r
- else if (cards[choice].type == 999)\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax_fcpcipnp protocol=1 %s",\r
- moduleparams);\r
- }\r
- else\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax type=%d protocol=1 %s",\r
- cards[choice].type, moduleparams);\r
- }\r
- if (runcommandwithstatus(commandstring, message) == 0)\r
- card = cards[choice].type;\r
- else\r
- {\r
- errorbox(ctr[TR_ISDN_CARD_NOT_DETECTED]);\r
- card = -1;\r
- }\r
- mysystem("/etc/rc.d/rc.isdn stop");\r
- }\r
-\r
- if (card != -1)\r
- {\r
- sprintf(temp, "%d", card);\r
- replacekeyvalue(kv, "TYPE", temp);\r
- writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
- done = 1;\r
- }\r
- }\r
- }\r
-\r
- free(selection); \r
- freekeyvalues(kv);\r
-}\r
-\r
-int probeusbisdncard(char *s)\r
-{\r
- FILE *file;\r
- char buf[STRING_SIZE]; \r
- int found = 0;\r
-\r
- if (!(file = fopen("/proc/bus/usb/devices", "r")))\r
- {\r
- fprintf(flog, "Unable to open /proc/bus/usb/devices in probeusbisdncard()\n");\r
- return 0;\r
- }\r
-\r
- while (fgets(buf, STRING_SIZE, file)) {\r
- if (strstr(buf, s)) {\r
- found = 1;\r
- }\r
- }\r
-\r
- fclose(file);\r
-\r
- return found;\r
-}\r
-\r
-int probeisdncard(void)\r
-{\r
- int c;\r
- char message[STRING_SIZE];\r
- char commandstring[STRING_SIZE];\r
- char moduleparams[STRING_SIZE] = "";\r
- struct keyvalue *kv = initkeyvalues();\r
- char title[STRING_SIZE];\r
- int result = -1;\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return -1;\r
- }\r
- findkey(kv, "MODULE_PARAMS", moduleparams);\r
- \r
- c = 1;\r
- while (cards[c].name)\r
- {\r
- sprintf(message, ctr[TR_CHECKING_FOR], cards[c].name);\r
- if (cards[c].type == 998)\r
- {\r
- /* Try to find if it exists, but should generalize\r
- * probeusbisdncard to pass Vendor and ProdID\r
- * independently, rather than a string\r
- */\r
- if (probeusbisdncard("Vendor=0483 ProdID=481"))\r
- sprintf(commandstring, "/sbin/modprobe hisax_st5481 protocol=1 %s", moduleparams);\r
- }\r
- else if (cards[c].type == 999)\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax_fcpcipnp protocol=1 %s", \r
- moduleparams);\r
- }\r
- else\r
- {\r
- sprintf(commandstring, "/sbin/modprobe hisax type=%d protocol=1 %s", \r
- cards[c].type, moduleparams);\r
- }\r
- if (runcommandwithstatus(commandstring, message) == 0)\r
- {\r
- mysystem("/etc/rc.d/rc.isdn stop");\r
- sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
- sprintf(message, ctr[TR_DETECTED], cards[c].name);\r
- newtWinMessage(title, ctr[TR_OK], message);\r
- result = cards[c].type;\r
- goto EXIT;\r
- }\r
- c++;\r
- }\r
-\r
- errorbox(ctr[TR_UNABLE_TO_FIND_AN_ISDN_CARD]);\r
- \r
-EXIT:\r
- freekeyvalues(kv);\r
- \r
- return result;\r
-}\r
-\r
-void handleisdnmsn(void)\r
-{\r
- struct keyvalue *kv = initkeyvalues();\r
- char msn[STRING_SIZE] = "";\r
- char *values[] = { msn, NULL }; /* pointers for the values. */\r
- struct newtWinEntry entries[] =\r
- { { "", &values[0], 0,}, { NULL, NULL, 0 } };\r
- char title[STRING_SIZE];\r
- int rc;\r
-\r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/isdn/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return;\r
- }\r
- findkey(kv, "MSN", msn);\r
-\r
- for (;;)\r
- { \r
- sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
- rc = newtWinEntries(title, ctr[TR_ENTER_THE_LOCAL_MSN],\r
- 50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL); \r
- \r
- if (rc == 1)\r
- {\r
- if (!(strlen(values[0])))\r
- errorbox(ctr[TR_PHONENUMBER_CANNOT_BE_EMPTY]);\r
- else\r
- { \r
- replacekeyvalue(kv, "MSN", values[0]);\r
- writekeyvalues(kv, CONFIG_ROOT "/isdn/settings");\r
- free(values[0]);\r
- break;\r
- }\r
- }\r
- else\r
- break;\r
- }\r
- freekeyvalues(kv);\r
-}\r