]> git.decadent.org.uk Git - ap-utils.git/blobdiff - lib/ap_search.c
Imported Upstream version 1.4.2~pre2~a
[ap-utils.git] / lib / ap_search.c
index b6bf9b0526193f07524d4f700ae3707862a4c792..13d67be672b8e4acd1affbf1a4823e5ab9b84414 100644 (file)
@@ -34,6 +34,7 @@
 #include <sys/socket.h>
 #endif
 
+#include <sys/socket.h>
 #include <net/if.h>
 #include <sys/time.h>
 #include <errno.h>
 #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);