X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ap-utils.git;a=blobdiff_plain;f=lib%2Fap_search.c;fp=lib%2Fap_search.c;h=be1e09dffa25d037b5b19c10b93907b9055093c8;hp=a633d0d2cf339d8e50558b0d68c63f0d49f31a2f;hb=1aac4ac30a9a0d6cd2182013d2b3fd48b65ed2fd;hpb=5c77e013a46530bb3650f61d768dfed0dd3b72cb diff --git a/lib/ap_search.c b/lib/ap_search.c index a633d0d..be1e09d 100644 --- a/lib/ap_search.c +++ b/lib/ap_search.c @@ -2,7 +2,7 @@ * ap_search.c from Access Point SNMP Utils for Linux * * Copyright (c) 2002 Roman Festchook - * Copyright (c) 2003 Jan Rafaj + * Copyright (c) 2003 Jan Rafaj * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License Version 2 from @@ -46,7 +46,7 @@ #endif #define SEARCH_COMMUNITY _("Community name: ") -#define SEARCH_HEADER _(" NUM IP ADDRESS MIB TYPE NAME") +#define SEARCH_HEADER _(" NUM IP ADDRESS MIB TYPE FW TYPE (VERSION) AP NAME") #define MAX_APS LAST_ROW-7 extern int atmel410_filter; @@ -65,26 +65,32 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, extern WINDOW *main_sub; extern char *ap_types[]; unsigned char message[1024], *start; - extern int atmel410_filter; /* to check is this function called from ap-gl utility */ + /* unsigned char name_fw[256], *name_p, *fwver_p; */ + extern int atmel410_filter; /* if called from ap-gl utility */ - char Wireless[3][12] = { - {0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x01, 0x01, 0x00}, - {0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00}, - {0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x01, 0x01, 0x01, 0x00} - }; - /* * operAccessPointName OIDs used to detect AP MIB type [in order * of appearance in the 'for' loop below: ATMEL410, NWN, ATMEL12350] */ -/* char operAccessPointName[3][12] = { +/* + char operAccessPointName[3][12] = { {0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0A, 0x00}, {0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x05, 0x00}, {0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x0A, 0x00} }; */ - int scd_ap_type, last_searched_type=ATMEL12350; + /* + * note: we'll rather use sysDescr OID for probing, becouse the devices + * wont rely on correct community for this query + */ + char sysDescr[3][12] = { + {0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x01, 0x01, 0x00}, + {0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00}, + {0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x01, 0x01, 0x01, 0x00} + }; + + int scd_ap_type, last_searched_type = ATMEL12350; int c, s2, errno, len, client_len = SIZE; struct in_addr to_addr_reserv; struct sopts { @@ -100,13 +106,13 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, print_help(_("Please wait while scanning, or press 'Q' to quit.")); if ((s2 = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { - print_helperr(CREATE_SOCKET_ERROR); + print_helperr(ERR_SOCKET); getch(); return; } if (bind(s2, (struct sockaddr *) from, SIZE) == -1) { - print_helperr(BIND_SOCKET_ERROR); + print_helperr(ERR_SOCKET); getch(); goto close_ret; } @@ -138,7 +144,7 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, mvwaddstr(main_sub, LAST_ROW - 2, 1, message); if(atmel410_filter) { - last_searched_type=ATMEL410; + last_searched_type = ATMEL410; } for (scd_ap_type = ATMEL410; scd_ap_type <= last_searched_type; scd_ap_type++) { @@ -149,10 +155,10 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, wrefresh(main_sub); /* varbinds[0].oid = operAccessPointName[scd_ap_type];*/ - varbinds[0].oid = Wireless[scd_ap_type]; + varbinds[0].oid = sysDescr[scd_ap_type]; varbinds[0].len_oid = (scd_ap_type == NWN ? /* 8 : sizeof(operAccessPointName[scd_ap_type]));*/ - 8 : sizeof(Wireless[scd_ap_type])); + 8 : sizeof(sysDescr[scd_ap_type])); varbinds[0].len_val = 0; varbinds[0].type = NULL_VALUE; len = ber(message, varbinds, 1, GET); @@ -292,11 +298,37 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, for (len = 0; len < varbinds[0].len_val && start[len]; len++); start[len + 1] = '\0'; - if (len > 25) { - /* Truncate (limited screen size) and screen-width independent! */ - start[COLS-53-atmel410_filter] = '>'; - start[COLS-52-atmel410_filter] = '\0'; + + /* + * Returned sysDescr string is (hopefully!) always of format: + * string1 (Ver. string2) string3 + * where: + * string1 = "802.11 X " + * where: "X" identifies firmware type (AP, APP, WB, WA, etc) + * unfortunately this is not deterministic across + * manufacturers (each one uses different naming scheme) + * string2 = firmware version + * string3 = device name, as defined with operAccessPointName + * OID + name_p = strchr(start, ')'); + *name_p = '\0'; + name_p += 2; + fwver_p = strstr(start, "(Ver. "); + fwver_p += strlen("(Ver. "); + sprintf(name_fw, "%s (%s)", name_p, fwver_p); + + if (strlen(name_fw) > (size_t)(COLS - MCOLS - 37)) { + name_fw[COLS - MCOLS - 38] = '>'; + name_fw[COLS - MCOLS - 37] = '\0'; + } + */ + + if (strlen(start) > (size_t)(COLS - MCOLS - 37)) { + /* truncate (limit to scr. size) */ + start[COLS - MCOLS - 38] = '>'; + start[COLS - MCOLS - 37] = '\0'; } + sprintf(message, " %3i %-15s %-10s %s", i, inet_ntoa(fapsa[i].ip), ap_types[fapsa[i].type], start); i++; @@ -328,6 +360,7 @@ void ap_search() struct ifconf ifc; struct ifreq *ifr; char *ifbuf_ptr = NULL, *ifrec_ptr; +/* char *old_community; char buf[16]; @@ -341,13 +374,13 @@ void ap_search() strncpy(community, buf, strlen(buf) + 1); print_help(""); clear_main(0); - +*/ print_top(NULL, _("Access Points Search")); mvwaddstr(main_sub, 0, 0, SEARCH_HEADER); wrefresh(main_sub); if ((s1 = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { - print_helperr(CREATE_SOCKET_ERROR); + print_helperr(ERR_SOCKET); goto wait_quit; } @@ -478,7 +511,7 @@ void ap_search() print_top(NULL, NULL); clear_main(0); - free(old_community); +/* free(old_community); */ connect_options(fapsa[ac - '0'].ip.s_addr, fapsa[ac - '0'].type + 1); free(fapsa); @@ -494,12 +527,11 @@ quit: if (fapsa) free(fapsa); - +/* free(community); community = old_community; - +*/ print_help(""); print_top(NULL, NULL); clear_main(0); } -