X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ap-utils.git;a=blobdiff_plain;f=lib%2Fcommon.c;fp=lib%2Fcommon.c;h=e8c0b7c116df502a2dddc700ac82d2339ecc8f9a;hp=16f342dc00ce196228d3eb64eaee2165efa4355f;hb=67fc54773e1504698e80c9cb83977bde32665350;hpb=6a9e980b8799891e0a5467a0126a60b169c8f4eb diff --git a/lib/common.c b/lib/common.c index 16f342d..e8c0b7c 100644 --- a/lib/common.c +++ b/lib/common.c @@ -30,9 +30,15 @@ #define AUTODETECT _("Autodetect AP type? ") #define APIP _("Access Point IP-address: ") #define APPASS _("Password (community): ") +#define APNAME _("Access Point name: ") +#define WANT_APNAME _("Do you want to define name for this AP? ") #define APTYPE _("AP type: ") #define SAVESETTINGS _("Save connect-settings: ") +char IS_ATMEL410_SBRIDGES; +char IS_ATMEL12350_TELLUS; +char IS_ATMEL12350_VERNET; + extern WINDOW *main_sub; extern char *community, *prog_title; extern short ap_type; @@ -97,17 +103,11 @@ void connect_options(unsigned long int ip, int type) { int i; struct sockaddr_in client; - unsigned char message[16]; + unsigned char message[256]; + unsigned char name[17]; int fd; char *home_dir; char save_settings=1; - char sysDescr_NWN[] = { 0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00 }; - char sysDescr_ATMEL410[] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, - 0x01, 0x01, 0x01, 0x01, 0x00 }; - char sysDescr_ATMEL12350[] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, - 0x01, 0x01, 0x01, 0x01, 0x00 }; - varbind varbinds[1]; - memset(&client, 0, sizeof client); client.sin_family = AF_INET; @@ -154,62 +154,50 @@ get_all_again: community = (char *) malloc(i); strncpy(community, message, i); + print_help(_("Display name for the Access point " + "(NOT the name defined inside the AP!)")); + mvwaddstr(main_sub, 3, 1, WANT_APNAME); + wrefresh(main_sub); + i = yes_no(3, 1 + strlen(WANT_APNAME)); + if (i == 2) { /* NO */ + name[0] = '\0'; + mvwaddstr(main_sub, 3, 1 + strlen(WANT_APNAME), "No"); + } else { /* YES */ + clear_main_new(3, 4); + mvwaddstr(main_sub, 3, 1, APNAME); + get_value(message, 3, 1 + strlen(APNAME), sizeof(name), + ANY_STRING, 0, 0, NULL); + strncpy(name, message, strlen(message) + 1); + } + print_help(""); if (type) { ap_type = --type; - mvwaddstr(main_sub, 3, 1, APTYPE); + mvwaddstr(main_sub, 4, 1, APTYPE); } else { - mvwaddstr(main_sub, 3, 1, AUTODETECT); + mvwaddstr(main_sub, 4, 1, AUTODETECT); wrefresh(main_sub); - i = yes_no(3, 1 + strlen(AUTODETECT)); - clear_main_new(3, 4); - mvwaddstr(main_sub, 3, 1, APTYPE); + i = yes_no(4, 1 + strlen(AUTODETECT)); + clear_main_new(4, 5); + mvwaddstr(main_sub, 4, 1, APTYPE); if (i == 2) { /* NO */ wrefresh(main_sub); - ap_type = menu_choose(3, 1 + strlen(APTYPE), ap_types, 3); + ap_type = menu_choose(4, 1 + strlen(APTYPE), ap_types, 3); } else { /* YES */ print_help(_("Determining AP type. Please wait...")); - varbinds[0].oid = sysDescr_NWN; - varbinds[0].len_oid = sizeof(sysDescr_NWN); - varbinds[0].value = NULL; - varbinds[0].len_val = 0; - varbinds[0].type = NULL_VALUE; - if (snmp(varbinds, 1, GET) > 0) { - ap_type = NWN; - } else { - varbinds[0].oid = sysDescr_ATMEL410; - varbinds[0].len_oid = sizeof(sysDescr_ATMEL410); - varbinds[0].value = NULL; - varbinds[0].len_val = 0; - varbinds[0].type = NULL_VALUE; - if (snmp(varbinds, 1, GET) > 0) { - ap_type = ATMEL410; - } else { - varbinds[0].oid = sysDescr_ATMEL12350; - varbinds[0].len_oid = sizeof(sysDescr_ATMEL12350); - varbinds[0].value = NULL; - varbinds[0].len_val = 0; - varbinds[0].type = NULL_VALUE; - if (snmp(varbinds, 1, GET) > 0) { - ap_type = ATMEL12350; - } else { - print_helperr(_("Unable to determine AP type " - "(no response). Press any key.")); - getch(); - clear_main_new(1, 4); - goto get_all_again; - } - } + if (get_mib_details() == -1) { + clear_main_new(1, 5); + goto get_all_again; } - } + } wattrset(main_sub, A_BOLD); } waddstr(main_sub, ap_types[ap_type]); wattrset(main_sub, A_NORMAL); - mvwaddstr(main_sub, 4, 1, SAVESETTINGS); + mvwaddstr(main_sub, 5, 1, SAVESETTINGS); wrefresh(main_sub); - save_settings = on_off(4, 1 + strlen(SAVESETTINGS)); + save_settings = on_off(5, 1 + strlen(SAVESETTINGS)); print_bottom(inet_ntoa(ap_ip)); @@ -217,8 +205,8 @@ get_all_again: if ((home_dir = getenv("HOME"))) { sprintf(message, "%s/.ap-config", home_dir); if ((fd = open(message, O_CREAT | O_WRONLY | O_APPEND, 0600)) != -1) { - sprintf(message, "%s:%s:%d\n", inet_ntoa(ap_ip), - community, ap_type); + sprintf(message, "%s:%s:%s:%d\n", inet_ntoa(ap_ip), + community, name, ap_type); write(fd, message, strlen(message)); close(fd); } @@ -231,6 +219,106 @@ get_all_again: return; } +/* + * Determines AP MIB type (fills ap_type), and AP MIB vendor extensions + * (changes values of IS_ATMEL* globals). Returns with -1 on error or 0 + * if everything is OK. + */ +int get_mib_details() +{ + char sysDescr_NWN[] = { + 0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00 + }; + char sysDescr_ATMEL[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x01, 0x01, 0x00 + }; + char operEthernetAddress_ATMEL[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x02, 0x03, 0x00 + }; + char Wireless_ATMEL[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x03, 0x01, 0x00 + }; + varbind varbinds[2]; + char oui_sbridges[3] = { 0x00, 0x30, 0x1A }; + char oui_tellus[3] = { 0x00, 0x04, 0xDB }; + + /* first, determine the private MIB types according to enterprises ID */ + varbinds[0].oid = sysDescr_NWN; + varbinds[0].len_oid = sizeof(sysDescr_NWN); + varbinds[0].value = NULL; + varbinds[0].len_val = 0; + varbinds[0].type = NULL_VALUE; + if (snmp(varbinds, 1, GET) > 0) { + ap_type = NWN; + } else { + varbinds[0].oid = sysDescr_ATMEL; + varbinds[0].len_oid = sizeof(sysDescr_ATMEL); + varbinds[0].value = NULL; + varbinds[0].len_val = 0; + varbinds[0].type = NULL_VALUE; + if (snmp(varbinds, 1, GET) > 0) { + ap_type = ATMEL410; + } else { + sysDescr_ATMEL[5] = 0xE0; + sysDescr_ATMEL[6] = 0x3E; + varbinds[0].oid = sysDescr_ATMEL; + varbinds[0].len_oid = sizeof(sysDescr_ATMEL); + varbinds[0].value = NULL; + varbinds[0].len_val = 0; + varbinds[0].type = NULL_VALUE; + if (snmp(varbinds, 1, GET) > 0) { + ap_type = ATMEL12350; + } else { + print_helperr(_("Unable to determine AP type " + "(no response). Press any key.")); + getch(); + return -1; + } + } + } + + /* + * It is best to do the following HERE and FOR ONCE ONLY: find out more + * about specific MIB modifications - we'll use them on different places + * later. + */ + IS_ATMEL410_SBRIDGES = 0; + IS_ATMEL12350_TELLUS = 0; + IS_ATMEL12350_VERNET = 0; + + varbinds[0].type = NULL_VALUE; + varbinds[0].oid = operEthernetAddress_ATMEL; + varbinds[0].len_oid = sizeof(operEthernetAddress_ATMEL); + varbinds[0].len_val = 0; + varbinds[1].type = NULL_VALUE; + varbinds[1].oid = Wireless_ATMEL; + varbinds[1].len_oid = sizeof(Wireless_ATMEL); + varbinds[1].len_val = 0; + if (ap_type == ATMEL12350) { + operEthernetAddress_ATMEL[5] = 0xE0; + operEthernetAddress_ATMEL[6] = 0x3E; + Wireless_ATMEL[5] = 0xE0; + Wireless_ATMEL[6] = 0x3E; + } + if (snmp(varbinds, 2, GET) <= 0) { + print_helperr(ERR_RET); + getch(); + return -1; + } + + /* detection of different vendor-modified ATMEL private MIBs */ + if (ap_type == ATMEL410 && (memcmp(oui_sbridges, varbinds[0].value, 3) ==0)) + IS_ATMEL410_SBRIDGES = 1; + + if (ap_type == ATMEL12350 && (memcmp(oui_tellus, varbinds[0].value, 3) ==0)) + IS_ATMEL12350_TELLUS = 1; + + if (ap_type == ATMEL12350 && varbinds[1].len_val == 104) + IS_ATMEL12350_VERNET = 1; + + return 0; +} + void exit_program() { endwin();