* ap_search.c from Access Point SNMP Utils for Linux
*
* Copyright (c) 2002 Roman Festchook <roma at polesye dot net>
- * Copyright (c) 2003 Jan Rafaj <aputils at cedric dot vabo dot cz>
+ * Copyright (c) 2003 Jan Rafaj <jr-aputils at cedric dot unob dot cz>
*
* 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
#include <errno.h>
#include "ap-utils.h"
#include "config.h"
-#include "ap-curses.h"
#if defined (__GLIBC__)
#include <libgen.h>
#endif
-
-#define SEARCH_HEADER _(" # Type IP Name")
-
+#define SEARCH_COMMUNITY _("Community name: ")
+#define SEARCH_HEADER _(" NUM IP ADDRESS MIB TYPE FW TYPE (VERSION) AP NAME")
#define MAX_APS LAST_ROW-7
extern int atmel410_filter;
+extern char *community;
char q_pressed = 0;
int i, f_ifctr;
extern WINDOW *main_sub;
extern char *ap_types[];
unsigned char message[1024], *start;
-/*
- 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}
- };
-*/
+ /* unsigned char name_fw[256], *name_p, *fwver_p; */
+ extern int atmel410_filter; /* if called from ap-gl utility */
+
+
/*
- * operAccessPointName OIDs used to detect AP type [in order of appearance
- * according to the 'for' loop below: ATMEL410, NWN, ATMEL12350]
+ * operAccessPointName OIDs used to detect AP MIB type [in order
+ * of appearance in 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}
};
+*/
+ /*
+ * 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 scd_ap_type, last_searched_type = ATMEL12350;
int c, s2, errno, len, client_len = SIZE;
struct in_addr to_addr_reserv;
struct sopts {
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;
}
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++) {
clear_main_new(LAST_ROW - 1, LAST_ROW);
- sprintf(message, _("Scanning for AP type: %s"), ap_types[scd_ap_type]);
+ sprintf(message, _("Scanning for AP with MIB type: %s"),
+ ap_types[scd_ap_type]);
mvwaddstr(main_sub, LAST_ROW - 1, 1, message);
wrefresh(main_sub);
- varbinds[0].oid = operAccessPointName[scd_ap_type];
- varbinds[0].len_oid =
- (scd_ap_type == ATMEL410 || scd_ap_type == ATMEL12350) ?
- sizeof(operAccessPointName[scd_ap_type]) : 8;
+/* varbinds[0].oid = operAccessPointName[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(sysDescr[scd_ap_type]));
varbinds[0].len_val = 0;
varbinds[0].type = NULL_VALUE;
len = ber(message, varbinds, 1, GET);
fapsa[i].ip = from->sin_addr;
fapsa[i].type = scd_ap_type;
- sprintf(message, "%2i %11s %15s", i, ap_types[fapsa[i].type],
- inet_ntoa(fapsa[i].ip));
+ for (len = 0; len < varbinds[0].len_val && start[len]; len++);
+ start[len + 1] = '\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++;
mvwaddstr(main_sub, i, 0, message);
-
- 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. */
struct ifconf ifc;
struct ifreq *ifr;
char *ifbuf_ptr = NULL, *ifrec_ptr;
+/*
+ char *old_community;
+ char buf[16];
- print_title(_("Access Points Search"));
+ print_help(_("Please enter SNMP community name that will be used for AP "
+ "detection."));
+ mvwaddstr(main_sub, 0, 2, SEARCH_COMMUNITY);
+ wrefresh(main_sub);
+ get_pass(buf, 0, 2 + strlen(SEARCH_COMMUNITY), sizeof(buf));
+ old_community = community;
+ community = malloc(strlen(buf) + 1);
+ 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;
}
case '7':
case '8':
case '9':
- if (ac-'0' > (i - 1))
+ if (ac - '0' > (i - 1))
continue;
- print_title("");
+
+ print_top(NULL, NULL);
clear_main(0);
- connect_options(fapsa[ac-'0'].ip.s_addr,
- fapsa[ac-'0'].type + 1);
- free(fapsa);
+/* free(old_community); */
+ connect_options(fapsa[ac - '0'].ip.s_addr,
+ fapsa[ac - '0'].type + 1);
+ free(fapsa);
return;
}
}
if (fapsa)
free(fapsa);
-
+/*
+ free(community);
+ community = old_community;
+*/
print_help("");
- print_title("");
+ print_top(NULL, NULL);
clear_main(0);
}
-