X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ap-utils.git;a=blobdiff_plain;f=lib%2Fap_search.c;h=13d67be672b8e4acd1affbf1a4823e5ab9b84414;hp=b6bf9b0526193f07524d4f700ae3707862a4c792;hb=67fc54773e1504698e80c9cb83977bde32665350;hpb=6a9e980b8799891e0a5467a0126a60b169c8f4eb diff --git a/lib/ap_search.c b/lib/ap_search.c index b6bf9b0..13d67be 100644 --- a/lib/ap_search.c +++ b/lib/ap_search.c @@ -34,6 +34,7 @@ #include #endif +#include #include #include #include @@ -46,17 +47,18 @@ #endif -#define MAX_APS 10 -#define SEARCH_HEADER _("# Type IP Description") +#define SEARCH_HEADER _(" # Type IP Name") + +#define MAX_APS LAST_ROW-7 extern int atmel410_filter; -char q_press = 0; +char q_pressed = 0; int i, f_ifctr; struct faps { struct in_addr ip; int type; -} fapsa[MAX_APS]; +} *fapsa; void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, char *ifname) @@ -64,15 +66,23 @@ 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; - /* - * sysDescr OIDs used to detect AP type [in order of appearance - * according to the 'for' loop below: ATMEL410, NWN, ATMEL12350 - */ +/* 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 type [in order of appearance + * according to the 'for' loop below: ATMEL410, NWN, ATMEL12350] + */ + 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; int c, s2, errno, len, client_len = SIZE; struct in_addr to_addr_reserv; @@ -117,28 +127,29 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, goto close_ret; } - mvwaddstr(main_sub, 15, 1, _("Scanning via network interface:")); + mvwaddstr(main_sub, LAST_ROW - 5, 1, + _("Scanning via network interface:")); sprintf(message, _(" Index: %i"), f_ifctr); - mvwaddstr(main_sub, 16, 1, message); + mvwaddstr(main_sub, LAST_ROW - 4, 1, message); sprintf(message, _(" Name: %s"), ifname); - mvwaddstr(main_sub, 17, 1, message); + mvwaddstr(main_sub, LAST_ROW - 3, 1, message); sprintf(message, _(" IP: %s"), inet_ntoa(from->sin_addr)); - mvwaddstr(main_sub, 18, 1, message); + mvwaddstr(main_sub, LAST_ROW - 2, 1, message); if(atmel410_filter) { last_searched_type=ATMEL410; } for (scd_ap_type = ATMEL410; scd_ap_type <= last_searched_type; scd_ap_type++) { - clear_main_new(19, 20); + clear_main_new(LAST_ROW - 1, LAST_ROW); sprintf(message, _("Scanning for AP type: %s"), ap_types[scd_ap_type]); - mvwaddstr(main_sub, 19, 1, message); + mvwaddstr(main_sub, LAST_ROW - 1, 1, message); wrefresh(main_sub); - varbinds[0].oid = Wireless[scd_ap_type]; + varbinds[0].oid = operAccessPointName[scd_ap_type]; varbinds[0].len_oid = (scd_ap_type == ATMEL410 || scd_ap_type == ATMEL12350) ? - sizeof(Wireless[scd_ap_type]) : 8; + sizeof(operAccessPointName[scd_ap_type]) : 8; varbinds[0].len_val = 0; varbinds[0].type = NULL_VALUE; len = ber(message, varbinds, 1, GET); @@ -197,7 +208,7 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, if (FD_ISSET(0, &rds)) { c = getc(stdin); if (c == 'q' || c == 'Q') { - q_press = 1; + q_pressed = 1; goto close_ret; } } @@ -271,17 +282,21 @@ void scan_local_segment (struct sockaddr_in *from, struct sockaddr_in *to, /* new AP (unique IP/APtype pair) found */ + fapsa = realloc(fapsa, (i + 1) * sizeof(struct faps)); + fapsa[i].ip = from->sin_addr; fapsa[i].type = scd_ap_type; - sprintf(message, "%2X %11s %15s", i, ap_types[fapsa[i].type], + sprintf(message, "%2i %11s %15s", i, ap_types[fapsa[i].type], inet_ntoa(fapsa[i].ip)); i++; mvwaddstr(main_sub, i, 0, message); - for (len = 0; len < varbinds[0].len_val && start[len]; len++) - mvwaddch(main_sub, i, len + 31, start[len]); + + for (len = 0; len < 32 && start[len]; len++); + start[len + 1] = '\0'; + mvwaddstr(main_sub, i, 30 + ((32 - len) / 2), start); wrefresh(main_sub); /* Bail out if the number of found devices exceeds sane limit. */ @@ -319,6 +334,7 @@ void ap_search() } i = f_ifctr = 0; + fapsa = NULL; /* * Find all IPs of locally available IPv4 interfaces and corresponding @@ -396,7 +412,7 @@ void ap_search() from.sin_port = INADDR_ANY; to.sin_port = htons(161); scan_local_segment(&from, &to, ifr->ifr_name); - clear_main_new(15, 20); + clear_main_new(LAST_ROW - 5, LAST_ROW); } ifrec_ptr += ilen; /* No need to process next interfaces if the table is already full, */ @@ -404,8 +420,8 @@ void ap_search() break; /* or if someone pressed 'Q'. */ - if (q_press) { - q_press = 0; + if (q_pressed) { + q_pressed = 0; break; } } @@ -419,8 +435,8 @@ void ap_search() "Press any key.")); } else { if (i == MAX_APS) - mvwaddstr(main_sub, 19, 1, _("Program-hardcoded maximum number " - "of APs found.")); + mvwaddstr(main_sub, LAST_ROW - 1, 1, + _("Single-screen maximum number of APs found.")); wrefresh(main_sub); print_help(_("# - connect to AP; Q - quit")); @@ -445,6 +461,7 @@ void ap_search() clear_main(0); connect_options(fapsa[ac-'0'].ip.s_addr, fapsa[ac-'0'].type + 1); + free(fapsa); return; } } @@ -455,6 +472,9 @@ quit: if (ifbuf_ptr) free(ifbuf_ptr); + if (fapsa) + free(fapsa); + print_help(""); print_title(""); clear_main(0);