]> git.decadent.org.uk Git - ap-utils.git/blobdiff - lib/ap_search.c
Imported Upstream version 1.5
[ap-utils.git] / lib / ap_search.c
index 7c41718bc25a61ddcc723ed554b8cbc0e6f51f1b..be1e09dffa25d037b5b19c10b93907b9055093c8 100644 (file)
@@ -2,7 +2,7 @@
  *      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 <sys/socket.h>
 #endif
 
+#include <sys/socket.h>
 #include <net/if.h>
 #include <sys/time.h>
 #include <errno.h>
 #include "ap-utils.h"
-#include "ap-curses.h"
+#include "config.h"
 
 #if defined (__GLIBC__)
 #include <libgen.h>
 #endif
 
-
-#define MAX_APS 10
-#define SEARCH_HEADER _("#       Type              IP          Description")
+#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_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)
@@ -63,16 +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;
+    /* 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 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}
+    };
+*/
     /*
-     * sysDescr OIDs used to detect AP type [in order of appearance
-     * according to the 'for' loop below: ATMEL410, NWN, ATMEL12350
+     * note: we'll rather use sysDescr OID for probing, becouse the devices
+     * wont rely on correct community for this query
      */
-    char Wireless[3][12] = {
+    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 {
@@ -88,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;
     }
@@ -116,28 +134,31 @@ 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;
+       last_searched_type = ATMEL410;
     }  
     
     for (scd_ap_type = ATMEL410; scd_ap_type <= last_searched_type; scd_ap_type++) {
-       clear_main_new(19, 20);
-       sprintf(message, _("Scanning for AP type: %s"), ap_types[scd_ap_type]);
-       mvwaddstr(main_sub, 19, 1, message);
+       clear_main_new(LAST_ROW - 1, LAST_ROW);
+       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 = Wireless[scd_ap_type];
-       varbinds[0].len_oid =
-           (scd_ap_type == ATMEL410 || scd_ap_type == ATMEL12350) ?
-           sizeof(Wireless[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);
@@ -196,7 +217,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;
                }
            }
@@ -270,17 +291,49 @@ 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],
-               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 < varbinds[0].len_val && start[len]; len++)
-               mvwaddch(main_sub, i, len + 31, start[len]);
            wrefresh(main_sub);
 
            /* Bail out if the number of found devices exceeds sane limit. */
@@ -307,17 +360,32 @@ void ap_search()
     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;
     }
 
     i = f_ifctr = 0;
+    fapsa = NULL;
 
     /*
      * Find all IPs of locally available IPv4 interfaces and corresponding
@@ -395,7 +463,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, */
@@ -403,8 +471,8 @@ void ap_search()
            break;
 
        /* or if someone pressed 'Q'. */
-       if (q_press) {
-           q_press = 0;
+       if (q_pressed) {
+           q_pressed = 0;
            break;
        }
     }
@@ -418,8 +486,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"));
@@ -438,12 +506,15 @@ void ap_search()
                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(old_community); */
+                   connect_options(fapsa[ac - '0'].ip.s_addr,
+                       fapsa[ac - '0'].type + 1);
+                   free(fapsa);
                    return;
            }
     }
@@ -454,8 +525,13 @@ quit:
     if (ifbuf_ptr)
        free(ifbuf_ptr);
 
+    if (fapsa)
+       free(fapsa);
+/*
+    free(community);
+    community = old_community;
+*/
     print_help("");
-    print_title("");
+    print_top(NULL, NULL);
     clear_main(0);
 }
-