update kismet package and fix broken ssid handling
authorFelix Fietkau <nbd@openwrt.org>
Tue, 23 Aug 2005 00:06:14 +0000 (00:06 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 23 Aug 2005 00:06:14 +0000 (00:06 +0000)
SVN-Revision: 1728

openwrt/package/kismet/Makefile
openwrt/package/kismet/patches/100-cleanup.patch [deleted file]
openwrt/package/kismet/patches/100-wrt54g_source.patch [new file with mode: 0644]
openwrt/package/kismet/patches/120-cleanup.patch [new file with mode: 0644]
openwrt/package/kismet/patches/120-wrt54g_source.patch [deleted file]

index 0cd3299d78834e9a3fe0540c8cfbe5cc3ffad4a5..dab9e02781b122edea5da96de8a2c5e1eb22821c 100644 (file)
@@ -3,9 +3,9 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=kismet
-PKG_VERSION:=2005-07-R1a
+PKG_VERSION:=2005-08-R1
 PKG_RELEASE:=1
-PKG_MD5SUM:=9f59bce7d6cc8504ff602f150e578ab5
+PKG_MD5SUM:=17edb7688e04dd28028d5268a77d0ce7
 
 PKG_SOURCE_URL:=http://www.kismetwireless.net/code
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
diff --git a/openwrt/package/kismet/patches/100-cleanup.patch b/openwrt/package/kismet/patches/100-cleanup.patch
deleted file mode 100644 (file)
index d018fdf..0000000
+++ /dev/null
@@ -1,3958 +0,0 @@
-diff -urN kismet.old/Makefile.in kismet.dev/Makefile.in
---- kismet.old/Makefile.in     2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/Makefile.in     2005-08-15 00:16:38.100369736 +0200
-@@ -39,26 +39,26 @@
- DEPEND        = .depend
- # Objects
--PSO   = util.o ringbuf.o configfile.o speech.o ifcontrol.o iwcontrol.o packet.o \
--              pcapsource.o prism2source.o wtapfilesource.o wsp100source.o \
--              dronesource.o vihasource.o packetsourcetracker.o kis_packsources.o \
--              wtapdump.o wtaplocaldump.o gpsdump.o airsnortdump.o fifodump.o \
--              gpsd.o manuf.o \
-+PSO   = util.o ringbuf.o configfile.o ifcontrol.o iwcontrol.o packet.o \
-+              pcapsource.o \
-+              dronesource.o packetsourcetracker.o kis_packsources.o \
-+              wtaplocaldump.o fifodump.o \
-+              manuf.o \
-               packetracker.o timetracker.o alertracker.o finitestate.o \
-               getopt.o \
-               tcpserver.o server_protocols.o server_globals.o kismet_server.o 
- PS    = kismet_server
- DRONEO = util.o ringbuf.o configfile.o getopt.o ifcontrol.o iwcontrol.o packet.o \
--              tcpstreamer.o prism2source.o pcapsource.o wtapfilesource.o wsp100source.o \
--              dronesource.o vihasource.o packetsourcetracker.o kis_packsources.o \
--              timetracker.o gpsd.o server_globals.o kismet_drone.o
-+              tcpstreamer.o pcapsource.o wtapfilesource.o \
-+              dronesource.o packetsourcetracker.o kis_packsources.o \
-+              timetracker.o server_globals.o kismet_drone.o
- DRONE = kismet_drone
- NCO   = util.o configfile.o speech.o manuf.o tcpclient.o \
-               frontend.o cursesfront.o \
-               panelfront.o panelfront_display.o panelfront_input.o \
--              gpsd.o getopt.o kismet_client.o 
-+              getopt.o kismet_client.o 
- NC    = kismet_client
- GPSLO = getopt.o util.o configfile.o expat.o manuf.o \
-diff -urN kismet.old/cursesfront.cc kismet.dev/cursesfront.cc
---- kismet.old/cursesfront.cc  2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/cursesfront.cc  2005-08-15 01:08:49.461799648 +0200
-@@ -30,7 +30,6 @@
- // Enable the protocols we can use
- void NCurseFront::AddClient(TcpClient *in_client) {
-     client = in_client;
--    client->EnableProtocol("GPS");
-     client->EnableProtocol("INFO");
-     client->EnableProtocol("REMOVE");
-     client->EnableProtocol("NETWORK");
-@@ -88,32 +87,8 @@
-         mvwaddstr(netborder, 1, 2, "  SSID                        T W Ch  Data   LLC  Crypt  Wk Flags");
-     }
--    char gpsdata[1024];
--    float lat, lon, alt, spd, heading;
-     int mode;
--    client->FetchLoc(&lat, &lon, &alt, &spd, &heading, &mode);
--
--    if (!(lat == 0 && lon == 0 && alt == 0 && spd == 0 && mode == 0)) {
--
--        char fix[16];
--
--        if (mode == -1)
--            snprintf(fix, 16, "No signal");
--        else if (mode == 2)
--            snprintf(fix, 5, "2D");
--        else if (mode == 3)
--            snprintf(fix, 5, "3D");
--        else
--            snprintf(fix, 5, "NONE");
--
--        snprintf(gpsdata, 1024, "Lat %.3f Lon %.3f Alt %.3f Spd %.3f Fix %s",
--                 lat, lon, alt, spd, fix);
--
--        mvwaddstr(netborder, LINES-statheight-1, 2, gpsdata);
--
--    }
--
-     box(infoborder, '|', '-');
-     mvwaddstr(infoborder, 0, 2, "Info");
-diff -urN kismet.old/dronesource.cc kismet.dev/dronesource.cc
---- kismet.old/dronesource.cc  2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/dronesource.cc  2005-08-15 00:06:41.235746912 +0200
-@@ -201,9 +201,6 @@
-             return -1;
-         }
--              // Grab the GPS info
--              gps_enabled = vpkt.gps_enabled;
--
-         stream_recv_bytes = 0;
-         // printf("debug - version packet valid\n\n");
-@@ -336,25 +333,6 @@
-     packet->encoding = (encoding_type) phdr.encoding;
-     packet->datarate = (uint32_t) ntohl(phdr.datarate);
--      if (gps_enabled) {
--              // If the drone is sending us GPS data, use it
--              packet->gps_lat = Pair2Float((int16_t) ntohs(phdr.gps_lat),
--                                                                       (int64_t) kis_ntoh64(phdr.gps_lat_mant));
--              packet->gps_lon = Pair2Float((int16_t) ntohs(phdr.gps_lon),
--                                                                       (int64_t) kis_ntoh64(phdr.gps_lon_mant));
--              packet->gps_alt = Pair2Float((int16_t) ntohs(phdr.gps_alt),
--                                                                       (int64_t) kis_ntoh64(phdr.gps_alt_mant));
--              packet->gps_spd = Pair2Float((int16_t) ntohs(phdr.gps_spd),
--                                                                       (int64_t) kis_ntoh64(phdr.gps_spd_mant));
--              packet->gps_heading = Pair2Float((int16_t) ntohs(phdr.gps_heading),
--                                                                               (int64_t) kis_ntoh64(phdr.gps_heading_mant));
--              packet->gps_fix = phdr.gps_fix;
--      } else if (gpsd != NULL) {
--              // Otherwise, no
--              gpsd->FetchLoc(&packet->gps_lat, &packet->gps_lon, &packet->gps_alt,
--                                         &packet->gps_spd, &packet->gps_heading, &packet->gps_fix);
--      }
--
-     packet->data = data;
-     packet->moddata = moddata;
-     packet->modified = 0;
-diff -urN kismet.old/dronesource.h kismet.dev/dronesource.h
---- kismet.old/dronesource.h   2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/dronesource.h   2005-08-15 00:06:56.589412800 +0200
-@@ -80,8 +80,6 @@
-     unsigned int resyncing;
--      // Is the drone pushing GPS data to us?
--      int gps_enabled;
- };
- // Nothing but a registrant for us
-diff -urN kismet.old/frontend.cc kismet.dev/frontend.cc
---- kismet.old/frontend.cc     2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/frontend.cc     2005-08-15 01:07:50.236803216 +0200
-@@ -248,33 +248,6 @@
-             }
--            // Aggregate the GPS data
--            if (wnet->aggregate_points > 0) {
--                dnet->virtnet->aggregate_lat += wnet->aggregate_lat;
--                dnet->virtnet->aggregate_lon += wnet->aggregate_lon;
--                dnet->virtnet->aggregate_alt += wnet->aggregate_alt;
--                dnet->virtnet->aggregate_points += wnet->aggregate_points;
--            }
--
--            if (wnet->gps_fixed > dnet->virtnet->gps_fixed)
--                dnet->virtnet->gps_fixed = wnet->gps_fixed;
--            if (wnet->min_lat < dnet->virtnet->min_lat || dnet->virtnet->min_lat == 0)
--                dnet->virtnet->min_lat = wnet->min_lat;
--            if (wnet->min_lon < dnet->virtnet->min_lon || dnet->virtnet->min_lon == 0)
--                dnet->virtnet->min_lon = wnet->min_lon;
--            if (wnet->min_alt < dnet->virtnet->min_alt || dnet->virtnet->min_alt == 0)
--                dnet->virtnet->min_alt = wnet->min_alt;
--            if (wnet->min_spd < dnet->virtnet->min_spd || dnet->virtnet->min_spd == 0)
--                dnet->virtnet->min_spd = wnet->min_spd;
--            if (wnet->max_lat > dnet->virtnet->max_lat || dnet->virtnet->max_lat == 0)
--                dnet->virtnet->max_lat = wnet->max_lat;
--            if (wnet->max_lon > dnet->virtnet->max_lon || dnet->virtnet->max_lon == 0)
--                dnet->virtnet->max_lon = wnet->max_lon;
--            if (wnet->max_alt > dnet->virtnet->max_alt || dnet->virtnet->max_alt == 0)
--                dnet->virtnet->max_alt = wnet->max_alt;
--            if (wnet->max_spd > dnet->virtnet->max_spd || dnet->virtnet->max_spd == 0)
--                dnet->virtnet->max_spd = wnet->max_spd;
--
-             // Aggregate the carriers and encodings
-             dnet->virtnet->carrier_set |= wnet->carrier_set;
-             dnet->virtnet->encoding_set |= wnet->encoding_set;
-diff -urN kismet.old/kis_packsources.cc kismet.dev/kis_packsources.cc
---- kismet.old/kis_packsources.cc      2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/kis_packsources.cc      2005-08-15 00:15:11.107594648 +0200
-@@ -60,13 +60,6 @@
- #if defined(HAVE_LIBPCAP) && defined(HAVE_LINUX_WIRELESS)
-     // Linux wext-driven cards
--    sourcetracker->RegisterPacketsource("cisco", 1, "IEEE80211b", 6,
--                                       pcapsource_wext_registrant,
--                                       monitor_cisco, unmonitor_cisco, 
--                                       chancontrol_wext, 1);
--    sourcetracker->RegisterPacketsource("cisco_wifix", 1, "IEEE80211b", 6,
--                                       pcapsource_ciscowifix_registrant,
--                                       monitor_cisco_wifix, NULL, NULL, 1);
-     sourcetracker->RegisterPacketsource("hostap", 1, "IEEE80211b", 6,
-                                        pcapsource_wext_registrant,
-                                        monitor_hostap, unmonitor_hostap, 
-@@ -79,6 +72,14 @@
-                                         pcapsource_wext_registrant,
-                                         monitor_orinoco, unmonitor_orinoco,
-                                         chancontrol_orinoco, 1);
-+#if 0
-+    sourcetracker->RegisterPacketsource("cisco", 1, "IEEE80211b", 6,
-+                                       pcapsource_wext_registrant,
-+                                       monitor_cisco, unmonitor_cisco, 
-+                                       chancontrol_wext, 1);
-+    sourcetracker->RegisterPacketsource("cisco_wifix", 1, "IEEE80211b", 6,
-+                                       pcapsource_ciscowifix_registrant,
-+                                       monitor_cisco_wifix, NULL, NULL, 1);
-     sourcetracker->RegisterPacketsource("acx100", 1, "IEEE80211b", 6,
-                                        pcapsource_wextfcs_registrant,
-                                        monitor_acx100, unmonitor_acx100, 
-@@ -94,7 +95,13 @@
-                                        pcapsource_wext_registrant,
-                                        monitor_wext, unmonitor_wext, 
-                                        chancontrol_wext, 1);
--
-+#else
-+    REG_EMPTY_CARD(sourcetracker, "cisco");
-+    REG_EMPTY_CARD(sourcetracker, "cisco_wifix");
-+    REG_EMPTY_CARD(sourcetracker, "acx100");
-+    REG_EMPTY_CARD(sourcetracker, "vtar5k");
-+#endif
-+    
-     sourcetracker->RegisterPacketsource("madwifi_a", 1, "IEEE80211a", 36,
-                                         pcapsource_wextfcs_registrant,
-                                         monitor_madwifi_a, unmonitor_madwifi, 
-@@ -121,11 +128,12 @@
-                                         monitor_prism54g, unmonitor_prism54g,
-                                         chancontrol_prism54g, 1);
-+#if 0
-     sourcetracker->RegisterPacketsource("wlanng_wext", 1, "IEEE80211b", 6,
-                                         pcapsource_wlanng_registrant,
-                                         monitor_wlanng_avs, NULL,
-                                         chancontrol_wext, 1);
--
-+    
-     sourcetracker->RegisterPacketsource("ipw2100", 1, "IEEE80211b", 6,
-                                         pcapsource_wext_registrant,
-                                         monitor_ipw2100, unmonitor_ipw2100,
-@@ -153,6 +161,16 @@
-                                         pcapsource_wext_registrant,
-                                         monitor_wext, unmonitor_wext,
-                                         chancontrol_wext, 1);
-+#else
-+    REG_EMPTY_CARD(sourcetracker, "wlanng_wext");
-+    REG_EMPTY_CARD(sourcetracker, "ipw2100");
-+    REG_EMPTY_CARD(sourcetracker, "ipw2200");
-+    REG_EMPTY_CARD(sourcetracker, "ipw2915");
-+
-+    REG_EMPTY_CARD(sourcetracker, "rt2400");
-+    REG_EMPTY_CARD(sourcetracker, "rt2500");
-+    REG_EMPTY_CARD(sourcetracker, "rt8180");
-+#endif
- #else
-     // Register the linuxwireless pcap stuff as null
-@@ -183,6 +201,7 @@
- #endif
- #if defined(HAVE_LIBPCAP) && defined(SYS_LINUX)
-+#if 0
-     sourcetracker->RegisterPacketsource("wlanng", 1, "IEEE80211b", 6,
-                                        pcapsource_wlanng_registrant,
-                                        monitor_wlanng, NULL, chancontrol_wlanng, 1);
-@@ -190,6 +209,10 @@
-                                        pcapsource_wlanng_registrant,
-                                        monitor_wlanng_avs, NULL,
-                                        chancontrol_wlanng_avs, 1);
-+#else
-+    REG_EMPTY_CARD(sourcetracker, "wlanng");
-+    REG_EMPTY_CARD(sourcetracker, "wlanng_avs");
-+#endif
-     sourcetracker->RegisterPacketsource("wrt54g", 1, "na", 0,
-                                         pcapsource_wrt54g_registrant,
-                                         monitor_wrt54g, NULL, NULL, 0);
-@@ -199,7 +222,8 @@
-     REG_EMPTY_CARD(sourcetracker, "wrt54g");
- #endif
--#if defined(SYS_LINUX) && defined(HAVE_LINUX_NETLINK)
-+//#if defined(SYS_LINUX) && defined(HAVE_LINUX_NETLINK)
-+#if 0
-     sourcetracker->RegisterPacketsource("wlanng_legacy", 1, "IEEE80211b", 6,
-                                         prism2source_registrant,
-                                         monitor_wlanng_legacy, NULL,
-@@ -240,7 +264,8 @@
-     REG_EMPTY_CARD(sourcetracker, "radiotap_bsd_b");
- #endif
--#if defined(HAVE_LIBWIRETAP)
-+// #if defined(HAVE_LIBWIRETAP)
-+#if 0
-     sourcetracker->RegisterPacketsource("wtapfile", 0, "na", 0,
-                                        wtapfilesource_registrant,
-                                        NULL, NULL, NULL, 0);
-@@ -248,7 +273,8 @@
-     REG_EMPTY_CARD(sourcetracker, "wtapfile");
- #endif
--#if defined(HAVE_WSP100)
-+#if 0    
-+//#if defined(HAVE_WSP100)
-     sourcetracker->RegisterPacketsource("wsp100", 0, "IEEE80211b", 6,
-                                         wsp100source_registrant,
-                                         monitor_wsp100, NULL, chancontrol_wsp100, 0);
-@@ -256,7 +282,9 @@
-     REG_EMPTY_CARD(sourcetracker, "wsp100");
- #endif
--#if defined(HAVE_VIHAHEADERS)
-+
-+#if 0
-+//#if defined(HAVE_VIHAHEADERS)
-     sourcetracker->RegisterPacketsource("viha", 1, "IEEE80211b", 6,
-                                         vihasource_registrant,
-                                         NULL, NULL, chancontrol_viha, 0);
-diff -urN kismet.old/kis_packsources.h kismet.dev/kis_packsources.h
---- kismet.old/kis_packsources.h       2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/kis_packsources.h       2005-08-15 00:15:54.831947536 +0200
-@@ -22,11 +22,7 @@
- #include "config.h"
- #include "packetsource.h"
--#include "prism2source.h"
- #include "pcapsource.h"
--#include "wtapfilesource.h"
--#include "wsp100source.h"
--#include "vihasource.h"
- #include "dronesource.h"
- #include "packetsourcetracker.h"
-diff -urN kismet.old/kismet_client.cc kismet.dev/kismet_client.cc
---- kismet.old/kismet_client.cc        2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/kismet_client.cc        2005-08-15 00:20:21.533402752 +0200
-@@ -28,7 +28,6 @@
- #include "cursesfront.h"
- #include "panelfront.h"
- #include "configfile.h"
--#include "speech.h"
- #ifndef exec_name
- char *exec_name;
-@@ -47,11 +46,7 @@
- char *configfile;
- char *uiconfigfile;
- char *server = NULL;
--int sound = -1;
--int speech = -1;
- int flite = 0;
--int speech_encoding = 0;
--string speech_sentence_encrypted, speech_sentence_unencrypted;
- unsigned int metric = 0;
- unsigned int reconnect = 0;
-@@ -59,20 +54,9 @@
- string configdir, groupfile;
- FILE *group_file = NULL;
--// Pipe file descriptor pairs and fd's
--int soundpair[2];
--int speechpair[2];
--pid_t soundpid = -1, speechpid = -1;
--
- // Catch our interrupt
- void CatchShutdown(int sig) {
--    // Kill our sound players
--    if (soundpid > 0)
--        kill(soundpid, 9);
--    if (speechpid > 0)
--        kill(speechpid, 9);
--
-     if (group_track) {
-         if ((group_file = fopen(groupfile.c_str(), "w")) == NULL) {
-             fprintf(stderr, "WARNING: Unable to open '%s' for writing, groups will not be saved.\n",
-@@ -116,215 +100,6 @@
-     exit(0);
- }
--// Subprocess sound handler
--void SoundHandler(int *fds, const char *player, map<string, string> soundmap) {
--    int read_sock = fds[0];
--
--    close(fds[1]);
--
--    signal(SIGPIPE, PipeHandler);
--
--    fd_set rset;
--
--    char data[1024];
--
--    pid_t sndpid = -1;
--    int harvested = 1;
--
--    while (1) {
--        FD_ZERO(&rset);
--        FD_SET(read_sock, &rset);
--        char *end;
--
--        memset(data, 0, 1024);
--
--        if (harvested == 0) {
--            // We consider a wait error to be a sign that the child pid died
--            // so we flag it as harvested and keep on going
--            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
--            if (harvestpid == -1 || harvestpid == sndpid)
--                harvested = 1;
--        }
--
--        struct timeval tim;
--        tim.tv_sec = 1;
--        tim.tv_usec = 0;
--
--        if (select(read_sock + 1, &rset, NULL, NULL, &tim) < 0) {
--            if (errno != EINTR) {
--                exit(1);
--            }
--        }
--
--        if (FD_ISSET(read_sock, &rset)) {
--            int ret;
--            ret = read(read_sock, data, 1024);
--
--            // We'll die off if we get a read error, and we'll let kismet on the
--            // other side detact that it died
--            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
--                exit(1);
--
--            if ((end = strstr(data, "\n")) == NULL)
--                continue;
--
--            end[0] = '\0';
--        }
--
--        if (data[0] == '\0')
--            continue;
--
--        // If we've harvested the process, spawn a new one and watch it
--        // instead.  Otherwise, we just let go of the data we read
--        if (harvested == 1) {
--            // Only take the first line
--            char *nl;
--            if ((nl = strchr(data, '\n')) != NULL)
--                *nl = '\0';
--
--            char snd[1024];
--
--            if (soundmap.size() == 0)
--                snprintf(snd, 1024, "%s", data);
--            if (soundmap.find(data) != soundmap.end())
--                snprintf(snd, 1024, "%s", soundmap[data].c_str());
--            else
--                continue;
--
--            char plr[1024];
--            snprintf(plr, 1024, "%s", player);
--
--            harvested = 0;
--            if ((sndpid = fork()) == 0) {
--                // Suppress errors
--                int nulfd = open("/dev/null", O_RDWR);
--                dup2(nulfd, 1);
--                dup2(nulfd, 2);
--
--                char * const echoarg[] = { plr, snd, NULL };
--                execve(echoarg[0], echoarg, NULL);
--            }
--        }
--
--        data[0] = '\0';
--    }
--}
--
--// Subprocess speech handler
--void SpeechHandler(int *fds, const char *player) {
--    int read_sock = fds[0];
--    close(fds[1]);
--
--    fd_set rset;
--
--    char data[1024];
--
--    pid_t sndpid = -1;
--    int harvested = 1;
--
--    while (1) {
--        FD_ZERO(&rset);
--        FD_SET(read_sock, &rset);
--        //char *end;
--
--        memset(data, 0, 1024);
--
--        struct timeval tim;
--        tim.tv_sec = 1;
--        tim.tv_usec = 0;
--
--        if (select(read_sock + 1, &rset, NULL, NULL, &tim) < 0) {
--            if (errno != EINTR) {
--                exit(1);
--            }
--        }
--
--        if (harvested == 0) {
--            // We consider a wait error to be a sign that the child pid died
--            // so we flag it as harvested and keep on going
--            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
--            if (harvestpid == -1 || harvestpid == sndpid)
--                harvested = 1;
--        }
--
--        if (FD_ISSET(read_sock, &rset)) {
--            int ret;
--            ret = read(read_sock, data, 1024);
--
--            // We'll die off if we get a read error, and we'll let kismet on the
--            // other side detact that it died
--            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
--                exit(1);
--
--            data[ret] = '\0';
--
--        }
--
--        if (data[0] == '\0')
--            continue;
--
--        // If we've harvested the process, spawn a new one and watch it
--        // instead.  Otherwise, we just let go of the data we read
--        if (harvested == 1) {
--            harvested = 0;
--            if ((sndpid = fork()) == 0) {
--                // Only take the first line
--                char *nl;
--                if ((nl = strchr(data, '\n')) != NULL)
--                    *nl = '\0';
--
--                // Make sure it's shell-clean
--                MungeToShell(data, strlen(data));
--                char spk_call[1024];
--                snprintf(spk_call, 1024, "echo \"(%s\\\"%s\\\")\" | %s "
--                                               ">/dev/null 2>/dev/null",
--                                               flite ? "": "SayText ", data, player);
--
--                system(spk_call);
--
--                exit(0);
--            }
--        }
--
--        data[0] = '\0';
--    }
--}
--
--
--int PlaySound(string in_sound) {
--
--    char snd[1024];
--
--    snprintf(snd, 1024, "%s\n", in_sound.c_str());
--
--    if (write(soundpair[1], snd, strlen(snd)) < 0) {
--        char status[STATUS_MAX];
--        snprintf(status, STATUS_MAX,
--                 "ERROR: Could not write to sound pipe.  Stopping sound.");
--        gui->WriteStatus(status);
--
--        return 0;
--    }
--
--    return 1;
--}
--
--int SayText(string in_text) {
--    char snd[1024];
--
--    snprintf(snd, 1024, "%s\n", in_text.c_str());
--
--    if (write(speechpair[1], snd, strlen(snd)) < 0) {
--        char status[STATUS_MAX];
--        snprintf(status, STATUS_MAX,
--                 "ERROR: Could not write to speech pipe.  Stopping speech.");
--        gui->WriteStatus(status);
--
--        return 0;
--    }
--
--    return 1;
--}
- int main(int argc, char *argv[]) {
-     exec_name = argv[0];
-@@ -345,8 +120,6 @@
-     char guihost[1024];
-     int guiport = -1;
--    int gpsmode = -1;
--
-     configfile = NULL;
-     uiconfigfile = NULL;
-@@ -391,7 +164,6 @@
-             fprintf(stderr, "Using alternate UI config file: %s\n", uiconfigfile);
-             break;
-         case 'q':
--            sound = 0;
-             break;
-         case 'g':
-             reqgui = strdup(optarg);
-@@ -515,70 +287,6 @@
-         server = strdup(gui_conf->FetchOpt("host").c_str());
-     }
--    if (gui_conf->FetchOpt("sound") == "true" && sound == -1) {
--        if (gui_conf->FetchOpt("soundplay") != "") {
--            sndplay = gui_conf->FetchOpt("soundplay");
--            sound = 1;
--
--            if (gui_conf->FetchOpt("soundopts") != "")
--                sndplay += " " + gui_conf->FetchOpt("soundopts");
--
--            if (gui_conf->FetchOpt("sound_new") != "")
--                wav_map["new"] = gui_conf->FetchOpt("sound_new");
--            if (gui_conf->FetchOpt("sound_new_wep") != "")
--                wav_map["new_wep"] = gui_conf->FetchOpt("sound_new_wep");
--            if (gui_conf->FetchOpt("sound_traffic") != "")
--                wav_map["traffic"] = gui_conf->FetchOpt("sound_traffic");
--            if (gui_conf->FetchOpt("sound_junktraffic") != "")
--                wav_map["junktraffic"] = gui_conf->FetchOpt("sound_junktraffic");
--            if (gui_conf->FetchOpt("sound_gpslock") != "")
--                wav_map["gpslock"] = gui_conf->FetchOpt("sound_gpslock");
--            if (gui_conf->FetchOpt("sound_gpslost") != "")
--                wav_map["gpslost"] = gui_conf->FetchOpt("sound_gpslost");
--            if (gui_conf->FetchOpt("sound_alert") != "")
--                wav_map["alert"] = gui_conf->FetchOpt("sound_alert");
--
--        } else {
--            fprintf(stderr, "ERROR:  Sound alerts enabled but no sound playing binary specified.\n");
--            sound = 0;
--        }
--    } else if (sound == -1)
--        sound = 0;
--
--    /* Added by Shaw Innes 17/2/02 */
--    if (gui_conf->FetchOpt("speech") == "true" && speech == -1) {
--        if (gui_conf->FetchOpt("festival") != "") {
--            festival = strdup(gui_conf->FetchOpt("festival").c_str());
--            speech = 1;
--
--                      if (gui_conf->FetchOpt("flite") == "true")
--                              flite = 1;
--
--            string speechtype = gui_conf->FetchOpt("speech_type");
--
--            if (!strcasecmp(speechtype.c_str(), "nato"))
--                speech_encoding = SPEECH_ENCODING_NATO;
--            else if (!strcasecmp(speechtype.c_str(), "spell"))
--                speech_encoding = SPEECH_ENCODING_SPELL;
--            else
--                speech_encoding = SPEECH_ENCODING_NORMAL;
--
--            // Make sure we have encrypted text lines
--            if (gui_conf->FetchOpt("speech_encrypted") == "" || gui_conf->FetchOpt("speech_unencrypted") == "") {
--                fprintf(stderr, "ERROR:  Speech request but speech_encrypted or speech_unencrypted line missing.\n");
--                speech = 0;
--            }
--
--            speech_sentence_encrypted = gui_conf->FetchOpt("speech_encrypted");
--            speech_sentence_unencrypted = gui_conf->FetchOpt("speech_unencrypted");
--
--        } else {
--            fprintf(stderr, "ERROR: Speech alerts enabled but no path to festival has been specified.\n");
--            speech = 0;
--        }
--    } else if (speech == -1)
--        speech = 0;
--
-     if (gui_conf->FetchOpt("decay") != "") {
-         if (sscanf(gui_conf->FetchOpt("decay").c_str(), "%d", &decay) != 1) {
-             fprintf(stderr, "FATAL:  Illegal config file value for decay.\n");
-@@ -636,45 +344,6 @@
-         }
-     }
--    // Fork and find the sound options
--    if (sound) {
--        if (pipe(soundpair) == -1) {
--            fprintf(stderr, "WARNING:  Unable to create pipe for audio.  Disabling sound.\n");
--            sound = 0;
--        } else {
--            soundpid = fork();
--
--            if (soundpid < 0) {
--                fprintf(stderr, "WARNING:  Unable to fork for audio.  Disabling sound.\n");
--                sound = 0;
--            } else if (soundpid == 0) {
--                SoundHandler(soundpair, sndplay.c_str(), wav_map);
--                exit(0);
--            }
--
--            close(soundpair[0]);
--        }
--    }
--
--    if (speech) {
--        if (pipe(speechpair) == -1) {
--            fprintf(stderr, "WARNING:  Unable to create pipe for speech.  Disabling speech.\n");
--            speech = 0;
--        } else {
--            speechpid = fork();
--
--            if (speechpid < 0) {
--                fprintf(stderr, "WARNING:  Unable to fork for speech.  Disabling speech.\n");
--                speech = 0;
--            } else if (speechpid == 0) {
--                SpeechHandler(speechpair, festival);
--                exit(0);
--            }
--
--            close(speechpair[0]);
--        }
--    }
--
-     if (kismet_serv.Connect(guiport, guihost) < 0) {
-         fprintf(stderr, "FATAL:  Could not connect to %s:%d.\n", guihost, guiport);
-         CatchShutdown(-1);
-@@ -884,53 +553,14 @@
-                     }
-                     if (pollret != 0) {
--                        if (pollret == CLIENT_ALERT)
--                            if (sound == 1)
--                                sound = PlaySound("alert");
-                         if (strlen(tcpcli->FetchStatus()) != 0) {
-                             gui->WriteStatus(tcpcli->FetchStatus());
-                             // gui->DrawDisplay();
-                         }
--                        // The GPS only gets updated for the primary client
--                        if (tcpcli == primary_client) {
--                            if (tcpcli->FetchMode() == 0 && gpsmode != 0) {
--                                if (sound == 1 && gpsmode != -1)
--                                    sound = PlaySound("gpslost");
--                                gpsmode = 0;
--                            } else if (tcpcli->FetchMode() != 0 && gpsmode == 0) {
--                                if (sound == 1 && gpsmode != -1)
--                                    sound = PlaySound("gpslock");
--                                gpsmode = 1;
--                            }
--                        }
--
-                         if (tcpcli->FetchDeltaNumNetworks() > 0) {
-                             wireless_network *newnet = tcpcli->FetchLastNewNetwork();
--
--                            if (sound == 1 && newnet != lastspoken) {
--                                if (newnet->crypt_set && 
--                                    wav_map.find("new_wep") != wav_map.end())
--                                    sound = PlaySound("new_wep");
--                                else
--                                    sound = PlaySound("new");
--                            }
--
--                            if (speech == 1 && newnet != lastspoken) {
--                                string text;
--
--                                if (newnet != NULL) {
--                                    if (newnet->crypt_set)
--                                        text = ExpandSpeechString(speech_sentence_encrypted, newnet, speech_encoding);
--                                    else
--                                        text = ExpandSpeechString(speech_sentence_unencrypted, newnet, speech_encoding);
--
--                                    speech = SayText(text.c_str());
--                                }
--                            }
--
--                            lastspoken = newnet;
-                         }
-                         num_networks += tcpcli->FetchNumNetworks();
-@@ -938,17 +568,7 @@
-                         num_noise += tcpcli->FetchNumNoise();
-                         num_dropped += tcpcli->FetchNumDropped();
--                        if (tcpcli->FetchDeltaNumPackets() != 0) {
--                            if (time(0) - last_click >= decay && sound == 1) {
--                                if (tcpcli->FetchDeltaNumPackets() > tcpcli->FetchDeltaNumDropped()) {
--                                    sound = PlaySound("traffic");
--                                } else {
--                                    sound = PlaySound("junktraffic");
--                                }
--
--                                last_click = time(0);
--                            }
--                        }
-+                        tcpcli->FetchDeltaNumPackets();
-                     }
-                 }
-             } else {
-diff -urN kismet.old/kismet_drone.cc kismet.dev/kismet_drone.cc
---- kismet.old/kismet_drone.cc 2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/kismet_drone.cc 2005-08-15 01:04:06.114874928 +0200
-@@ -32,16 +32,11 @@
- #include "packet.h"
- #include "packetsource.h"
--#include "prism2source.h"
- #include "pcapsource.h"
--#include "wtapfilesource.h"
--#include "wsp100source.h"
--#include "vihasource.h"
- #include "dronesource.h"
- #include "packetsourcetracker.h"
- #include "kis_packsources.h"
--#include "gpsd.h"
- #include "tcpstreamer.h"
- #include "configfile.h"
-@@ -53,10 +48,6 @@
- const char *config_base = "kismet_drone.conf";
--GPSD *gps = NULL;
--int gpsmode = 0;
--int gps_enable = 0;
--
- // Timetracker
- Timetracker timetracker;
-@@ -81,26 +72,6 @@
-     exit(0);
- }
--int GpsEvent(Timetracker::timer_event *evt, void *parm) {
--    // The GPS only provides us a new update once per second we might
--    // as well only update it here once a second
--    if (gps_enable) {
--        int gpsret;
--        gpsret = gps->Scan();
--        if (gpsret < 0) {
--            if (!silent)
--                fprintf(stderr, "GPS error fetching data: %s\n",
--                        gps->FetchError());
--
--            gps_enable = 0;
--        }
--
--    }
--
--    // We want to be rescheduled
--    return 1;
--}
--
- // Handle channel hopping... this is actually really simple.
- int ChannelHopEvent(Timetracker::timer_event *evt, void *parm) {
-     sourcetracker.AdvanceChannel();
-@@ -148,9 +119,6 @@
-     TcpStreamer streamer;
--    char gpshost[1024];
--    int gpsport = -1;
--
-     int channel_hop = -1;
-     int channel_velocity = 1;
-     int channel_dwell = 0;
-@@ -351,46 +319,7 @@
-         exit(1);
-     }
--    if (conf->FetchOpt("gps") == "true") {
--        if (sscanf(conf->FetchOpt("gpshost").c_str(), "%1023[^:]:%d", gpshost, &gpsport) != 2) {
--            fprintf(stderr, "Invalid GPS host in config (host:port required)\n");
--            exit(1);
--        }
--
--        gps_enable = 1;
--    } else {
--            gps_enable = 0;
--    }
--
--    if (gps_enable == 1) {
--        // Open the GPS
--        gps = new GPSD(gpshost, gpsport);
--
--        // Lock GPS position
--        if (conf->FetchOpt("gpsmodelock") == "true") {
--            fprintf(stderr, "Enabling GPS position lock override (broken GPS unit reports 0 always)\n");
--            gps->SetOptions(GPSD_OPT_FORCEMODE);
--        }
--
--        if (gps->OpenGPSD() < 0) {
--            fprintf(stderr, "%s\n", gps->FetchError());
--
--            gps_enable = 0;
--        } else {
--            fprintf(stderr, "Opened GPS connection to %s port %d\n",
--                    gpshost, gpsport);
--
--        }
--    }
--
--    // Update GPS coordinates and handle signal loss if defined
--    timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &GpsEvent, NULL);
--
--      // Add the GPS to the tcpstreamer
--      streamer.AddGpstracker(gps);
--
-     // Register the gps and timetracker with the sourcetracker
--    sourcetracker.AddGpstracker(gps);
-     sourcetracker.AddTimetracker(&timetracker);
-     // Register the sources
-diff -urN kismet.old/kismet_server.cc kismet.dev/kismet_server.cc
---- kismet.old/kismet_server.cc        2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/kismet_server.cc        2005-08-15 01:03:15.103629816 +0200
-@@ -37,29 +37,19 @@
- #include "packet.h"
- #include "packetsource.h"
--#include "prism2source.h"
- #include "pcapsource.h"
--#include "wtapfilesource.h"
--#include "wsp100source.h"
--#include "vihasource.h"
- #include "dronesource.h"
- #include "packetsourcetracker.h"
- #include "kis_packsources.h"
- #include "dumpfile.h"
--#include "wtapdump.h"
- #include "wtaplocaldump.h"
--#include "airsnortdump.h"
- #include "fifodump.h"
--#include "gpsdump.h"
--
--#include "gpsd.h"
- #include "packetracker.h"
- #include "timetracker.h"
- #include "alertracker.h"
--#include "speech.h"
- #include "tcpserver.h"
- #include "server_globals.h"
- #include "kismet_server.h"
-@@ -73,13 +62,13 @@
- // Some globals for command line options
- char *configfile = NULL;
--int no_log = 0, noise_log = 0, data_log = 0, net_log = 0, crypt_log = 0, cisco_log = 0,
--    gps_log = -1, gps_enable = 1, csv_log = 0, xml_log = 0, ssid_cloak_track = 0, 
--    ip_track = 0, waypoint = 0, fifo = 0, corrupt_log = 0;
-+int no_log = 0, noise_log = 0, data_log = 0, net_log = 0, cisco_log = 0,
-+    csv_log = 0, xml_log = 0, ssid_cloak_track = 0, 
-+    ip_track = 0, fifo = 0, corrupt_log = 0;
- string logname, dumplogfile, netlogfile, cryptlogfile, ciscologfile,
--    gpslogfile, csvlogfile, xmllogfile, ssidtrackfile, configdir, iptrackfile, 
--    waypointfile, fifofile;
--FILE *ssid_file = NULL, *ip_file = NULL, *waypoint_file = NULL, *pid_file = NULL;
-+    csvlogfile, xmllogfile, ssidtrackfile, configdir, iptrackfile, 
-+    fifofile;
-+FILE *ssid_file = NULL, *ip_file = NULL, *pid_file = NULL;
- DumpFile *dumpfile, *cryptfile;
- int packnum = 0, localdropnum = 0;
-@@ -89,17 +78,8 @@
- Alertracker alertracker;
- Timetracker timetracker;
--GPSD *gps = NULL;
--int gpsmode = 0;
--GPSDump gpsdump;
--
--// Last time we tried to reconnect to the gps
--time_t last_gpsd_reconnect = 0;
--int gpsd_reconnect_attempt = 0;
--
- FifoDumpFile fifodump;
- TcpServer ui_server;
--int sound = -1;
- packet_info last_info;
- int decay;
- channel_power channel_graph[CHANNEL_MAX];
-@@ -113,16 +93,13 @@
- macmap<wep_key_info *> bssid_wep_map;
- // Pipe file descriptor pairs and fd's
--int soundpair[2];
--int speechpair[2];
- int chanpair[2];
--pid_t soundpid = -1, speechpid = -1, chanpid = -1;
- // Past alerts
- unsigned int max_alerts = 50;
- // Reference numbers for all of our builtin protocols
--int kismet_ref = -1, network_ref = -1, client_ref = -1, gps_ref = -1, 
-+int kismet_ref = -1, network_ref = -1, client_ref = -1, 
-     time_ref = -1, error_ref = -1, info_ref = -1, cisco_ref = -1, terminate_ref = -1, 
-     remove_ref = -1, capability_ref = -1, protocols_ref = -1, status_ref = -1, 
-     alert_ref = -1, packet_ref = -1, string_ref = -1, ack_ref = -1, wepkey_ref = -1, 
-@@ -169,24 +146,12 @@
- const char *logtypes = NULL, *dumptype = NULL;
- int limit_logs = 0;
--char gpshost[1024];
--int gpsport = -1;
--
- string allowed_hosts;
- string bind_addr;
- int tcpport = -1;
- int tcpmax;
--//const char *sndplay = NULL;
--string sndplay;
--
--const char *festival = NULL;
--int speech = -1;
- int flite = 0;
--int speech_encoding = 0;
--string speech_sentence_encrypted, speech_sentence_unencrypted;
--
--map<string, string> wav_map;
- int beacon_log = 1;
- int phy_log = 1;
-@@ -336,28 +301,6 @@
-         // delete dumpfile;
-     }
--    if (crypt_log) {
--        cryptfile->CloseDump();
--
--        if (cryptfile->FetchDumped() == 0) {
--            fprintf(stderr, "Didn't see any weak encryption packets, unlinking weak file\n");
--            unlink(cryptlogfile.c_str());
--        }
--
--        // delete cryptfile;
--    }
--
--    if (gps_log == 1) {
--        if (gpsdump.CloseDump(1) < 0)
--            fprintf(stderr, "Didn't log any GPS coordinates, unlinking gps file\n");
--    }
--
--    // Kill our sound players
--    if (soundpid > 0)
--        kill(soundpid, 9);
--    if (speechpid > 0)
--        kill(speechpid, 9);
--
-     // Shut down the packet sources
-     sourcetracker.CloseSources();
-@@ -368,228 +311,11 @@
-     exit(0);
- }
--// Subprocess sound handler
--void SoundHandler(int *fds, const char *player, map<string, string> soundmap) {
--    int read_sock = fds[0];
--    close(fds[1]);
--
--    fd_set rset;
--
--    char data[1024];
--
--    pid_t sndpid = -1;
--    int harvested = 1;
--
--    while (1) {
--        FD_ZERO(&rset);
--        FD_SET(read_sock, &rset);
--        char *end;
--
--        memset(data, 0, 1024);
--
--        struct timeval tm;
--        tm.tv_sec = 1;
--        tm.tv_usec = 0;
--
--        if (select(read_sock + 1, &rset, NULL, NULL, &tm) < 0) {
--            if (errno != EINTR) {
--                exit(1);
--            }
--        }
--
--        if (harvested == 0) {
--            // We consider a wait error to be a sign that the child pid died
--            // so we flag it as harvested and keep on going
--            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
--            if (harvestpid == -1 || harvestpid == sndpid)
--                harvested = 1;
--        }
--
--        if (FD_ISSET(read_sock, &rset)) {
--            int ret;
--            ret = read(read_sock, data, 1024);
--
--            // We'll die off if we get a read error, and we'll let kismet on the
--            // other side detact that it died
--            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
--                exit(1);
--
--            if ((end = strstr(data, "\n")) == NULL)
--                continue;
--
--            end[0] = '\0';
--        }
--
--        if (data[0] == '\0')
--            continue;
--
--
--        // If we've harvested the process, spawn a new one and watch it
--        // instead.  Otherwise, we just let go of the data we read
--        if (harvested == 1) {
--            // Only take the first line
--            char *nl;
--            if ((nl = strchr(data, '\n')) != NULL)
--                *nl = '\0';
--
--            // Make sure it's shell-clean
--
--            char snd[1024];
--
--            if (soundmap.size() == 0)
--                snprintf(snd, 1024, "%s", data);
--            if (soundmap.find(data) != soundmap.end())
--                snprintf(snd, 1024, "%s", soundmap[data].c_str());
--            else
--                continue;
--
--            char plr[1024];
--            snprintf(plr, 1024, "%s", player);
--
--            harvested = 0;
--            if ((sndpid = fork()) == 0) {
--                // Suppress errors
--                if (silent) {
--                    int nulfd = open("/dev/null", O_RDWR);
--                    dup2(nulfd, 1);
--                    dup2(nulfd, 2);
--                }
--
--                char * const echoarg[] = { plr, snd, NULL };
--                execve(echoarg[0], echoarg, NULL);
--            }
--        }
--        data[0] = '\0';
--    }
--}
--
--// Subprocess speech handler
--void SpeechHandler(int *fds, const char *player) {
--    int read_sock = fds[0];
--    close(fds[1]);
--
--    fd_set rset;
--
--    char data[1024];
--
--    pid_t sndpid = -1;
--    int harvested = 1;
--
--    while (1) {
--        FD_ZERO(&rset);
--        FD_SET(read_sock, &rset);
--        //char *end;
--
--        memset(data, 0, 1024);
--
--        if (harvested == 0) {
--            // We consider a wait error to be a sign that the child pid died
--            // so we flag it as harvested and keep on going
--            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
--            if (harvestpid == -1 || harvestpid == sndpid)
--                harvested = 1;
--        }
--
--        struct timeval tm;
--        tm.tv_sec = 1;
--        tm.tv_usec = 0;
--
--        if (select(read_sock + 1, &rset, NULL, NULL, &tm) < 0) {
--            if (errno != EINTR) {
--                exit(1);
--            }
--        }
--
--        if (FD_ISSET(read_sock, &rset)) {
--            int ret;
--            ret = read(read_sock, data, 1024);
--
--            // We'll die off if we get a read error, and we'll let kismet on the
--            // other side detact that it died
--            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
--                exit(1);
--
--            data[ret] = '\0';
--        }
--
--        if (data[0] == '\0')
--            continue;
--
--        // If we've harvested the process, spawn a new one and watch it
--        // instead.  Otherwise, we just let go of the data we read
--        if (harvested == 1) {
--            harvested = 0;
--            if ((sndpid = fork()) == 0) {
--                // Only take the first line
--                char *nl;
--                if ((nl = strchr(data, '\n')) != NULL)
--                    *nl = '\0';
--
--                // Make sure it's shell-clean
--                MungeToShell(data, strlen(data));
--                char spk_call[1024];
--                snprintf(spk_call, 1024, "echo \"(%s\\\"%s\\\")\" | %s "
--                                               ">/dev/null 2>/dev/null",
--                                               flite ? "" : "SayText ", data, player);
--                system(spk_call);
--
--                exit(0);
--            }
--        }
--
--        data[0] = '\0';
--    }
--}
--
--
--// Fork and run a system call to play a sound
--int PlaySound(string in_sound) {
--
--    char snd[1024];
--
--    snprintf(snd, 1024, "%s\n", in_sound.c_str());
--
--    if (write(soundpair[1], snd, strlen(snd)) < 0) {
--        char status[STATUS_MAX];
--        if (!silent)
--            fprintf(stderr, "ERROR:  Write error, closing sound pipe.\n");
--        snprintf(status, STATUS_MAX, "ERROR:  Write error on sound pipe, closing sound connection");
--        NetWriteStatus(status);
--
--        return 0;
--    }
--
--    return 1;
--}
--
--int SayText(string in_text) {
--
--    char snd[1024];
--
--    snprintf(snd, 1024, "%s\n", in_text.c_str());
--    MungeToShell(snd, 1024);
--
--    if (write(speechpair[1], snd, strlen(snd)) < 0) {
--        char status[STATUS_MAX];
--        if (!silent)
--            fprintf(stderr, "ERROR:  Write error, closing speech pipe.\n");
--        snprintf(status, STATUS_MAX, "ERROR:  Write error on speech pipe, closing speech connection");
--        NetWriteStatus(status);
--
--        return 0;
--    }
--
--    return 1;
--}
--
- void KisLocalAlert(const char *in_text) {
-     time_t now = time(0);
-     if (!silent)
-         fprintf(stderr, "ALERT %.24s %s\n", ctime(&now), in_text);
--    if (sound == 1)
--        sound = PlaySound("alert");
--
- }
- void KisLocalStatus(const char *in_status) {
-@@ -638,37 +364,6 @@
-     char tmpstr[32];
--    GPS_data gdata;
--
--    if (gps_enable) {
--        float lat, lon, alt, spd, hed;
--        int mode;
--
--        gps->FetchLoc(&lat, &lon, &alt, &spd, &hed, &mode);
--
--        snprintf(tmpstr, 32, "%f", lat);
--        gdata.lat = tmpstr;
--        snprintf(tmpstr, 32, "%f", lon);
--        gdata.lon = tmpstr;
--        snprintf(tmpstr, 32, "%f", alt);
--        gdata.alt = tmpstr;
--        snprintf(tmpstr, 32, "%f", spd);
--        gdata.spd = tmpstr;
--        snprintf(tmpstr, 32, "%f", hed);
--        gdata.heading = tmpstr;
--        snprintf(tmpstr, 32, "%d", mode);
--        gdata.mode = tmpstr;
--    } else {
--        gdata.lat = "0.0";
--        gdata.lon = "0.0";
--        gdata.alt = "0.0";
--        gdata.spd = "0.0";
--        gdata.heading = "0.0";
--        gdata.mode = "0";
--    }
--
--    ui_server.SendToAll(gps_ref, (void *) &gdata);
--
-     INFO_data idata;
-     snprintf(tmpstr, 32, "%d", tracker.FetchNumNetworks());
-     idata.networks = tmpstr;
-@@ -789,82 +484,6 @@
-     }
- }
--int GpsEvent(Timetracker::timer_event *evt, void *parm) {
--    char status[STATUS_MAX];
--
--    // The GPS only provides us a new update once per second we might
--    // as well only update it here once a second
--
--    // If we're disconnected, try to reconnect.
--    if (gpsd_reconnect_attempt > 0) {
--        // Increment the time between connection attempts
--        if (last_gpsd_reconnect + ((gpsd_reconnect_attempt - 1) * 2) < time(0)) {
--            if (gps->OpenGPSD() < 0) {
--                last_gpsd_reconnect = time(0);
--
--                if (gpsd_reconnect_attempt < 20)
--                    gpsd_reconnect_attempt++;
--
--                snprintf(status, STATUS_MAX, "Unable to reconnect to GPSD, trying "
--                         "again in %d seconds.", ((gpsd_reconnect_attempt - 1) * 2));
--
--                if (!silent || NetWriteStatus(status) == 0)
--                    fprintf(stderr, "WARNING: %s\n", status);
--
--                return 1;
--            } else {
--                gpsd_reconnect_attempt = 0;
--
--                snprintf(status, STATUS_MAX, "Reopened connection to GPSD");
--                if (!silent || NetWriteStatus(status) == 0)
--                    fprintf(stderr, "NOTICE: %s\n", status);
--            }
--        } else {
--            // Don't process more if we haven't woken up yet
--            return 1;
--        }
--
--    }
--    
--    if (gps_enable) {
--        int gpsret;
--        gpsret = gps->Scan();
--
--        if (gpsret < 0) {
--            snprintf(status, STATUS_MAX, "GPS error requesting data: %s",
--                     gps->FetchError());
--
--            if (!silent || NetWriteStatus(status) == 0)
--                fprintf(stderr, "WARNING: %s\n", status);
--
--            gpsd_reconnect_attempt = 1;
--        }
--
--        if (gpsret == 0 && gpsmode != 0) {
--            if (!silent || NetWriteStatus("Lost GPS signal.") == 0)
--                fprintf(stderr, "Lost GPS signal.\n");
--            if (sound == 1)
--                sound = PlaySound("gpslost");
--
--            gpsmode = 0;
--        } else if (gpsret != 0 && gpsmode == 0) {
--            if (!silent || NetWriteStatus("Acquired GPS signal.") == 0)
--                fprintf(stderr, "Acquired GPS signal.\n");
--            if (sound == 1)
--                sound = PlaySound("gpslock");
--
--            gpsmode = 1;
--        }
--    }
--
--    if (gps_log == 1 && gpsmode != 0 && gps != NULL) {
--        gpsdump.DumpTrack(gps);
--    }
--
--    // We want to be rescheduled
--    return 1;
--}
--
- // Simple redirect to the network info drawer.  We don't want to change netwriteinfo to a
- // timer event since we call it un-timed too
- int NetWriteEvent(Timetracker::timer_event *evt, void *parm) {
-@@ -884,13 +503,6 @@
-     return 1;
- }
--// Write the waypoints for gpsdrive
--int WaypointSyncEvent(Timetracker::timer_event *evt, void *parm) {
--    tracker.WriteGpsdriveWaypt(waypoint_file);
--
--    return 1;
--}
--
- // Handle tracker maintenance
- int TrackerTickEvent(Timetracker::timer_event *evt, void *parm) {
-     tracker.Tick();
-@@ -1159,11 +771,10 @@
-            "  -c, --capture-source <src>   Packet capture source line (type,interface,name)\n"
-            "  -C, --enable-capture-sources Comma separated list of named packet sources to use.\n"
-            "  -l, --log-types <types>      Comma separated list of types to log,\n"
--           "                                (ie, dump,cisco,weak,network,gps)\n"
-+           "                                (ie, dump,cisco,network)\n"
-            "  -d, --dump-type <type>       Dumpfile type (wiretap)\n"
-            "  -m, --max-packets <num>      Maximum number of packets before starting new dump\n"
-            "  -q, --quiet                  Don't play sounds\n"
--           "  -g, --gps <host:port>        GPS server (host:port or off)\n"
-            "  -p, --port <port>            TCPIP server port for GUI connections\n"
-            "  -a, --allowed-hosts <hosts>  Comma separated list of hosts allowed to connect\n"
-            "  -b, --bind-address <address>    Bind to this address. Default INADDR_ANY\n."
-@@ -1288,18 +899,6 @@
-     }
--    if (conf->FetchOpt("waypoints") == "true") {
--        if(conf->FetchOpt("waypointdata") == "") {
--            fprintf(stderr, "WARNING:  Waypoint logging requested but no waypoint data file given.\n"
--                    "Waypoint logging will be disabled.\n");
--            waypoint = 0;
--        } else {
--            waypointfile = conf->ExpandLogPath(conf->FetchOpt("waypointdata"), "", "", 0, 1);
--            waypoint = 1;
--        }
--
--    }
--
-     if (conf->FetchOpt("metric") == "true") {
-         fprintf(stderr, "Using metric measurements.\n");
-         metric = 1;
-@@ -1379,16 +971,6 @@
-         }
--        if (strstr(logtypes, "weak")) {
--            crypt_log = 1;
--
--            if (conf->FetchOpt("logtemplate") == "") {
--                fprintf(stderr, "FATAL:  Logging (weak packets) enabled but no logtemplate given in config.\n");
--                ErrorShutdown();
--            }
--
--        }
--
-         if (strstr(logtypes, "csv")) {
-             csv_log = 1;
-@@ -1418,25 +1000,6 @@
-         }
--        if (strstr(logtypes, "gps")) {
--            if (gps_log == 0) {
--                fprintf(stderr, "WARNING:  Disabling GPS logging.\n");
--            } else {
--                gps_log = 1;
--
--                if (conf->FetchOpt("logtemplate") == "") {
--                    fprintf(stderr, "FATAL:  Logging (gps coordinates) enabled but no logtemplate given in config.\n");
--                    ErrorShutdown();
--                }
--            }
--
--        }
--
--        if (gps_log == 1 && !net_log) {
--            fprintf(stderr, "WARNING:  Logging (gps coordinates) enabled but XML logging (networks) was not.\n"
--                    "It will be enabled now.\n");
--            xml_log = 1;
--        }
-     }
-     if (conf->FetchOpt("decay") != "") {
-@@ -1557,72 +1120,6 @@
-         legal_ipblock_vec.push_back(ipb);
-     }
--    // Process sound stuff
--    if (conf->FetchOpt("sound") == "true" && sound == -1) {
--        if (conf->FetchOpt("soundplay") != "") {
--            sndplay = conf->FetchOpt("soundplay");
--
--            if (conf->FetchOpt("soundopts") != "")
--                sndplay += " " + conf->FetchOpt("soundopts");
--
--            sound = 1;
--
--            if (conf->FetchOpt("sound_new") != "")
--                wav_map["new"] = conf->FetchOpt("sound_new");
--            if (conf->FetchOpt("sound_new_wep") != "")
--                wav_map["new_wep"] = conf->FetchOpt("sound_new_wep");
--            if (conf->FetchOpt("sound_traffic") != "")
--                wav_map["traffic"] = conf->FetchOpt("sound_traffic");
--            if (conf->FetchOpt("sound_junktraffic") != "")
--                wav_map["junktraffic"] = conf->FetchOpt("sound_traffic");
--            if (conf->FetchOpt("sound_gpslock") != "")
--                wav_map["gpslock"] = conf->FetchOpt("sound_gpslock");
--            if (conf->FetchOpt("sound_gpslost") != "")
--                wav_map["gpslost"] = conf->FetchOpt("sound_gpslost");
--            if (conf->FetchOpt("sound_alert") != "")
--                wav_map["alert"] = conf->FetchOpt("sound_alert");
--
--        } else {
--            fprintf(stderr, "ERROR:  Sound alerts enabled but no sound playing binary specified.\n");
--            sound = 0;
--        }
--    } else if (sound == -1)
--        sound = 0;
--
--    /* Added by Shaw Innes 17/2/02 */
--    /* Modified by Andrew Etter 15/9/02 */
--    if (conf->FetchOpt("speech") == "true" && speech == -1) {
--        if (conf->FetchOpt("festival") != "") {
--            festival = strdup(conf->FetchOpt("festival").c_str());
--            speech = 1;
--              
--                      if (conf->FetchOpt("flite") == "true")
--                              flite = 1;
--
--            string speechtype = conf->FetchOpt("speech_type");
--
--            if (!strcasecmp(speechtype.c_str(), "nato"))
--                speech_encoding = SPEECH_ENCODING_NATO;
--            else if (!strcasecmp(speechtype.c_str(), "spell"))
--                speech_encoding = SPEECH_ENCODING_SPELL;
--            else
--                speech_encoding = SPEECH_ENCODING_NORMAL;
--
--            // Make sure we have encrypted text lines
--            if (conf->FetchOpt("speech_encrypted") == "" || conf->FetchOpt("speech_unencrypted") == "") {
--                fprintf(stderr, "ERROR:  Speech request but speech_encrypted or speech_unencrypted line missing.\n");
--                speech = 0;
--            }
--
--            speech_sentence_encrypted = conf->FetchOpt("speech_encrypted");
--            speech_sentence_unencrypted = conf->FetchOpt("speech_unencrypted");
--        } else {
--            fprintf(stderr, "ERROR: Speech alerts enabled but no path to festival has been specified.\n");
--            speech = 0;
--        }
--    } else if (speech == -1)
--        speech = 0;
--
-     if (conf->FetchOpt("writeinterval") != "") {
-         if (sscanf(conf->FetchOpt("writeinterval").c_str(), "%d", &datainterval) != 1) {
-             fprintf(stderr, "FATAL:  Illegal config file value for data interval.\n");
-@@ -1642,45 +1139,6 @@
-         fprintf(stderr, "WARNING:  No client_manuf file specified.  Client manufacturers will not be detected.\n");
-     }
--    // Fork and find the sound options
--    if (sound) {
--        if (pipe(soundpair) == -1) {
--            fprintf(stderr, "WARNING:  Unable to create pipe for audio.  Disabling sound.\n");
--            sound = 0;
--        } else {
--            soundpid = fork();
--
--            if (soundpid < 0) {
--                fprintf(stderr, "WARNING:  Unable to fork for audio.  Disabling sound.\n");
--                sound = 0;
--            } else if (soundpid == 0) {
--                SoundHandler(soundpair, sndplay.c_str(), wav_map);
--                exit(0);
--            }
--
--            close(soundpair[0]);
--        }
--    }
--
--    if (speech) {
--        if (pipe(speechpair) == -1) {
--            fprintf(stderr, "WARNING:  Unable to create pipe for speech.  Disabling speech.\n");
--            speech = 0;
--        } else {
--            speechpid = fork();
--
--            if (speechpid < 0) {
--                fprintf(stderr, "WARNING:  Unable to fork for speech.  Disabling speech.\n");
--                speech = 0;
--            } else if (speechpid == 0) {
--                SpeechHandler(speechpair, festival);
--                exit(0);
--            }
--
--            close(speechpair[0]);
--        }
--    }
--
-     // Grab the filtering
-     string filter_bit;
-@@ -1706,7 +1164,7 @@
-     }
-     if ((filter_bit = conf->FetchOpt("filter_export")) != "") {
--        fprintf(stderr, "Enabling filtering on exported (csv, xml, network, gps) files.\n");
-+        fprintf(stderr, "Enabling filtering on exported (csv, xml, network) files.\n");
-         filter_export = 1;
-         if (ConfigFile::ParseFilterLine(filter_bit, &filter_export_bssid, &filter_export_source,
-                                         &filter_export_dest, &filter_export_bssid_invert,
-@@ -1812,14 +1270,6 @@
-     }
--    if (waypoint) {
--        if ((waypoint_file = fopen(waypointfile.c_str(), "a")) == NULL) {
--            fprintf(stderr, "WARNING:  Could not open waypoint file '%s' for writing: %s\n",
--                    waypointfile.c_str(), strerror(errno));
--            waypoint = 0;
--        }
--    }
--
-     // Create all the logs and title/number them appropriately
-     // We need to save this for after we toast the conf record
-     int logfile_matched = 0;
-@@ -1839,13 +1289,6 @@
-                 continue;
-         }
--        if (crypt_log) {
--            cryptlogfile = conf->ExpandLogPath(conf->FetchOpt("logtemplate"), logname, "weak", run_num);
--
--            if (cryptlogfile == "")
--                continue;
--        }
--
-         if (csv_log) {
-             csvlogfile = conf->ExpandLogPath(conf->FetchOpt("logtemplate"), logname, "csv", run_num);
-@@ -1867,13 +1310,6 @@
-                 continue;
-         }
--        if (gps_log == 1) {
--            gpslogfile = conf->ExpandLogPath(conf->FetchOpt("logtemplate"), logname, "gps", run_num);
--
--            if (gpslogfile == "")
--                continue;
--        }
--
-         // if we made it this far we're cool -- all the logfiles we're writing to matched
-         // this number
-         logfile_matched = 1;
-@@ -1896,15 +1332,9 @@
-     if (xml_log)
-         fprintf(stderr, "Logging networks in XML format to %s\n", xmllogfile.c_str());
--    if (crypt_log)
--        fprintf(stderr, "Logging cryptographically weak packets to %s\n", cryptlogfile.c_str());
--
-     if (cisco_log)
-         fprintf(stderr, "Logging cisco product information to %s\n", ciscologfile.c_str());
--    if (gps_log == 1)
--        fprintf(stderr, "Logging gps coordinates to %s\n", gpslogfile.c_str());
--
-     if (data_log)
-         fprintf(stderr, "Logging data to %s\n", dumplogfile.c_str());
-@@ -2051,7 +1481,6 @@
-         { "dump-type", required_argument, 0, 'd' },
-         { "max-packets", required_argument, 0, 'm' },
-         { "quiet", no_argument, 0, 'q' },
--        { "gps", required_argument, 0, 'g' },
-         { "port", required_argument, 0, 'p' },
-         { "allowed-hosts", required_argument, 0, 'a' },
-         { "bind-address", required_argument, 0, 'b'},
-@@ -2132,18 +1561,6 @@
-                 Usage(argv[0]);
-             }
-             break;
--        case 'g':
--            // GPS
--            if (strcmp(optarg, "off") == 0) {
--                gps_enable = 0;
--            }
--            else if (sscanf(optarg, "%1023[^:]:%d", gpshost, &gpsport) < 2) {
--                fprintf(stderr, "Invalid GPS host '%s' (host:port or off required)\n",
--                       optarg);
--                gps_enable = 1;
--                Usage(argv[0]);
--            }
--            break;
-         case 'p':
-             // Port
-             if (sscanf(optarg, "%d", &tcpport) != 1) {
-@@ -2165,7 +1582,6 @@
-             break;
-         case 'q':
-             // Quiet
--            sound = 0;
-             break;
-         case 'v':
-             // version
-@@ -2319,39 +1735,7 @@
-     // And we're done
-     fclose(pid_file);
-             
--
--    // Set up the GPS object to give to the children
--    if (gpsport == -1 && gps_enable) {
--        if (conf->FetchOpt("gps") == "true") {
--            if (sscanf(conf->FetchOpt("gpshost").c_str(), "%1023[^:]:%d", gpshost, 
--                       &gpsport) != 2) {
--                fprintf(stderr, "Invalid GPS host in config (host:port required)\n");
--                exit(1);
--            }
--
--            gps_enable = 1;
--        } else {
--            gps_enable = 0;
--            gps_log = 0;
--        }
--    }
--
--    if (gps_enable == 1) {
--        gps = new GPSD(gpshost, gpsport);
--
--        // Lock GPS position
--        if (conf->FetchOpt("gpsmodelock") == "true") {
--            fprintf(stderr, "Enabling GPS position lock override (broken GPS unit "
--                    "reports 0 always)\n");
--            gps->SetOptions(GPSD_OPT_FORCEMODE);
--        }
--
--    } else {
--        gps_log = 0;
--    }
--
-     // Register the gps and timetracker with the sourcetracker
--    sourcetracker.AddGpstracker(gps);
-     sourcetracker.AddTimetracker(&timetracker);
-     // Handle errors here maybe in the future
-@@ -2518,13 +1902,6 @@
-         fprintf(stderr, "Dump file format: %s\n", dumpfile->FetchType());
-     }
--    if (gps_enable && gps_log == 1) {
--        if (gpsdump.OpenDump(gpslogfile.c_str(), xmllogfile.c_str()) < 0) {
--            fprintf(stderr, "FATAL: GPS dump error: %s\n", gpsdump.FetchError());
--            ErrorShutdown();
--        }
--    }
--
-     // Open our files first to make sure we can, we'll unlink the empties later.
-     FILE *testfile = NULL;
-     if (net_log) {
-@@ -2567,18 +1944,6 @@
-         fclose(testfile);
-     }
--    // Crypt log stays open like the dump log for continual writing
--    if (crypt_log) {
--        cryptfile = new AirsnortDumpFile;
--
--        if (cryptfile->OpenDump(cryptlogfile.c_str()) < 0) {
--            fprintf(stderr, "FATAL: %s\n", cryptfile->FetchError());
--            ErrorShutdown();
--        }
--
--        fprintf(stderr, "Crypt file format: %s\n", cryptfile->FetchType());
--
--    }
-     snprintf(status, STATUS_MAX, "Kismet %s.%s.%s (%s)",
-              VERSION_MAJOR, VERSION_MINOR, VERSION_TINY, servername);
-@@ -2595,15 +1960,13 @@
-     }
-     */
--    if (data_log || net_log || crypt_log) {
--        snprintf(status, STATUS_MAX, "Logging%s%s%s%s%s%s%s",
-+    if (data_log || net_log) {
-+        snprintf(status, STATUS_MAX, "Logging%s%s%s%s%s",
-                  data_log ? " data" : "" ,
-                  net_log ? " networks" : "" ,
-                  csv_log ? " CSV" : "" ,
-                  xml_log ? " XML" : "" ,
--                 crypt_log ? " weak" : "",
--                 cisco_log ? " cisco" : "",
--                 gps_log == 1 ? " gps" : "");
-+                 cisco_log ? " cisco" : "");
-         fprintf(stderr, "%s\n", status);
-     } else if (no_log) {
-         snprintf(status, STATUS_MAX, "Not logging any data.");
-@@ -2621,23 +1984,6 @@
-         }
-     }
--    if (gps_enable) {
--        // Open the GPS
--        if (gps->OpenGPSD() < 0) {
--            fprintf(stderr, "%s\n", gps->FetchError());
--
--            gps_enable = 0;
--            gps_log = 0;
--        } else {
--            fprintf(stderr, "Opened GPS connection to %s port %d\n",
--                    gpshost, gpsport);
--
--            gpsmode = gps->FetchMode();
--
--            last_gpsd_reconnect = time(0);
--        }
--    }
--
-     fprintf(stderr, "Listening on port %d.\n", tcpport);
-     for (unsigned int ipvi = 0; ipvi < legal_ipblock_vec.size(); ipvi++) {
-         char *netaddr = strdup(inet_ntoa(legal_ipblock_vec[ipvi]->network));
-@@ -2678,8 +2024,6 @@
-                                              &Protocol_NETWORK, &ProtocolNetworkEnable);
-     client_ref = ui_server.RegisterProtocol("CLIENT", 0, CLIENT_fields_text,
-                                             &Protocol_CLIENT, &ProtocolClientEnable);
--    gps_ref = ui_server.RegisterProtocol("GPS", 0, GPS_fields_text,
--                                         &Protocol_GPS, NULL);
-     info_ref = ui_server.RegisterProtocol("INFO", 0, INFO_fields_text,
-                                           &Protocol_INFO, NULL);
-     remove_ref = ui_server.RegisterProtocol("REMOVE", 0, REMOVE_fields_text,
-@@ -2734,14 +2078,9 @@
-     // Write network info and tick the tracker once per second
-     timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &NetWriteEvent, NULL);
-     timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &TrackerTickEvent, NULL);
--    // Update GPS coordinates and handle signal loss if defined
--    timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &GpsEvent, NULL);
-     // Sync the data files if requested
-     if (datainterval > 0 && no_log == 0)
-         timetracker.RegisterTimer(datainterval * SERVER_TIMESLICES_SEC, NULL, 1, &ExportSyncEvent, NULL);
--    // Write waypoints if requested
--    if (waypoint)
--        timetracker.RegisterTimer(decay * SERVER_TIMESLICES_SEC, NULL, 1, &WaypointSyncEvent, NULL);
-     // Channel hop if requested
-     if (channel_hop) {
-         if (channel_dwell)
-@@ -2765,7 +2104,6 @@
-     snprintf(status, 1024, "%s", TIMESTAMP);
-     kdata.timestamp = status;
--    time_t last_click = 0;
-     int num_networks = 0, num_packets = 0, num_noise = 0, num_dropped = 0;
-@@ -2914,54 +2252,12 @@
-                     }
--                    if (gps_log == 1 && info.type != packet_noise && 
--                        info.type != packet_unknown && info.type != packet_phy && 
--                        info.corrupt == 0) {
--                        if (gpsdump.DumpPacket(&info) < 0) {
--                            snprintf(status, STATUS_MAX, "%s", gpsdump.FetchError());
--                            if (!silent || NetWriteStatus(status) == 0)
--                                fprintf(stderr, "%s\n", status);
--                        }
--                    }
--
-                     // tracker.ProcessPacket(info);
-                     tracker.ProcessPacket(&packet, &info, &bssid_wep_map, 
-                                                                                 wep_identity);
--
--                    if (tracker.FetchNumNetworks() > num_networks) {
--                        if (sound == 1)
--                            if (info.crypt_set && 
--                                                              wav_map.find("new_wep") != wav_map.end())
--                                sound = PlaySound("new_wep");
--                            else
--                                sound = PlaySound("new");
--                        if (speech == 1) {
--                            string text;
--
--                            if (info.crypt_set)
--                                text = ExpandSpeechString(speech_sentence_encrypted, &info, 
--                                                          speech_encoding);
--                            else
--                                text = ExpandSpeechString(speech_sentence_unencrypted, 
--                                                          &info, speech_encoding);
--
--                            speech = SayText(MungeToShell(text).c_str());
--                        }
--                    }
-                     num_networks = tracker.FetchNumNetworks();
-                     if (tracker.FetchNumPackets() != num_packets) {
--                        if (cur_time - last_click >= decay && sound == 1) {
--                            if (tracker.FetchNumPackets() - num_packets >
--                                tracker.FetchNumDropped() + localdropnum - num_dropped) {
--                                sound = PlaySound("traffic");
--                            } else {
--                                sound = PlaySound("junktraffic");
--                            }
--
--                            last_click = cur_time;
--                        }
--
-                         num_packets = tracker.FetchNumPackets();
-                         num_noise = tracker.FetchNumNoise();
-                         num_dropped = tracker.FetchNumDropped() + localdropnum;
-@@ -3070,10 +2366,6 @@
-                         }
-                     }
--                    if (crypt_log) {
--                        cryptfile->DumpPacket(&info, &packet);
--                    }
--
-                 } else if (ret < 0) {
-                     // Fail on error
-                     snprintf(status, STATUS_MAX, "FATAL: %s",
-diff -urN kismet.old/kismet_server.h kismet.dev/kismet_server.h
---- kismet.old/kismet_server.h 2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/kismet_server.h 2005-08-15 00:29:19.088681928 +0200
-@@ -33,10 +33,6 @@
- void handle_command(TcpServer *tcps, client_command *cc);
- int NetWriteStatus(const char *in_status);
- void NetWriteInfo();
--int SayText(string in_text);
--int PlaySound(string in_sound);
--void SpeechHandler(int *fds, const char *player);
--void SoundHandler(int *fds, const char *player, map<string, string> soundmap);
- void ProtocolAlertEnable(int in_fd);
- void ProtocolNetworkEnable(int in_fd);
- void ProtocolClientEnable(int in_fd);
-diff -urN kismet.old/packet.cc kismet.dev/packet.cc
---- kismet.old/packet.cc       2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/packet.cc       2005-08-15 00:30:26.190480904 +0200
-@@ -257,14 +257,6 @@
-     ret_packinfo->encoding = packet->encoding;
-     ret_packinfo->datarate = packet->datarate;
--    // Assign the location info
--    ret_packinfo->gps_lat = packet->gps_lat;
--    ret_packinfo->gps_lon = packet->gps_lon;
--    ret_packinfo->gps_alt = packet->gps_alt;
--    ret_packinfo->gps_spd = packet->gps_spd;
--    ret_packinfo->gps_heading = packet->gps_heading;
--    ret_packinfo->gps_fix = packet->gps_fix;
--
-     // Assign a hardware channel if we're on an 802.11a carrier since the beacon doesn't
-     // carry that tag
-     if (packet->carrier == carrier_80211a)
-diff -urN kismet.old/packetracker.cc kismet.dev/packetracker.cc
---- kismet.old/packetracker.cc 2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/packetracker.cc 2005-08-15 00:58:01.441313736 +0200
-@@ -255,19 +255,6 @@
-     client->metric = net->metric;
--    if (info->gps_fix >= 2) {
--        client->gps_fixed = info->gps_fix;
--        client->min_lat = client->max_lat = info->gps_lat;
--        client->min_lon = client->max_lon = info->gps_lon;
--        client->min_alt = client->max_alt = info->gps_alt;
--        client->min_spd = client->max_spd = info->gps_spd;
--
--        client->aggregate_lat = info->gps_lat;
--        client->aggregate_lon = info->gps_lon;
--        client->aggregate_alt = info->gps_alt;
--        client->aggregate_points = 1;
--    }
--
-     // Classify the client.  We'll call no-distrib packets (lucent)
-     // inter-distrib clients since it's not an end-user bridge into the
-     // network, it's a lucent AP talking to another one.
-@@ -410,19 +397,6 @@
-             KisLocalStatus(status);
-         }
--        if (info->gps_fix >= 2) {
--            net->gps_fixed = info->gps_fix;
--            net->min_lat = net->max_lat = info->gps_lat;
--            net->min_lon = net->max_lon = info->gps_lon;
--            net->min_alt = net->max_alt = info->gps_alt;
--            net->min_spd = net->max_spd = info->gps_spd;
--
--            net->aggregate_lat = info->gps_lat;
--            net->aggregate_lon = info->gps_lon;
--            net->aggregate_alt = info->gps_alt;
--            net->aggregate_points = 1;
--        }
--
-         // Find out what we can from what we know now...
-         if (net->type != network_adhoc && net->type != network_probe) {
-             net->manuf_ref = MatchBestManuf(ap_manuf_map, net->bssid, net->ssid, 
-@@ -463,11 +437,6 @@
-         if (info->signal > net->best_signal || net->best_signal == 0) {
-             net->best_signal = info->signal;
--            if (info->gps_fix >= 2) {
--                net->best_lat = info->gps_lat;
--                net->best_lon = info->gps_lon;
--                net->best_alt = info->gps_alt;
--            }
-         }
-         net->noise = info->noise;
-@@ -477,41 +446,6 @@
-             net->best_noise = info->noise;
-     }
--    if (info->gps_fix >= 2) {
--        // Don't aggregate slow-moving packets to prevent average "pulling"..
--        if (info->gps_spd <= 0.3) {
--            net->aggregate_lat += info->gps_lat;
--            net->aggregate_lon += info->gps_lon;
--            net->aggregate_alt += info->gps_alt;
--            net->aggregate_points += 1;
--        }
--
--        net->gps_fixed = info->gps_fix;
--
--        if (info->gps_lat < net->min_lat || net->min_lat == -90)
--            net->min_lat = info->gps_lat;
--        if (info->gps_lat > net->max_lat || net->max_lat == 90)
--            net->max_lat = info->gps_lat;
--
--        if (info->gps_lon < net->min_lon || net->min_lon == -180)
--            net->min_lon = info->gps_lon;
--        if (info->gps_lon > net->max_lon || net->max_lon == 180)
--            net->max_lon = info->gps_lon;
--
--        if (info->gps_alt < net->min_alt || net->min_alt == 0)
--            net->min_alt = info->gps_alt;
--        if (info->gps_alt > net->max_alt || net->max_alt == 0)
--            net->max_alt = info->gps_alt;
--
--        if (info->gps_spd < net->min_spd || net->min_spd == 0)
--            net->min_spd = info->gps_spd;
--        if (info->gps_spd > net->max_spd || net->max_spd == 0)
--            net->max_spd = info->gps_spd;
--
--    } else {
--        net->gps_fixed = 0;
--    }
--
-     // Handle the IV sets.  4-byte compare IV is fine
-     if (info->encrypted) {
-         map<uint32_t, int>::iterator ivitr = net->iv_map.find(info->ivset);
-@@ -834,50 +768,11 @@
-         }
-     }
--    if (info->gps_fix >= 2) {
--        if (info->gps_spd <= 0.3) {
--            client->aggregate_lat += info->gps_lat;
--            client->aggregate_lon += info->gps_lon;
--            client->aggregate_alt += info->gps_alt;
--            client->aggregate_points += 1;
--        }
--
--        client->gps_fixed = info->gps_fix;
--
--        if (info->gps_lat < client->min_lat || client->min_lat == -90)
--            client->min_lat = info->gps_lat;
--        if (info->gps_lat > client->max_lat || client->max_lat == 90)
--            client->max_lat = info->gps_lat;
--
--        if (info->gps_lon < client->min_lon || client->min_lon == -180)
--            client->min_lon = info->gps_lon;
--        if (info->gps_lon > client->max_lon == 180)
--            client->max_lon = info->gps_lon;
--
--        if (info->gps_alt < client->min_alt || client->min_alt == 0)
--            client->min_alt = info->gps_alt;
--        if (info->gps_alt > client->max_alt || client->min_alt == 0)
--            client->max_alt = info->gps_alt;
--
--        if (info->gps_spd < client->min_spd || client->min_spd == 0)
--            client->min_spd = info->gps_spd;
--        if (info->gps_spd > client->max_spd || client->max_spd == 0)
--            client->max_spd = info->gps_spd;
--
--    } else {
--        client->gps_fixed = 0;
--    }
--
-     if (info->signal >= 0) {
-         client->signal = info->signal;
-         if (info->signal > client->best_signal || client->best_signal == 0) {
-             client->best_signal = info->signal;
--            if (info->gps_fix >= 2) {
--                client->best_lat = info->gps_lat;
--                client->best_lon = info->gps_lon;
--                client->best_alt = info->gps_alt;
--            }
-         }
-         net->noise = info->noise;
-@@ -1416,17 +1311,6 @@
-                 (net->llc_packets + net->data_packets),
-                 ft, lt);
--        if (net->gps_fixed != -1)
--            fprintf(netfile,
--                    "    Min Loc: Lat %f Lon %f Alt %f Spd %f\n"
--                    "    Max Loc: Lat %f Lon %f Alt %f Spd %f\n",
--                    net->min_lat, net->min_lon,
--                    metric ? net->min_alt / 3.3 : net->min_alt,
--                    metric ? net->min_spd * 1.6093 : net->min_spd,
--                    net->max_lat, net->max_lon,
--                    metric ? net->max_alt / 3.3 : net->max_alt,
--                    metric ? net->max_spd * 1.6093 : net->max_spd);
--
-         if (net->ipdata.atype == address_dhcp)
-             fprintf(netfile, "    Address found via DHCP %d.%d.%d.%d \n",
-                     net->ipdata.range_ip[0], net->ipdata.range_ip[1],
-@@ -1634,8 +1518,7 @@
-     fprintf(netfile, "Network;NetType;ESSID;BSSID;Info;Channel;Cloaked;Encryption;Decrypted;MaxRate;MaxSeenRate;Beacon;"
-             "LLC;Data;Crypt;Weak;Total;Carrier;Encoding;FirstTime;LastTime;BestQuality;BestSignal;BestNoise;"
--            "GPSMinLat;GPSMinLon;GPSMinAlt;GPSMinSpd;GPSMaxLat;GPSMaxLon;GPSMaxAlt;GPSMaxSpd;"
--            "GPSBestLat;GPSBestLon;GPSBestAlt;DataSize;IPType;IP;\n\r");
-+            "DataSize;IPType;IP;\n\r");
-     stable_sort(network_list.begin(), network_list.end(), SortFirstTimeLT());
-@@ -1819,9 +1702,6 @@
-                 "%d;%d;%d;%d;%d;"
-                 "%s;%s;%s;%s;"
-                 "%d;%d;%d;"
--                "%f;%f;%f;%f;"
--                "%f;%f;%f;%f;"
--                "%f;%f;%f;"
-                 "%ld;%s;"
-                 "%hu.%hu.%hu.%hu;\n\r",
-                 netnum, type, SanitizeCSV(net->ssid).c_str(), 
-@@ -1835,9 +1715,6 @@
-                 (net->llc_packets + net->data_packets),
-                 carrier.c_str(), encoding.c_str(), ft, lt,
-                 net->best_quality, net->best_signal, net->best_noise,
--                net->min_lat, net->min_lon, net->min_alt, net->min_spd,
--                net->max_lat, net->max_lon, net->max_alt, net->max_spd,
--                net->best_lat, net->best_lon, net->best_alt,
-                 net->datasize, iptype.c_str(),
-                 net->ipdata.range_ip[0], net->ipdata.range_ip[1], 
-                               net->ipdata.range_ip[2], net->ipdata.range_ip[3]);
-@@ -2056,23 +1933,6 @@
-         fprintf(netfile, "    <datasize>%ld</datasize>\n", net->datasize);
--        if (net->gps_fixed != -1) {
--            fprintf(netfile, "    <gps-info unit=\"%s\">\n", metric ? "metric" : "english");
--            fprintf(netfile, "      <min-lat>%f</min-lat>\n", net->min_lat);
--            fprintf(netfile, "      <min-lon>%f</min-lon>\n", net->min_lon);
--            fprintf(netfile, "      <min-alt>%f</min-alt>\n",
--                    metric ? net->min_alt / 3.3 : net->min_alt);
--            fprintf(netfile, "      <min-spd>%f</min-spd>\n",
--                    metric ? net->min_spd * 1.6093 : net->min_spd);
--            fprintf(netfile, "      <max-lat>%f</max-lat>\n", net->max_lat);
--            fprintf(netfile, "      <max-lon>%f</max-lon>\n", net->max_lon);
--            fprintf(netfile, "      <max-alt>%f</max-alt>\n",
--                    metric ? net->max_alt / 3.3 : net->max_alt);
--            fprintf(netfile, "      <max-spd>%f</max-spd>\n",
--                    metric ? net->max_spd * 1.6093 : net->max_spd);
--            fprintf(netfile, "    </gps-info>\n");
--        }
--
-         if (net->ipdata.atype > address_factory) {
-             char *addrtype;
-             switch (net->ipdata.atype) {
-@@ -2171,23 +2031,6 @@
-               if (cli->crypt_set & crypt_pptp)
-                       fprintf(netfile, "      <client-encryption>PPTP</client-encryption>\n");
--            if (cli->gps_fixed != -1) {
--                fprintf(netfile, "      <client-gps-info unit=\"%s\">\n", metric ? "metric" : "english");
--                fprintf(netfile, "        <client-min-lat>%f</client-min-lat>\n", cli->min_lat);
--                fprintf(netfile, "        <client-min-lon>%f</client-min-lon>\n", cli->min_lon);
--                fprintf(netfile, "        <client-min-alt>%f</client-min-alt>\n",
--                        metric ? cli->min_alt / 3.3 : cli->min_alt);
--                fprintf(netfile, "        <client-min-spd>%f</client-min-spd>\n",
--                        metric ? cli->min_spd * 1.6093 : cli->min_spd);
--                fprintf(netfile, "        <client-max-lat>%f</client-max-lat>\n", cli->max_lat);
--                fprintf(netfile, "        <client-max-lon>%f</client-max-lon>\n", cli->max_lon);
--                fprintf(netfile, "        <client-max-alt>%f</client-max-alt>\n",
--                        metric ? cli->max_alt / 3.3 : cli->max_alt);
--                fprintf(netfile, "        <client-max-spd>%f</client-max-spd>\n",
--                        metric ? cli->max_spd * 1.6093 : cli->max_spd);
--                fprintf(netfile, "      </client-gps-info>\n");
--            }
--
-             fprintf(netfile, "      <client-datasize>%ld</client-datasize>\n", cli->datasize);
-             fprintf(netfile, "      <client-maxrate>%2.1f</client-maxrate>\n", cli->maxrate);
-             fprintf(netfile, "      <client-maxseenrate>%ld</client-maxseenrate>\n", (long) cli->maxseenrate * 100);
-@@ -2437,23 +2280,3 @@
- }
--// Write a gpsdrive compatable waypoint file
--int Packetracker::WriteGpsdriveWaypt(FILE *in_file) {
--    fseek(in_file, 0L, SEEK_SET);
--    ftruncate(fileno(in_file), 0);
--
--    // Convert the map to a vector and sort it
--    for (map<mac_addr, wireless_network *>::const_iterator i = bssid_map.begin();
--         i != bssid_map.end(); ++i) {
--        wireless_network *net = i->second;
--
--        float lat, lon;
--        lat = (net->min_lat + net->max_lat) / 2;
--        lon = (net->min_lon + net->max_lon) / 2;
--        fprintf(in_file, "%s\t%f  %f\n", net->bssid.Mac2String().c_str(), lat, lon);
--    }
--
--    fflush(in_file);
--
--    return 1;
--}
-diff -urN kismet.old/packetracker.h kismet.dev/packetracker.h
---- kismet.old/packetracker.h  2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/packetracker.h  2005-08-15 00:32:27.876981744 +0200
-@@ -30,7 +30,6 @@
- #include <string>
- #include "util.h"
--#include "gpsd.h"
- #include "packet.h"
- #include "tracktypes.h"
- #include "manuf.h"
-@@ -85,8 +84,6 @@
-     int WriteXMLNetworks(string in_fname);
-     int WriteCisco(string in_fname);
--    int WriteGpsdriveWaypt(FILE *in_file);
--
-     void WriteSSIDMap(FILE *in_file);
-     void ReadSSIDMap(FILE *in_file);
-diff -urN kismet.old/packetsourcetracker.cc kismet.dev/packetsourcetracker.cc
---- kismet.old/packetsourcetracker.cc  2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/packetsourcetracker.cc  2005-08-15 00:33:14.628874376 +0200
-@@ -24,7 +24,6 @@
- Packetsourcetracker::Packetsourcetracker() {
-     next_packsource_id = 0;
-     next_meta_id = 0;
--    gpsd = NULL;
-     timetracker = NULL;
-     chanchild_pid = 0;
-     sockpair[0] = sockpair[1] = 0;
-@@ -691,7 +690,6 @@
-         
-         // Register the trackers with it
-         meta->capsource->AddTimetracker(timetracker);
--        meta->capsource->AddGpstracker(gpsd);
-        
-         // Open it
-         fprintf(stderr, "Source %d (%s): Opening %s source interface %s...\n",
-diff -urN kismet.old/packetsourcetracker.h kismet.dev/packetsourcetracker.h
---- kismet.old/packetsourcetracker.h   2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/packetsourcetracker.h   2005-08-15 00:33:28.304795320 +0200
-@@ -30,7 +30,6 @@
- #include <string>
- #include "timetracker.h"
--#include "gpsd.h"
- #include "packetsource.h"
- // Sentinel for starting a new packet
-@@ -144,9 +143,6 @@
-     // Register a timer event handler for us to use
-     void AddTimetracker(Timetracker *in_tracker) { timetracker = in_tracker; }
--    // Register the GPS server for us to use
--    void AddGpstracker(GPSD *in_gpsd) { gpsd = in_gpsd; }
--    
-     // Register a packet prototype source...  Card type string, root binding requirement,
-     // function to generate an instance of the source, and function to change channel 
-     // for this card type.  This fills out the prototype. Sources that don't hop 
-@@ -221,7 +217,6 @@
-         uint16_t channel;
-     } chanchild_changepacket;
--    GPSD *gpsd;
-     Timetracker *timetracker;
-     
-     char errstr[1024];
-diff -urN kismet.old/packetstream.h kismet.dev/packetstream.h
---- kismet.old/packetstream.h  2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/packetstream.h  2005-08-15 00:33:45.954112216 +0200
-@@ -45,7 +45,6 @@
- typedef struct stream_version_packet {
-     uint16_t drone_version;
--      uint8_t gps_enabled;
- };
- typedef struct stream_packet_header {
-@@ -64,18 +63,6 @@
-     uint8_t encoding __attribute__ ((packed));
-     uint32_t datarate __attribute__ ((packed));
--    int16_t gps_lat __attribute__ ((packed));
--    int64_t gps_lat_mant __attribute__ ((packed));
--    int16_t gps_lon __attribute__ ((packed));
--    int64_t gps_lon_mant __attribute__ ((packed));
--    int16_t gps_alt __attribute__ ((packed));
--    int64_t gps_alt_mant __attribute__ ((packed));
--    int16_t gps_spd __attribute__ ((packed));
--    int64_t gps_spd_mant __attribute__ ((packed));
--    int16_t gps_heading __attribute__ ((packed));
--    int64_t gps_heading_mant __attribute__ ((packed));
--    int8_t gps_fix __attribute__ ((packed));
--
-     uint8_t sourcename[32] __attribute__ ((packed));
- };
-diff -urN kismet.old/panelfront.cc kismet.dev/panelfront.cc
---- kismet.old/panelfront.cc   2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/panelfront.cc   2005-08-15 01:09:42.017809920 +0200
-@@ -37,7 +37,6 @@
-     "  Key  Action",
-     "   e   List Kismet servers",
-     "   z   Toggle fullscreen zoom of network view",
--    "   m   Toggle muting of sound and speech",
-     "   t   Tag (or untag) selected network",
-     "   g   Group tagged networks",
-     "   u   Ungroup current group",
-@@ -237,19 +236,6 @@
- };
--char *KismetHelpGps[] = {
--    "KISMET NETWORK FOLLOW",
--    "This panel estimates the center of a network, the current",
--    "direction of travel, and the direction of the network center",
--    "and distance relative to the current direction of movement.",
--    " Key   Action",
--    "  s    Follow location of strongest packet",
--    "  c    Follow location of estimated network center",
--    "  q    Close popup",
--    NULL
--};
--
--
- char *KismetHelpStats[] = {
-     "KISMET NETWORK STATISTICS",
-     "This panel displays overall statistics about the wireless",
-@@ -678,7 +664,6 @@
-     }
-     // Enable all the protocols we handle
--    in_client->EnableProtocol("GPS");
-     in_client->EnableProtocol("INFO");
-     in_client->EnableProtocol("REMOVE");
-     in_client->EnableProtocol("NETWORK");
-@@ -1282,27 +1267,6 @@
-         if (con->client == NULL)
-             continue;
--        // Update GPS
--        float newlat, newlon, newalt, newspd, newheading;
--        int newfix;
--        con->client->FetchLoc(&newlat, &newlon, &newalt, &newspd, &newheading, &newfix);
--
--        if (GPSD::EarthDistance(newlat, newlon, last_lat, last_lon) > 10) {
--            con->last_lat = con->lat;
--            con->last_lon = con->lon;
--            con->last_spd = con->spd;
--            con->last_alt = con->alt;
--            con->last_fix = con->fix;
--            con->last_heading = con->heading;
--        }
--
--        con->lat = newlat;
--        con->lon = newlon;
--        con->alt = newalt;
--        con->spd = newspd;
--        con->heading = newheading;
--        con->fix = newfix;
--
-         // Update quality
-         con->quality = con->client->FetchQuality();
-         con->power = con->client->FetchPower();
-diff -urN kismet.old/panelfront.h kismet.dev/panelfront.h
---- kismet.old/panelfront.h    2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/panelfront.h    2005-08-15 00:34:52.481998440 +0200
-@@ -65,7 +65,6 @@
- #define SORT_SIZE 10
- extern char *KismetHelpPower[];
- extern char *KismetHelpRate[];
--extern char *KismetHelpGps[];
- extern char *KismetHelpStats[];
- extern char *KismetHelpDump[];
- extern char *KismetHelpPack[];
-@@ -269,7 +268,6 @@
-     int RatePrinter(void *in_window);
-     int StatsPrinter(void *in_window);
-     int PackPrinter(void *in_window);
--    int GpsPrinter(void *in_window);
-     int AlertPrinter(void *in_window);
-     int MainClientPrinter(void *in_window);
-@@ -298,7 +296,6 @@
-     int PackInput(void *in_window, int in_chr);
-     // Help has a generic handler
-     int TextInput(void *in_window, int in_chr);
--    int GpsInput(void *in_window, int in_chr);
-     int AlertInput(void *in_window, int in_chr);
-     int MainClientInput(void *in_window, int in_chr);
-diff -urN kismet.old/panelfront_display.cc kismet.dev/panelfront_display.cc
---- kismet.old/panelfront_display.cc   2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/panelfront_display.cc   2005-08-15 00:35:58.199007936 +0200
-@@ -727,56 +727,6 @@
-         mvwaddstr(netwin, netwin->_maxy, netwin->_maxx - 14, ptxt);
-     }
--#ifdef HAVE_GPS
--
--
--    if (!(lat == 0 && lon == 0 && alt == 0 && spd == 0 && fix == 0)) {
--
--        char gpsdata[80];
--        char fixstr[16];
--        float show_alt = alt;
--        float show_spd = spd;
--
--        if (metric) {
--            show_alt = alt / 3.3;
--            show_spd = spd * 1.6093;
--        }
--
--        if (fix == -1)
--            snprintf(fixstr, 16, "No signal");
--        else if (fix == 2)
--            snprintf(fixstr, 5, "2D");
--        else if (fix == 3)
--            snprintf(fixstr, 5, "3D");
--        else
--            snprintf(fixstr, 5, "NONE");
--
--        // Convert if we're less than a mile/hr or kilom/hr
--        int spdslow = 0;
--        if (spd < 0.5) {
--            spdslow = 1;
--            if (metric)
--                show_spd = spd * 0.2778;
--            else
--                show_spd = spd * 1.4667;
--        }
--
--        snprintf(gpsdata, 80, "Lat %.3f Lon %.3f Alt %.1f%c Spd %.3f%s Hed %.3f Fix %s",
--                 lat, lon, show_alt,
--                 metric ? 'm' : 'f',
--                 show_spd,
--                 spdslow ? (metric ? "m/s" : "f/s") : (metric ? "km/h" : "m/h"),
--                 heading,
--                 fixstr);
--
--        if (color)
--            wattrset(kwin->win, color_map["monitor"].pair);
--        mvwaddstr(netwin, netwin->_maxy, 2, gpsdata);
--        if (color)
--            wattrset(kwin->win, color_map["text"].pair);
--
--    }
--#endif
-     return 1;
-@@ -1496,51 +1446,6 @@
-         snprintf(output, print_width, "Networks: %d", (int) details_network->networks.size());
-         kwin->text.push_back(output);
--        if (details_network->virtnet->gps_fixed != -1) {
--            if ((details_network->virtnet->min_lat == 90) && (details_network->virtnet->min_lon == 180) &&
--                (details_network->virtnet->max_lat == -90) && (details_network->virtnet->max_lon == -180)) {
--                   snprintf(output, print_width, "Min Loc : N/A");
--                   kwin->text.push_back(output);
--                   snprintf(output, print_width, "Max Loc : N/A");
--                   kwin->text.push_back(output);
--                   snprintf(output, print_width, "Range   : N/A");
--                   kwin->text.push_back(output);
--            }
--          else {
--                snprintf(output, print_width, "Min Loc : Lat %f Lon %f Alt %f Spd %f",
--                         details_network->virtnet->min_lat, details_network->virtnet->min_lon,
--                         metric ? details_network->virtnet->min_alt / 3.3 : details_network->virtnet->min_alt,
--                         metric ? details_network->virtnet->min_spd * 1.6093 : details_network->virtnet->min_spd);
--                kwin->text.push_back(output);
--                snprintf(output, print_width, "Max Loc : Lat %f Lon %f Alt %f Spd %f",
--                         details_network->virtnet->max_lat, details_network->virtnet->max_lon,
--                         metric ? details_network->virtnet->max_alt / 3.3 : details_network->virtnet->max_alt,
--                         metric ? details_network->virtnet->max_spd * 1.6093 : details_network->virtnet->max_spd);
--                kwin->text.push_back(output);
--
--                double diagdist = GPSD::EarthDistance(details_network->virtnet->min_lat,
--                                                      details_network->virtnet->min_lon,
--                                                      details_network->virtnet->max_lat,
--                                                      details_network->virtnet->max_lon);
--
--                if (finite(diagdist)) {
--                    if (metric) {
--                        if (diagdist < 1000)
--                            snprintf(output, print_width, "Range    : %.3f meters", diagdist);
--                        else
--                            snprintf(output, print_width, "Range   : %.3f kilometers", diagdist / 1000);
--                    } else {
--                        diagdist *= 3.3;
--                        if (diagdist < 5280)
--                            snprintf(output, print_width, "Range   : %.3f feet", diagdist);
--                        else
--                            snprintf(output, print_width, "Range   : %.3f miles", diagdist / 5280);
--                    }
--                    kwin->text.push_back(output);
--                }
--          }
--        }
--
-         if (details_network->virtnet->carrier_set & (1 << (int) carrier_80211b)) {
-             snprintf(output, print_width, "Carrier : IEEE 802.11b");
-             kwin->text.push_back(output);
-@@ -1848,49 +1753,6 @@
-                      dnet->ipdata.range_ip[2], dnet->ipdata.range_ip[3]);
-             kwin->text.push_back(output);
-         }
--    
--        if (dnet->gps_fixed != -1) {
--            if ((dnet->min_lat == 90) && (dnet->min_lon == 180) &&
--              (dnet->max_lat == -90) && (dnet->max_lon == -180)) {
--                   snprintf(output, print_width, "Min Loc : N/A");
--                   kwin->text.push_back(output);
--                   snprintf(output, print_width, "Max Loc : N/A");
--                   kwin->text.push_back(output);
--                   snprintf(output, print_width, "Range   : N/A");
--                   kwin->text.push_back(output);
--          }
--          else {
--                snprintf(output, print_width, "Min Loc : Lat %f Lon %f Alt %f Spd %f",
--                         dnet->min_lat, dnet->min_lon,
--                         metric ? dnet->min_alt / 3.3 : dnet->min_alt,
--                         metric ? dnet->min_spd * 1.6093 : dnet->min_spd);
--                kwin->text.push_back(output);
--                snprintf(output, print_width, "Max Loc : Lat %f Lon %f Alt %f Spd %f",
--                         dnet->max_lat, dnet->max_lon,
--                         metric ? dnet->max_alt / 3.3 : dnet->max_alt,
--                         metric ? dnet->max_spd * 1.6093 : dnet->max_spd);
--                kwin->text.push_back(output);
--
--                double diagdist = GPSD::EarthDistance(dnet->min_lat, dnet->min_lon,
--                                                  dnet->max_lat, dnet->max_lon);
--
--                if (finite(diagdist)) {
--                    if (metric) {
--                        if (diagdist < 1000)
--                            snprintf(output, print_width, "Range    : %f meters", diagdist);
--                        else
--                            snprintf(output, print_width, "Range   : %f kilometers", diagdist / 1000);
--                    } else {
--                        diagdist *= 3.3;
--                        if (diagdist < 5280)
--                            snprintf(output, print_width, "Range   : %f feet", diagdist);
--                        else
--                            snprintf(output, print_width, "Range   : %f miles", diagdist / 5280);
--                    }
--                    kwin->text.push_back(output);
--                }
--          }
--        }
-     }
-     // Now we just use the text printer to handle the rest for us
-@@ -1898,184 +1760,6 @@
-     return TextPrinter(in_window);
- }
--int PanelFront::GpsPrinter(void *in_window) {
--    kis_window *kwin = (kis_window *) in_window;
--
--    char output[1024];
--    kwin->text.clear();
--
--      if (details_network == NULL) {
--              kwin->text.push_back("The network or group being displayed");
--              kwin->text.push_back("has been deleted.  Please select a ");
--              kwin->text.push_back("different network.");
--              return TextPrinter(in_window);
--      }
--
--    wireless_network *dnet = details_network->virtnet;
--
--    int print_width = kwin->print_width;
--    if (print_width > 1024)
--        print_width = 1023;
--
--    if (print_width < 32) {
--        kwin->text.push_back("Display not wide enough");
--        return TextPrinter(in_window);
--    }
--
--    if (dnet->aggregate_points == 0) {
--        kwin->text.push_back("No GPS data.");
--        return TextPrinter(in_window);
--    }
--
--    float center_lat, center_lon;
--
--    // We hijack the "selected" field as a toggle
--    if (kwin->selected == 1) {
--        center_lat = dnet->best_lat;
--        center_lon = dnet->best_lon;
--    } else {
--        center_lat = dnet->aggregate_lat / dnet->aggregate_points;
--        center_lon = dnet->aggregate_lon / dnet->aggregate_points;
--    }
--
--    // Get bearing to the center
--    float center_angle = GPSD::CalcHeading(center_lat, center_lon, lat, lon);
--
--    float difference_angle = heading - center_angle;
--    if (difference_angle < 0)
--        difference_angle += 360;
--
--    double diagdist = GPSD::EarthDistance(lat, lon, center_lat, center_lon);
--
--    // Now we know everything - where we are, where we are headed, where we SHOULD be headed
--    // to get to the supposed center of the network, how far it is, and the orientation on our
--    // compass to get to it.  Time to start drawing our output.
--
--    char compass[5][10];
--    memset(compass, 0, sizeof(char) * 5 * 10);
--
--    // |  41.12345x-74.12345     .-|-/    |
--    // | Bearing:               /  |/ \   |
--    // |  123.23 degrees       |   O   |  |
--    // |                        \   \ /   |
--    // | Estimated center:       '---\    |
--
--
--    // Find the orientation on our compass:
--    if (difference_angle > 330 || difference_angle <= 22) {
--        snprintf(compass[0], 10, "  .-|-.  ");
--        snprintf(compass[1], 10, " /  |  \\ ");
--        snprintf(compass[2], 10, "|   O   |");
--        snprintf(compass[3], 10, " \\     / ");
--        snprintf(compass[4], 10, "  '---'  ");
--    } else if (difference_angle > 22 && difference_angle <= 66) {
--        snprintf(compass[0], 10, "  .---/  ");
--        snprintf(compass[1], 10, " /   / \\ ");
--        snprintf(compass[2], 10, "|   O   |");
--        snprintf(compass[3], 10, " \\     / ");
--        snprintf(compass[4], 10, "  '---'  ");
--    } else if (difference_angle > 66 && difference_angle <= 110) {
--        snprintf(compass[0], 10, "  .---.  ");
--        snprintf(compass[1], 10, " /     \\ ");
--        snprintf(compass[2], 10, "|   O----");
--        snprintf(compass[3], 10, " \\     / ");
--        snprintf(compass[4], 10, "  '---'  ");
--    } else if (difference_angle > 110 && difference_angle <= 154) {
--        snprintf(compass[0], 10, "  .---.  ");
--        snprintf(compass[1], 10, " /     \\ ");
--        snprintf(compass[2], 10, "|   O   |");
--        snprintf(compass[3], 10, " \\   \\ / ");
--        snprintf(compass[4], 10, "  '---\\  ");
--    } else if (difference_angle > 154 && difference_angle <= 198) {
--        snprintf(compass[0], 10, "  .---.  ");
--        snprintf(compass[1], 10, " /     \\ ");
--        snprintf(compass[2], 10, "|   O   |");
--        snprintf(compass[3], 10, " \\  |  / ");
--        snprintf(compass[4], 10, "  '-|-'  ");
--    } else if (difference_angle > 198 && difference_angle <= 242) {
--        snprintf(compass[0], 10, "  .---.  ");
--        snprintf(compass[1], 10, " /     \\ ");
--        snprintf(compass[2], 10, "|   O   |");
--        snprintf(compass[3], 10, " \\ /   / ");
--        snprintf(compass[4], 10, "  /---'  ");
--    } else if (difference_angle > 242 && difference_angle <= 286) {
--        snprintf(compass[0], 10, "  .---.  ");
--        snprintf(compass[1], 10, " /     \\ ");
--        snprintf(compass[2], 10, "----O   |");
--        snprintf(compass[3], 10, " \\     / ");
--        snprintf(compass[4], 10, "  '---'  ");
--    } else if (difference_angle > 286 && difference_angle <= 330) {
--        snprintf(compass[0], 10, "  \\---.  ");
--        snprintf(compass[1], 10, " / \\   \\ ");
--        snprintf(compass[2], 10, "|   O   |");
--        snprintf(compass[3], 10, " \\     / ");
--        snprintf(compass[4], 10, "  '---'  ");
--    } else {
--        snprintf(compass[0], 10, "%f\n", difference_angle);
--    }
--
--
--    // - Network GPS ---------------------|
--    // | Current:                         |
--    // |  41.12345x-74.12345     .-|-.    |
--    // | Bearing:               /  |  \   |
--    // |  123.23 degrees       |   O   |  |
--    // |                        \   \ /   |
--    // | Estimated center:       '---\    |
--    // | -73.12345x43.12345               |
--    // |                        120 feet  |
--    // ------------------------------------
--    char textfrag[23];
--
--    snprintf(output, print_width, "Current:");
--    kwin->text.push_back(output);
--
--    snprintf(textfrag, 23, "%.3f x %.3f", lat, lon);
--    snprintf(output, print_width, "%-22s%s", textfrag, compass[0]);
--    kwin->text.push_back(output);
--
--    snprintf(textfrag, 23, " Bearing:");
--    snprintf(output, print_width, "%-22s%s", textfrag, compass[1]);
--    kwin->text.push_back(output);
--
--    snprintf(textfrag, 23, " %.2f*", heading);
--    snprintf(output, print_width, "%-22s%s", textfrag, compass[2]);
--    kwin->text.push_back(output);
--
--    snprintf(textfrag, 23, " ");
--    snprintf(output, print_width, "%-22s%s", textfrag, compass[3]);
--    kwin->text.push_back(output);
--
--    if (kwin->selected == 1)
--        snprintf(textfrag, 23, "Strongest signal:");
--    else
--        snprintf(textfrag, 23, "Estimated Center:");
--    snprintf(output, print_width, "%-22s%s", textfrag, compass[4]);
--    kwin->text.push_back(output);
--
--    snprintf(textfrag, 23, "%.3f x %.3f", center_lat, center_lon);
--    snprintf(output, print_width, "%-22s%.2f*", textfrag, difference_angle);
--    kwin->text.push_back(output);
--
--    if (metric) {
--        if (diagdist < 1000)
--            snprintf(textfrag, 23, "%.2f m", diagdist);
--        else
--            snprintf(textfrag, 23, "%.2f km", diagdist / 1000);
--    } else {
--        diagdist *= 3.3;
--        if (diagdist < 5280)
--            snprintf(textfrag, 23, "%.2f ft", diagdist);
--        else
--            snprintf(textfrag, 23, "%.2f mi", diagdist / 5280);
--    }
--
--    snprintf(output, print_width, "%-22s%s", "", textfrag);
--    kwin->text.push_back(output);
--
--    return TextPrinter(in_window);
--}
--
- int PanelFront::PackPrinter(void *in_window) {
-     kis_window *kwin = (kis_window *) in_window;
-@@ -3044,54 +2728,6 @@
-              details_client->ipdata.ip[2], details_client->ipdata.ip[3]);
-     kwin->text.push_back(output);
--    if (details_client->gps_fixed != -1) {
--        kwin->text.push_back("");
--
--        if ((details_client->min_lat == 90) && (details_client->min_lon == 180) &&
--            (details_client->max_lat == -90) && (details_client->max_lon == -180)) {
--               snprintf(output, print_width, "Min Loc : N/A");
--               kwin->text.push_back(output);
--               snprintf(output, print_width, "Max Loc : N/A");
--               kwin->text.push_back(output);
--               snprintf(output, print_width, "Range   : N/A");
--               kwin->text.push_back(output);
--        }
--      else {
--            snprintf(output, print_width, "Min Loc : Lat %f Lon %f Alt %f Spd %f",
--                     details_client->min_lat, details_client->min_lon,
--                     metric ? details_client->min_alt / 3.3 : details_client->min_alt,
--                     metric ? details_client->min_spd * 1.6093 : details_client->min_spd);
--            kwin->text.push_back(output);
--            snprintf(output, print_width, "Max Loc : Lat %f Lon %f Alt %f Spd %f",
--                     details_client->max_lat, details_client->max_lon,
--                     metric ? details_client->max_alt / 3.3 : details_client->max_alt,
--                     metric ? details_client->max_spd * 1.6093 : details_client->max_spd);
--            kwin->text.push_back(output);
--
--            double diagdist = GPSD::EarthDistance(details_client->min_lat,
--                                                  details_client->min_lon,
--                                                  details_client->max_lat,
--                                                  details_client->max_lon);
--
--            if (finite(diagdist)) {
--                if (metric) {
--                    if (diagdist < 1000)
--                        snprintf(output, print_width, "Range    : %f meters", diagdist);
--                    else
--                        snprintf(output, print_width, "Range    : %f kilometers", diagdist / 1000);
--                } else {
--                    diagdist *= 3.3;
--                    if (diagdist < 5280)
--                        snprintf(output, print_width, "Range   : %f feet", diagdist);
--                    else
--                        snprintf(output, print_width, "Range   : %f miles", diagdist / 5280);
--                }
--                kwin->text.push_back(output);
--            }
--        }
--        kwin->text.push_back("");
--    }
--
-     snprintf(output, print_width, "Packets :");
-     kwin->text.push_back(output);
-     snprintf(output, print_width, "  Data    : %d", details_client->data_packets);
-diff -urN kismet.old/panelfront_input.cc kismet.dev/panelfront_input.cc
---- kismet.old/panelfront_input.cc     2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/panelfront_input.cc     2005-08-15 01:10:39.680043928 +0200
-@@ -300,16 +300,9 @@
-         break;
-     case 'f':
-     case 'F':
--        if (sortby != sort_auto && last_displayed.size() > 0) {
--            details_network = last_displayed[kwin->selected];
--            SpawnWindow("Network Location", &PanelFront::GpsPrinter, &PanelFront::GpsInput, 8, 34);
--        } else {
--            WriteStatus("Cannot view network GPS info in autofit sort mode.  Sort by a different method.");
--        }
-         break;
-     case 'm':
-     case 'M':
--        MuteToggle();
-         break;
-     case 'e':
-     case 'E':
-@@ -447,7 +440,6 @@
-     switch(in_chr) {
-     case 'm':
-     case 'M':
--        MuteToggle();
-         break;
-     case 'p':
-     case 'P':
-@@ -546,32 +538,6 @@
-     return 1;
- }
--int PanelFront::GpsInput(void *in_window, int in_chr) {
--    kis_window *kwin = (kis_window *) in_window;
--
--    switch (in_chr) {
--    case 's':
--    case 'S':
--        kwin->selected = 1;
--        break;
--    case 'c':
--    case 'C':
--        kwin->selected = 0;
--        break;
--    case 'h':
--    case 'H':
--        SpawnHelp(KismetHelpGps);
--        break;
--    case 'x':
--    case 'X':
--    case 'q':
--    case 'Q':
--        return 0;
--        break;
--    }
--
--    return 1;
--}
- int PanelFront::RateInput(void *in_window, int in_chr) {
-     switch (in_chr) {
-@@ -645,24 +611,6 @@
-     return 1;
- }
--void PanelFront::MuteToggle() {
--    if (muted) {
--        speech = old_speech;
--        sound = old_sound;
--        muted = 0;
--        WriteStatus("Restoring sound");
--    } else if (sound != 0 || speech != 0) {
--        old_speech = speech;
--        old_sound = sound;
--        sound = 0;
--        speech = 0;
--        muted = 1;
--        WriteStatus("Muting sound");
--    } else if (sound == 0 && speech == 0) {
--        WriteStatus("Sound not enabled.");
--    }
--}
--
- int PanelFront::AlertInput(void *in_window, int in_chr) {
-     kis_window *kwin = (kis_window *) in_window;
-diff -urN kismet.old/pcapsource.cc kismet.dev/pcapsource.cc
---- kismet.old/pcapsource.cc   2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/pcapsource.cc   2005-08-15 00:40:28.291416856 +0200
-@@ -296,11 +296,6 @@
-     packet->moddata = moddata;
-     packet->modified = 0;
--    if (gpsd != NULL) {
--        gpsd->FetchLoc(&packet->gps_lat, &packet->gps_lon, &packet->gps_alt,
--                       &packet->gps_spd, &packet->gps_heading, &packet->gps_fix);
--    }
--
-     if (datalink_type == DLT_PRISM_HEADER) {
-         ret = Prism2KisPack(packet, data, moddata);
-     } else if (datalink_type == KDLT_BSD802_11) {
-@@ -1075,133 +1070,6 @@
- // Monitor commands
- #ifdef HAVE_LINUX_WIRELESS
--// Cisco uses its own config file in /proc to control modes
--int monitor_cisco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    FILE *cisco_config;
--    char cisco_path[128];
--
--    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
--    (*in_if) = ifparm;
--
--    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
--        return -1;
--    }
--
--    if (Iwconfig_Get_SSID(in_dev, in_err, ifparm->essid) < 0)
--        return -1;
--
--    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
--        return -1;
--
--    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
--        return -1;
--
--    if (Ifconfig_Delta_Flags(in_dev, in_err, IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
--        return -1;
--
--    // Try the iwpriv
--    if (Iwconfig_Set_IntPriv(in_dev, "setRFMonitor", 1, 0, in_err) >= 0) {
--        return 0;
--    }
--
--    // Zero the ssid - nonfatal
--    Iwconfig_Set_SSID(in_dev, in_err, NULL);
--   
--    // Build the proc control path
--    snprintf(cisco_path, 128, "/proc/driver/aironet/%s/Config", in_dev);
--
--    if ((cisco_config = fopen(cisco_path, "w")) == NULL) {
--        snprintf(in_err, STATUS_MAX, "Unable to open cisco control file '%s' %d:%s",
--                 cisco_path, errno, strerror(errno));
--        return -1;
--    }
--
--    fprintf(cisco_config, "Mode: r\n");
--    fprintf(cisco_config, "Mode: y\n");
--    fprintf(cisco_config, "XmitPower: 1\n");
--
--    fclose(cisco_config);
--
--    // Channel can't be set on cisco with these drivers.
--
--    return 0;
--}
--
--int unmonitor_cisco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
--    int ret = -1;
--
--    // Try the iwpriv
--    if (Iwconfig_Set_IntPriv(in_dev, "setRFMonitor", 0, 0, in_err) >= 0) {
--        // If we're the new drivers, unmonitor
--        if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
--            return -1;
--        }
--
--        // Reset the SSID since monitor mode nukes it
--        if (Iwconfig_Set_SSID(in_dev, in_err, ifparm->essid) < 0)
--            return -1;
--
--        if (ifparm->channel > 0) {
--            if (Iwconfig_Set_Channel(in_dev, ifparm->channel, in_err) < 0)
--                return -1;
--        }
--
--        ret = 1;
--    }
--
--    free(ifparm);
--
--    return ret;
--}
--
--// Cisco uses its own config file in /proc to control modes
--//
--// I was doing this with ioctls but that seems to cause lockups while
--// this method doesn't.  I don't think I like these drivers.
--int monitor_cisco_wifix(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    FILE *cisco_config;
--    char cisco_path[128];
--    vector<string> devbits = StrTokenize(in_dev, ":");
--
--    if (devbits.size() < 2) {
--        snprintf(in_err, STATUS_MAX, "Invalid device pair '%s'.  Proper device "
--                               "for cisco_wifix is eth?:wifi?.", in_dev);
--        return -1;
--    }
--
--    // Bring the device up, zero its ip, and set promisc
--    if (Ifconfig_Delta_Flags(devbits[0].c_str(), in_err, 
--                             IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
--        return -1;
--    if (Ifconfig_Delta_Flags(devbits[1].c_str(), in_err, 
--                             IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
--        return -1;
--
--    // Zero the ssid, nonfatally
--    Iwconfig_Set_SSID(devbits[0].c_str(), in_err, NULL);
--    Iwconfig_Set_SSID(devbits[1].c_str(), in_err, NULL);
--    
--    // Build the proc control path
--    snprintf(cisco_path, 128, "/proc/driver/aironet/%s/Config", devbits[0].c_str());
--
--    if ((cisco_config = fopen(cisco_path, "w")) == NULL) {
--        snprintf(in_err, STATUS_MAX, "Unable to open cisco control file '%s' %d:%s",
--                 cisco_path, errno, strerror(errno));
--        return -1;
--    }
--
--    fprintf(cisco_config, "Mode: r\n");
--    fprintf(cisco_config, "Mode: y\n");
--    fprintf(cisco_config, "XmitPower: 1\n");
--
--    fclose(cisco_config);
--
--    // Channel can't be set on cisco with these drivers.
--
--    return 0;
--}
--
- // Hostap uses iwpriv and iwcontrol settings to control monitor mode
- int monitor_hostap(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
-     int ret;
-@@ -1350,134 +1218,6 @@
-     return 1;
- }
--
--// Acx100 uses the packhdr iwpriv control to set link state, rest is normal
--int monitor_acx100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    int ret;
--
--    // Allocate a tracking record for the interface settings and remember our
--    // setup
--    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
--    (*in_if) = ifparm;
--
--    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
--        return -1;
--    }
--
--    if (Iwconfig_Get_SSID(in_dev, in_err, ifparm->essid) < 0)
--        return -1;
--
--    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
--        return -1;
--
--    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
--        return -1;
--
--    // it looks like an orinoco now, apparently
--    if ((ret = Iwconfig_Set_IntPriv(in_dev, "monitor", 1, initch, in_err)) < 0) {
--        if (ret == -2)
--            snprintf(in_err, 1024, "Could not find 'monitor' private ioctl "
--                     "Make sure you have the latest ACX100 development release.");
--        return -1;
--    }
--
--    if (chancontrol_wext(in_dev, initch, in_err, NULL) < 0)
--        return -1;
--
--    return 0;
--}
--
--int unmonitor_acx100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    // Restore the IP settings
--    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
--
--    if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
--        return -1;
--    }
--
--    Iwconfig_Set_IntPriv(in_dev, "monitor", 0, ifparm->channel, in_err);
--    Iwconfig_Set_Mode(in_dev, in_err, ifparm->mode);
--
--    if (Iwconfig_Set_SSID(in_dev, in_err, ifparm->essid) < 0)
--        return -1;
--    
--    free(ifparm);
--
--    return 1;
--}
--
--int monitor_admtek(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    // Allocate a tracking record for the interface settings and remember our
--    // setup
--    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
--    (*in_if) = ifparm;
--
--    // Try to figure out the name so we know if we have fcs bytes or not
--    char iwname[IFNAMSIZ+1];
--    if (Iwconfig_Get_Name(in_dev, in_err, iwname) < 0)
--        return -1;
--
--    if (strncmp(iwname, "IEEE 802.11b", IFNAMSIZ) == 0) {
--        // Looks like the GPL driver, we need to adjust the fcsbytes
--        PcapSource *psrc = (PcapSource *) in_ext;
--        psrc->fcsbytes = 4;
--    }
--
--    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
--        return -1;
--    }
--
--    if ((ifparm->flags & IFF_UP)) {
--        if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
--            return -1;
--
--        if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
--            return -1;
--
--        if (Iwconfig_Get_SSID(in_dev, in_err, ifparm->essid) < 0)
--            return -1;
--    
--    } else {
--        ifparm->channel = -1;
--        ifparm->mode = -1;
--    }
--
--    int ret = monitor_wext(in_dev, initch, in_err, in_if, in_ext);
--
--    if (ret < 0 && ret != -2)
--        return ret;
--
--    if (Iwconfig_Set_SSID(in_dev, in_err, "") < 0)
--        return -1;
--    
--    return 0;
--}
--
--int unmonitor_admtek(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
--
--    if (unmonitor_wext(in_dev, initch, in_err, in_if, in_ext))
--        return -1;
--
--    if (Iwconfig_Set_SSID(in_dev, in_err, ifparm->essid) < 0)
--        return -1;
--   
--    return 1;
--}
--// vtar5k iwpriv control to set link state, rest is normal
--int monitor_vtar5k(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    // Set the prism iwpriv control to 1
--    if (Iwconfig_Set_IntPriv(in_dev, "prism", 1, 0, in_err) < 0) {
--        return -1;
--    }
--    
--    // The rest is standard wireless extensions
--    if (monitor_wext(in_dev, initch, in_err, in_if, in_ext) < 0)
--        return -1;
--
--    return 0;
--}
--
- // Madwifi stuff uses iwpriv mode
- int monitor_madwifi_a(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
-     // Allocate a tracking record for the interface settings and remember our
-@@ -1656,88 +1396,6 @@
-     return unmonitor_wext(in_dev, initch, in_err, in_if, in_ext);
- }
--int monitor_ipw2100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    // Allocate a tracking record for the interface settings and remember our
--    // setup
--    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
--    (*in_if) = ifparm;
--
--    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
--        return -1;
--    }
--
--    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
--        return -1;
--
--    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
--        return -1;
--
--    // Call the normal monitor mode
--    return (monitor_wext(in_dev, initch, in_err, in_if, in_ext));
--}
--
--int unmonitor_ipw2100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
--    // Restore initial monitor header
--    // linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
--
--    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
--
--    if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
--        return -1;
--    }
--
--    if (Iwconfig_Set_Mode(in_dev, in_err, ifparm->mode) < 0)
--        return -1;
--
--    free(ifparm);
--
--    return 1;
--}
--
--int monitor_ipw2200(const char *in_dev, int initch, char *in_err, 
--                                      void **in_if, void *in_ext) {
--    // Allocate a tracking record for the interface settings and remember our
--    // setup
--    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
--    (*in_if) = ifparm;
--
--    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
--        return -1;
--    }
--
--    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
--        return -1;
--
--    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
--        return -1;
--
--    // Call the normal monitor mode
--    return (monitor_wext(in_dev, initch, in_err, in_if, in_ext));
--}
--
--int unmonitor_ipw2200(const char *in_dev, int initch, char *in_err, 
--                                        void **in_if, void *in_ext) {
--    // Restore initial monitor header
--    // linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
--
--    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
--
--    if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
--        return -1;
--    }
--
--    if (Iwconfig_Set_Mode(in_dev, in_err, ifparm->mode) < 0)
--        return -1;
--
--      // James says this wants to be set to channel 0 for proper scanning operation
--      if (Iwconfig_Set_Channel(in_dev, 0, in_err) < 0)
--              return -1;
--
--    free(ifparm);
--
--    return 1;
--}
--
- // "standard" wireless extension monitor mode
- int monitor_wext(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
-     int mode;
-@@ -2186,75 +1844,6 @@
-     return 0;
- }
--int chancontrol_ipw2100(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
--    // Introduce a slight delay to let the driver settle, a la orinoco.  I don't
--    // like doing this at all since it introduces hiccups into the channel control
--    // process, but....
--
--    int ret = 0;
--
--    ret = chancontrol_wext(in_dev, in_ch, in_err, in_ext);
--    usleep(5000);
--
--    return ret;
--}
--
--int chancontrol_ipw2200(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
--      // Lets see if this really needs the channel change delay like the 2100 did
--    int ret = 0;
--
--    ret = chancontrol_wext(in_dev, in_ch, in_err, in_ext);
--      // Drop a tiny sleep in here to let the channel set settle, otherwise we
--      // run the risk of the card freaking out
--      usleep(7000);
--
--    return ret;
--}
--
--#endif
--
--#ifdef SYS_LINUX
--int chancontrol_wlanng(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
--    // I really didn't want to do this...
--    char cmdline[2048];
--
--    // Turn on rfmon on the initial channel
--    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_wlansniff channel=%d enable=true "
--             "prismheader=true >/dev/null 2>&1", in_dev, in_ch);
--    if (RunSysCmd(cmdline) < 0) {
--        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
--        return -1;
--    }
--
--    if (in_ext != NULL) {
--        PcapSourceWlanng *src = (PcapSourceWlanng *) in_ext;
--        src->last_channel = in_ch;
--    }
--    
--    return 0;
--}
--
--int chancontrol_wlanng_avs(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
--    // I really didn't want to do this...
--    char cmdline[2048];
--
--    // Turn on rfmon on the initial channel
--    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_wlansniff channel=%d "
--             "prismheader=false wlanheader=true stripfcs=false keepwepflags=false "
--             "enable=true >/dev/null 2>&1", in_dev, in_ch);
--
--    if (RunSysCmd(cmdline) < 0) {
--        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
--        return -1;
--    }
--
--    if (in_ext != NULL) {
--        PcapSourceWlanng *src = (PcapSourceWlanng *) in_ext;
--        src->last_channel = in_ch;
--    }
--    
--    return 0;
--}
- #endif
- #ifdef SYS_OPENBSD
-diff -urN kismet.old/pcapsource.h kismet.dev/pcapsource.h
---- kismet.old/pcapsource.h    2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/pcapsource.h    2005-08-15 00:42:50.849744696 +0200
-@@ -336,8 +336,6 @@
-                                             char *in_err);
- KisPacketSource *pcapsource_wextfcs_registrant(string in_name, string in_device,
-                                                char *in_err);
--KisPacketSource *pcapsource_ciscowifix_registrant(string in_name, string in_device, 
--                                                  char *in_err);
- KisPacketSource *pcapsource_11g_registrant(string in_name, string in_device,
-                                            char *in_err);
- KisPacketSource *pcapsource_11gfcs_registrant(string in_name, string in_device,
-@@ -365,25 +363,12 @@
- int unmonitor_pcapfile(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- #ifdef HAVE_LINUX_WIRELESS
--// Cisco (old) 
--int monitor_cisco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--int unmonitor_cisco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--// Cisco (new)
--int monitor_cisco_wifix(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- // hostap prism2
- int monitor_hostap(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- int unmonitor_hostap(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- // orinoco
- int monitor_orinoco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- int unmonitor_orinoco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--// acx100
--int monitor_acx100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--int unmonitor_acx100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--// admtek
--int monitor_admtek(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--int unmonitor_admtek(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--// ar5k
--int monitor_vtar5k(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- // Madwifi group of cards
- int monitor_madwifi_a(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- int monitor_madwifi_b(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
-@@ -393,11 +378,6 @@
- // prism54 needs to override the error messages it gets setting channels
- int monitor_prism54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- int unmonitor_prism54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--// Centrino
--int monitor_ipw2100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--int unmonitor_ipw2100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--int monitor_ipw2200(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--int unmonitor_ipw2200(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- // "Standard" wext monitor sequence - mostly a helper for other functions
- // since most cards that use wext still have custom initialization that
- // needs to be done.
-@@ -406,10 +386,6 @@
- #endif
- #ifdef SYS_LINUX
--// wlan-ng modern standard
--int monitor_wlanng(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
--// wlan-ng avs
--int monitor_wlanng_avs(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- // linksys wrt54g monitoring
- int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- #endif
-@@ -434,16 +410,8 @@
- // Prism54 apparently returns a fail code on an iwconfig channel change but
- // then works so we need to override the wext failure code
- int chancontrol_prism54g(const char *in_dev, int in_ch, char *in_err, void *in_ext);
--// We need a delay in it like orinoco, apparently
--int chancontrol_ipw2100(const char *in_dev, int in_ch, char *in_err, void *in_ext);
--int chancontrol_ipw2200(const char *in_dev, int in_ch, char *in_err, void *in_ext);
- #endif
--#ifdef SYS_LINUX
--// Modern wlan-ng and wlan-ng avs
--int chancontrol_wlanng(const char *in_dev, int in_ch, char *in_err, void *in_ext);
--int chancontrol_wlanng_avs(const char *in_dev, int in_ch, char *in_err, void *in_ext);
--#endif
- #ifdef SYS_OPENBSD
- // openbsd prism2 controls
-diff -urN kismet.old/server_protocols.cc kismet.dev/server_protocols.cc
---- kismet.old/server_protocols.cc     2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/server_protocols.cc     2005-08-15 00:44:07.921028080 +0200
-@@ -96,7 +96,7 @@
-     "bssid", "type", "ssid", "beaconinfo",
-     "llcpackets", "datapackets", "cryptpackets",
-     "weakpackets", "channel", "wep", "firsttime",
--    "lasttime", "atype", "rangeip", "gpsfixed",
-+    "lasttime", "atype", "rangeip",
-     "minlat", "minlon", "minalt", "minspd",
-     "maxlat", "maxlon", "maxalt", "maxspd",
-     "octets", "cloaked", "beaconrate", "maxrate",
-@@ -104,7 +104,6 @@
-     "quality", "signal", "noise",
-     "bestquality", "bestsignal", "bestnoise",
-     "bestlat", "bestlon", "bestalt",
--    "agglat", "agglon", "aggalt", "aggpoints",
-     "datasize",
-     "turbocellnid", "turbocellmode", "turbocellsat",
-     "carrierset", "maxseenrate", "encodingset",
-@@ -116,10 +115,6 @@
-     "bssid", "mac", "type", "firsttime", "lasttime",
-     "manufkey", "manufscore",
-     "datapackets", "cryptpackets", "weakpackets",
--    "gpsfixed",
--    "minlat", "minlon", "minalt", "minspd",
--    "maxlat", "maxlon", "maxalt", "maxspd",
--    "agglat", "agglon", "aggalt", "aggpoints",
-     "maxrate",
-     "quality", "signal", "noise",
-     "bestquality", "bestsignal", "bestnoise",
-@@ -399,33 +394,6 @@
-              net->ipdata.range_ip[2], net->ipdata.range_ip[3]);
-     data->ndvec.push_back(tmpstr);
--    snprintf(tmpstr, 128, "%d", net->gps_fixed);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->min_lat);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->min_lon);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->min_alt);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->min_spd);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->max_lat);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->max_lon);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->max_alt);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->max_spd);
--    data->ndvec.push_back(tmpstr);
--
-     snprintf(tmpstr, 128, "%d", net->ipdata.octets);
-     data->ndvec.push_back(tmpstr);
-@@ -476,18 +444,6 @@
-     snprintf(tmpstr, 128, "%f", net->best_alt);
-     data->ndvec.push_back(tmpstr);
--    snprintf(tmpstr, 128, "%f", net->aggregate_lat);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->aggregate_lon);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", net->aggregate_alt);
--    data->ndvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%ld", net->aggregate_points);
--    data->ndvec.push_back(tmpstr);
--
-     snprintf(tmpstr, 128, "%ld", net->datasize);
-     data->ndvec.push_back(tmpstr);
-@@ -573,45 +529,6 @@
-     snprintf(tmpstr, 128, "%d", cli->interesting_packets);
-     data->cdvec.push_back(tmpstr);
--    snprintf(tmpstr, 128, "%d", cli->gps_fixed);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->min_lat);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->min_lon);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->min_alt);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->min_spd);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->max_lat);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->max_lon);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->max_alt);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->max_spd);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->aggregate_lat);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->aggregate_lon);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%f", cli->aggregate_alt);
--    data->cdvec.push_back(tmpstr);
--
--    snprintf(tmpstr, 128, "%ld", cli->aggregate_points);
--    data->cdvec.push_back(tmpstr);
--
-     snprintf(tmpstr, 128, "%2.1f", cli->maxrate);
-     data->cdvec.push_back(tmpstr);
-diff -urN kismet.old/tcpclient.cc kismet.dev/tcpclient.cc
---- kismet.old/tcpclient.cc    2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/tcpclient.cc    2005-08-15 01:06:01.938267096 +0200
-@@ -29,18 +29,16 @@
-     protocol_default_map["STRING"] = "bssid,sourcemac,text";
-     protocol_default_map["KISMET"] = "version,starttime,servername,timestamp,"
-         "channelhop,newversion";
--    protocol_default_map["GPS"] = "lat,lon,alt,spd,heading,fix";
-     protocol_default_map["NETWORK"] = "bssid,type,ssid,beaconinfo,llcpackets,datapackets,cryptpackets,"
--        "weakpackets,channel,wep,firsttime,lasttime,atype,rangeip,gpsfixed,minlat,minlon,minalt,minspd,"
--        "maxlat,maxlon,maxalt,maxspd,octets,cloaked,beaconrate,maxrate,"
--        "quality,signal,noise,bestquality,bestsignal,bestnoise,bestlat,bestlon,bestalt,"
--        "agglat,agglon,aggalt,aggpoints,datasize,turbocellnid,turbocellmode,turbocellsat,"
-+        "weakpackets,channel,wep,firsttime,lasttime,atype,rangeip,"
-+        "octets,cloaked,beaconrate,maxrate,"
-+        "quality,signal,noise,bestquality,bestsignal,bestnoise,"
-+        "datasize,turbocellnid,turbocellmode,turbocellsat,"
-         "carrierset,maxseenrate,encodingset,decrypted,dupeivpackets";
-     protocol_default_map["CLIENT"] = "bssid,mac,type,firsttime,lasttime,"
-         "datapackets,cryptpackets,weakpackets,"
--        "gpsfixed,minlat,minlon,minalt,minspd,maxlat,maxlon,maxalt,maxspd,"
--        "agglat,agglon,aggalt,aggpoints,maxrate,quality,signal,noise,"
--        "bestquality,bestsignal,bestnoise,bestlat,bestlon,bestalt,"
-+        "maxrate,quality,signal,noise,"
-+        "bestquality,bestsignal,bestnoise,"
-         "atype,ip,datasize,maxseenrate,encodingset,decrypted,wep";
-     protocol_default_map["WEPKEY"] = "origin,bssid,key,encrypted,failed";
-     protocol_default_map["CARD"] = "interface,type,username,channel,id,packets,hopping";
-@@ -48,7 +46,6 @@
-     sv_valid = 0;
-     client_fd = 0;
--    lat = lon = alt = spd = 0;
-     mode = 0;
-     num_networks = num_packets = num_crypt = num_interesting =
-@@ -343,14 +340,6 @@
-               // Bitmask set of encoding types seen in this network
-               int encoding_set;
--              int gps_fixed;
--              float min_lat, min_lon, min_alt, min_spd;
--              float max_lat, max_lon, max_alt, max_spd;
--
--              // Averaged center position
--              double aggregate_lat, aggregate_lon, aggregate_alt;
--              long aggregate_points;
--
-               // How fast we can go
-               float maxrate;
-@@ -359,7 +348,6 @@
-               // Connection information
-               int quality, signal, noise;
-               int best_quality, best_signal, best_noise;
--              float best_lat, best_lon, best_alt;
-               // Amount of data, in bytes
-               unsigned long datasize;
-@@ -393,23 +381,20 @@
-         scanned = sscanf(in_data+hdrlen+18, "%d \001%255[^\001]\001 "
-                                                "\001%255[^\001]\001 "
-                          "%d %d %d %d %d %d %d %d %d %hd.%hd.%hd.%hd "
--                         "%d %f %f %f %f %f %f %f %f %d %d %d %f %d %d %d %d %d %d "
--                                               "%f %f %f %lf %lf %lf %ld %ld"
-+                         "%d %d %d %f %d %d %d %d %d %d "
-+                                       "%ld"
-                          "%d %d %d %d %d %d %d %d",
-                          (int *) &type, ssid, beaconstr,
-                          &llc_packets, &data_packets, &crypt_packets, 
-                          &interesting_packets, &channel, &crypt_set, 
-                          (int *) &first_time, (int *) &last_time,
-                          (int *) &atype, &range[0], &range[1], &range[2], 
--                         &range[3], &gps_fixed, &min_lat, &min_lon, 
--                         &min_alt, &min_spd, &max_lat, &max_lon, 
--                         &max_alt, &max_spd, &octets, 
-+                         &range[3],
-+                         &octets, 
-                          &cloaked, &beacon, &maxrate, &quality, 
-                          &signal, &noise, &best_quality, 
-                          &best_signal, &best_noise,
--                         &best_lat, &best_lon, &best_alt,
--                         &aggregate_lat, &aggregate_lon, &aggregate_alt,
--                         &aggregate_points, &datasize,
-+                         &datasize,
-                          &turbocell_nid, (int *) &turbocell_mode, 
-                          &turbocell_sat, &carrier_set, &maxseenrate, 
-                          &encoding_set, &decrypted, &dupeiv_packets);
-@@ -456,15 +441,6 @@
-               net->beacon = beacon;
-               net->carrier_set = carrier_set;
-               net->encoding_set = encoding_set;
--              net->gps_fixed = gps_fixed;
--              net->min_lat = min_lat;
--              net->min_lon = min_lon;
--              net->min_alt = min_alt;
--              net->min_spd = min_spd;
--              net->max_lat = max_lat;
--              net->max_lon = max_lon;
--              net->max_alt = max_alt;
--              net->max_spd = max_spd;
-         net->maxrate = maxrate;
-               net->maxseenrate = maxseenrate;
-               net->quality = quality;
-@@ -473,13 +449,6 @@
-               net->best_quality = best_quality;
-               net->best_signal = best_signal;
-               net->best_noise = best_noise;
--              net->best_lat = best_lat;
--              net->best_lon = best_lon;
--              net->best_alt = best_alt;
--              net->aggregate_points = aggregate_points;
--              net->aggregate_lat = aggregate_lat;
--              net->aggregate_lon = aggregate_lon;
--              net->aggregate_alt = aggregate_alt;
-               net->datasize = datasize;
-               net->dupeiv_packets = dupeiv_packets;
-               net->decrypted = decrypted;
-@@ -505,13 +474,6 @@
-               int crypt_packets;
-               int interesting_packets;
--              // gps data
--              int gps_fixed;
--              float min_lat, min_lon, min_alt, min_spd;
--              float max_lat, max_lon, max_alt, max_spd;
--              double aggregate_lat, aggregate_lon, aggregate_alt;
--              long aggregate_points;
--
-               // How fast we can go
-               float maxrate;
-               // How fast we've been seen to go, in 100kbs units
-@@ -523,7 +485,6 @@
-               // Last seen quality for a packet from this client
-               int quality, signal, noise;
-               int best_quality, best_signal, best_noise;
--              float best_lat, best_lon, best_alt;
-               // ip data
-               address_type atype;
-@@ -558,24 +519,16 @@
-             return 0;
-         }
--        scanned = sscanf(in_data+hdrlen+36, "%d %d %d %d %d %d %d "
--                         "%f %f %f %f %f %f %f %f %lf %lf "
--                         "%lf %ld %f %d %d %d %d %d %d "
--                         "%f %f %f %d %hd.%hd.%hd.%hd %ld %d %d %d %d",
-+        scanned = sscanf(in_data+hdrlen+36, "%d %d %d %d %d %d "
-+                         "%d %d %d %d %d %d "
-+                         "%d %hd.%hd.%hd.%hd %ld %d %d %d %d",
-                          (int *) &type,
-                          (int *) &first_time, (int *) &last_time,
-                          &data_packets, &crypt_packets,
-                          &interesting_packets,
--                         &gps_fixed, &min_lat, &min_lon,
--                         &min_alt, &min_spd,
--                         &max_lat, &max_lon, &max_alt,
--                         &max_spd, &aggregate_lat, 
--                                               &aggregate_lon,
--                         &aggregate_alt, &aggregate_points,
-                          &maxrate, &quality, &signal, &noise,
-                          &best_quality, &best_signal, 
-                                                &best_noise,
--                         &best_lat, &best_lon, &best_alt,
-                          (int *) &atype, &ip[0], &ip[1], &ip[2], &ip[3],
-                          &datasize, &maxseenrate, &encoding_set,
-                          &decrypted, &crypt_set);
-@@ -607,15 +560,6 @@
-               client->last_time = last_time;
-               client->first_time = first_time;
-               client->encoding_set = encoding_set;
--              client->gps_fixed = gps_fixed;
--              client->min_lat = min_lat;
--              client->min_lon = min_lon;
--              client->min_alt = min_alt;
--              client->min_spd = min_spd;
--              client->max_lat = max_lat;
--              client->max_lon = max_lon;
--              client->max_alt = max_alt;
--              client->max_spd = max_spd;
-         client->maxrate = maxrate;
-               client->maxseenrate = maxseenrate;
-               client->quality = quality;
-@@ -624,13 +568,6 @@
-               client->best_quality = best_quality;
-               client->best_signal = best_signal;
-               client->best_noise = best_noise;
--              client->best_lat = best_lat;
--              client->best_lon = best_lon;
--              client->best_alt = best_alt;
--              client->aggregate_lat = aggregate_lat;
--              client->aggregate_lon = aggregate_lon;
--              client->aggregate_alt = aggregate_alt;
--              client->aggregate_points = aggregate_points;
-               client->datasize = datasize;
-               client->decrypted = decrypted;
-@@ -653,10 +590,6 @@
-             net_map[bssid]->type = network_remove;
-         }
--    } else if (!strncmp(header, "*GPS", 64)) {
--        if (sscanf(in_data+hdrlen, "%f %f %f %f %f %d", &lat, &lon, &alt, &spd, &heading, &mode) < 5)
--            return 0;
--
-     } else if (!strncmp(header, "*INFO", 64)) {
-         char chan_details[1024];
-         char chan_details_sec[1024];
-@@ -843,14 +776,6 @@
-     return serv_time;
- }
--int TcpClient::FetchLoc(float *in_lat, float *in_lon, float *in_alt, float *in_spd, float *in_hed, int *in_mode) {
--    *in_lat = lat; *in_lon = lon;
--    *in_alt = alt; *in_spd = spd;
--    *in_hed = heading;
--    *in_mode = mode;
--    return mode;
--}
--
- vector<TcpClient::card_info *> TcpClient::FetchCardList() {
-     return card_map_vec;
- }
-diff -urN kismet.old/tcpclient.h kismet.dev/tcpclient.h
---- kismet.old/tcpclient.h     2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/tcpclient.h     2005-08-15 01:06:11.096874776 +0200
-@@ -125,8 +125,6 @@
-     // Disable a protocol
-     void RemoveProtocol(string in_protocol);
--    // Fetch the location
--    int FetchLoc(float *in_lat, float *in_lon, float *in_alt, float *in_spd, float *in_hed, int *in_mode);
-     // Fetch the mode
-     int FetchMode() { return mode; }
-@@ -236,8 +234,6 @@
-     struct hostent *client_host;
-     // Data sent to us
--    // GPS
--    float lat, lon, alt, spd, heading;
-     int mode;
-     // Timestampt
-     time_t serv_time;
-diff -urN kismet.old/tcpstreamer.cc kismet.dev/tcpstreamer.cc
---- kismet.old/tcpstreamer.cc  2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/tcpstreamer.cc  2005-08-15 00:54:02.870582000 +0200
-@@ -31,7 +31,6 @@
-     max_fd = 0;
--      gpsd = NULL;
- }
- TcpStreamer::~TcpStreamer()
-@@ -287,10 +286,6 @@
-     hdr.frame_len = (uint32_t) htonl(sizeof(struct stream_version_packet));
-     vpkt.drone_version = (uint16_t) htons(STREAM_DRONE_VERSION);
--      if (gpsd != NULL)
--              vpkt.gps_enabled = 1;
--      else
--              vpkt.gps_enabled = 0;
-     if (!FD_ISSET(in_fd, &client_fds))
-         return -1;
-@@ -361,22 +356,6 @@
-     packhdr.carrier = in_packet->carrier;
-     packhdr.encoding = in_packet->encoding;
-     packhdr.datarate = (uint32_t) htonl(in_packet->datarate);
--    // GPS first-iteration
--    Float2Pair(in_packet->gps_lat, &packhdr.gps_lat, &packhdr.gps_lat_mant);
--    Float2Pair(in_packet->gps_lon, &packhdr.gps_lon, &packhdr.gps_lon_mant);
--    Float2Pair(in_packet->gps_alt, &packhdr.gps_alt, &packhdr.gps_alt_mant);
--    Float2Pair(in_packet->gps_spd, &packhdr.gps_spd, &packhdr.gps_spd_mant);
--    packhdr.gps_fix = in_packet->gps_fix;
--    // endianswap
--    packhdr.gps_lat = (int16_t) htons(packhdr.gps_lat);
--    packhdr.gps_lat_mant = (int64_t) kis_hton64(packhdr.gps_lat_mant);
--    packhdr.gps_lon = (int16_t) htons(packhdr.gps_lon);
--    packhdr.gps_lon_mant = (int64_t) kis_hton64(packhdr.gps_lon_mant);
--    packhdr.gps_alt = (int16_t) htons(packhdr.gps_alt);
--    packhdr.gps_alt_mant = (int64_t) kis_hton64(packhdr.gps_alt_mant);
--    packhdr.gps_spd = (int16_t) htons(packhdr.gps_spd);
--    packhdr.gps_spd_mant = (int64_t) kis_hton64(packhdr.gps_spd_mant);
--
-     // Sourcename
-     memcpy(packhdr.sourcename, in_packet->sourcename, 32);
-diff -urN kismet.old/tcpstreamer.h kismet.dev/tcpstreamer.h
---- kismet.old/tcpstreamer.h   2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/tcpstreamer.h   2005-08-15 00:54:22.181646272 +0200
-@@ -42,7 +42,6 @@
- #include "ringbuf.h"
- #include "packet.h"
- #include "packetstream.h"
--#include "gpsd.h"
- // Global in kismet_drone.cc
- extern int silent;
-@@ -76,9 +75,6 @@
-     int FetchDescriptor() { return serv_fd; }
--    // Register the GPS server for us to use
--    void AddGpstracker(GPSD *in_gpsd) { gpsd = in_gpsd; }
--
-     void Kill(int in_fd);
-     int Poll(fd_set& in_rset, fd_set& in_wset);
-@@ -125,7 +121,6 @@
-     unsigned int max_fd;
--      GPSD *gpsd;
- };
- #endif
-diff -urN kismet.old/tracktypes.h kismet.dev/tracktypes.h
---- kismet.old/tracktypes.h    2005-07-25 16:19:44.000000000 +0200
-+++ kismet.dev/tracktypes.h    2005-08-15 00:55:29.308441448 +0200
-@@ -104,22 +104,6 @@
-         data_packets = crypt_packets = interesting_packets = 0;
--        gps_fixed = -1;
--
--        /* by setting the min to the highest possible values in the range and
--         max to the lowest we ensure that the data is correct */
--        min_lat = 90;
--        max_lat = -90;
--        min_lon = 180;
--        max_lon = -180;
--
--        /* since these are not limited, we just set to 0 */
--        min_alt = min_spd = 0;
--        max_alt = max_spd = 0;
--
--        aggregate_lat = aggregate_lon = aggregate_alt = 0;
--        aggregate_points = 0;
--
-         maxrate = 0;
-         maxseenrate = 0;
-@@ -219,13 +203,6 @@
-     int crypt_packets;
-     int interesting_packets;
--    // gps data
--    int gps_fixed;
--    float min_lat, min_lon, min_alt, min_spd;
--    float max_lat, max_lon, max_alt, max_spd;
--    double aggregate_lat, aggregate_lon, aggregate_alt;
--    long aggregate_points;
--
-     // How fast we can go
-     double maxrate;
-     // How fast we've been seen to go, in 100kbs units
-@@ -288,22 +265,6 @@
-         beacon = 0;
-         listed = 0;
--        gps_fixed = -1;
--
--        /* by setting the min to the highest possible values in the range and
--         max to the lowest we ensure that the data is correct */
--        min_lat = 90;
--        max_lat = -90;
--        min_lon = 180;
--        max_lon = -180;
--
--        /* since these are not limited, we just set to 0 */
--        min_alt = min_spd = 0;
--        max_alt = max_spd = 0;
--
--        aggregate_lat = aggregate_lon = aggregate_alt = 0;
--        aggregate_points = 0;
--
-         maxrate = 0;
-         maxseenrate = 0;
-@@ -469,14 +430,6 @@
-     map<string, cdp_packet> cisco_equip;
--    int gps_fixed;
--    float min_lat, min_lon, min_alt, min_spd;
--    float max_lat, max_lon, max_alt, max_spd;
--
--    // Averaged center position
--    double aggregate_lat, aggregate_lon, aggregate_alt;
--    long aggregate_points;
--
-     // How fast we can go
-     double maxrate;
diff --git a/openwrt/package/kismet/patches/100-wrt54g_source.patch b/openwrt/package/kismet/patches/100-wrt54g_source.patch
new file mode 100644 (file)
index 0000000..3336a8f
--- /dev/null
@@ -0,0 +1,189 @@
+diff -urN kismet.old/kis_packsources.cc kismet.dev/kis_packsources.cc
+--- kismet.old/kis_packsources.cc      2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev/kis_packsources.cc      2005-08-23 00:59:04.465379568 +0200
+@@ -192,7 +192,7 @@
+                                        chancontrol_wlanng_avs, 1);
+     sourcetracker->RegisterPacketsource("wrt54g", 1, "na", 0,
+                                         pcapsource_wrt54g_registrant,
+-                                        monitor_wrt54g, NULL, NULL, 0);
++                                                                              monitor_wrt54g, unmonitor_wrt54g, chancontrol_wext, 0);
+ #else
+     REG_EMPTY_CARD(sourcetracker, "wlanng");
+     REG_EMPTY_CARD(sourcetracker, "wlanng_avs");
+diff -urN kismet.old/packetsourcetracker.cc kismet.dev/packetsourcetracker.cc
+--- kismet.old/packetsourcetracker.cc  2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev/packetsourcetracker.cc  2005-08-23 00:59:39.969982048 +0200
+@@ -986,6 +986,7 @@
+                     (meta_packsources[chanpak.meta_num]->device.c_str(), 
+                      chanpak.channel, errstr, 
+                      (void *) (meta_packsources[chanpak.meta_num]->capsource)) < 0) {
++#if 0
+                                       meta_packsources[chanpak.meta_num]->consec_errors++;
+@@ -1007,6 +1008,7 @@
+                                                                                                                                        CHANFLAG_FATAL));
+                                               continue;
+                                       }
++#endif
+                 } else {
+                                       // Otherwise reset the error count
+                                       meta_packsources[chanpak.meta_num]->consec_errors = 0;
+diff -urN kismet.old/pcapsource.cc kismet.dev/pcapsource.cc
+--- kismet.old/pcapsource.cc   2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev/pcapsource.cc   2005-08-23 01:03:45.652632608 +0200
+@@ -115,6 +115,53 @@
+ u_char callback_data[MAX_PACKET_LEN];
+ // Open a source
++int PcapSourceWrt54g::OpenSource() {
++    channel = 0;
++
++    errstr[0] = '\0';
++
++    char *unconst = strdup("prism0");
++
++    pd = pcap_open_live(unconst, MAX_PACKET_LEN, 1, 1000, errstr);
++
++    #if defined (SYS_OPENBSD) || defined(SYS_NETBSD) && defined(HAVE_RADIOTAP)
++    /* Request desired DLT on multi-DLT systems that default to EN10MB. We do this
++       later anyway but doing it here ensures we have the desired DLT from the get go. */
++     pcap_set_datalink(pd, DLT_IEEE802_11_RADIO);
++    #endif
++
++    free(unconst);
++
++    if (strlen(errstr) > 0)
++        return -1; // Error is already in errstr
++
++    paused = 0;
++
++    errstr[0] = '\0';
++
++    num_packets = 0;
++
++    if (DatalinkType() < 0)
++        return -1;
++
++#ifdef HAVE_PCAP_NONBLOCK
++    pcap_setnonblock(pd, 1, errstr);
++#elif !defined(SYS_OPENBSD)
++    // do something clever  (Thanks to Guy Harris for suggesting this).
++    int save_mode = fcntl(pcap_get_selectable_fd(pd), F_GETFL, 0);
++    if (fcntl(pcap_get_selectable_fd(pd), F_SETFL, save_mode | O_NONBLOCK) < 0) {
++        snprintf(errstr, 1024, "fcntl failed, errno %d (%s)",
++                 errno, strerror(errno));
++    }
++#endif
++
++    if (strlen(errstr) > 0)
++        return -1; // Ditto
++    
++    return 1;
++}
++
++// Open a source
+ int PcapSource::OpenSource() {
+     channel = 0;
+@@ -1928,63 +1975,32 @@
+ int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, 
+                                  void *in_ext) {
+     char cmdline[2048];
+-      int mode;
+-      int wlmode = 0;
+-
+-#ifdef HAVE_LINUX_WIRELESS
+-    vector<string> devbits = StrTokenize(in_dev, ":");
+-    if (devbits.size() < 2) {
+-              snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
++              snprintf(cmdline, 2048, "/usr/sbin/iwpriv %s set_monitor 1", in_dev);
+               if (RunSysCmd(cmdline) < 0) {
+-                      snprintf(in_err, 1024, "Unable to set mode using 'wl monitor 1'.  Some "
+-                                       "custom firmware images require you to specify the origial "
++                      snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 1'. "
++                                       "Some custom firmware images require you to specify the origial "
+                                        "device and a new dynamic device and use the iwconfig controls. "
+                                        "see the README for how to configure your capture source.");
+                       return -1;
+               }
+-    } else {
+-              // Get the mode ... If this doesn't work, try the old wl method.
+-              if (Iwconfig_Get_Mode(devbits[0].c_str(), in_err, &mode) < 0) {
+-                      fprintf(stderr, "WARNING:  Getting wireless mode via ioctls failed, "
+-                                      "defaulting to trying the 'wl' command.\n");
+-                      wlmode = 1;
+-              }
+-              if (wlmode == 1) {
+-                      snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
+-                      if (RunSysCmd(cmdline) < 0) {
+-                              snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-                              return -1;
+-                      }
+-              } else if (mode != LINUX_WLEXT_MONITOR) {
+-                      // Set it
+-                      if (Iwconfig_Set_Mode(devbits[0].c_str(), in_err, 
+-                                                                LINUX_WLEXT_MONITOR) < 0) {
+-                              snprintf(in_err, STATUS_MAX, "Unable to set iwconfig monitor "
+-                                               "mode.  If you are using an older wrt54g, try specifying "
+-                                               "only the ethernet device, not ethX:prismX");
+-                              return -1;
+-                      }
++      return 1;
++}
++
++
++int unmonitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, 
++                                 void *in_ext) {
++    char cmdline[2048];
++
++              snprintf(cmdline, 2048, "/usr/sbin/iwpriv %s set_monitor 0", in_dev);
++              if (RunSysCmd(cmdline) < 0) {
++                      snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 0'. "
++                                       "Some custom firmware images require you to specify the origial "
++                                       "device and a new dynamic device and use the iwconfig controls. "
++                                       "see the README for how to configure your capture source.");
++                      return -1;
+               }
+-      }
+-#else
+-      snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
+-      if (RunSysCmd(cmdline) < 0) {
+-              snprintf(in_err, 1024, "Unable to set mode using 'wl monitor 1'.  Some "
+-                               "custom firmware images require you to specify the origial "
+-                               "device and a new dynamic device and use the iwconfig controls. "
+-                               "see the README for how to configure your capture source. "
+-                               "Support for wireless extensions was not compiled in, so more "
+-                               "advanced modes of setting monitor mode are not available.");
+-              return -1;
+-      }
+-      fprintf(stderr, "WARNING:  Support for wireless extensions was not compiled "
+-                      "into this binary.  Using the iw* tools to set monitor mode will not "
+-                      "be available.  This may cause opening the source to fail on some "
+-                      "firmware versions.  To fix this, make sure wireless extensions are "
+-                      "available and found by the configure script when building Kismet.");
+-#endif
+       return 1;
+ }
+diff -urN kismet.old/pcapsource.h kismet.dev/pcapsource.h
+--- kismet.old/pcapsource.h    2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev/pcapsource.h    2005-08-23 01:04:26.057490136 +0200
+@@ -265,6 +265,7 @@
+     PcapSourceWrt54g(string in_name, string in_dev) : PcapSource(in_name, in_dev) { 
+         fcsbytes = 4;
+     }
++      int OpenSource();
+     int FetchPacket(kis_packet *packet, uint8_t *data, uint8_t *moddata);
+ protected:
+     carrier_type IEEE80211Carrier();
+@@ -412,6 +413,7 @@
+ int monitor_wlanng_avs(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
+ // linksys wrt54g monitoring
+ int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
++int unmonitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
+ #endif
+ // This should be expanded to handle BSD...
diff --git a/openwrt/package/kismet/patches/120-cleanup.patch b/openwrt/package/kismet/patches/120-cleanup.patch
new file mode 100644 (file)
index 0000000..1743080
--- /dev/null
@@ -0,0 +1,3113 @@
+diff -urN kismet.dev/Makefile.in kismet.dev2/Makefile.in
+--- kismet.dev/Makefile.in     2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/Makefile.in    2005-08-23 01:59:25.643220248 +0200
+@@ -39,26 +39,25 @@
+ DEPEND        = .depend
+ # Objects
+-PSO   = util.o ringbuf.o configfile.o speech.o ifcontrol.o iwcontrol.o packet.o \
+-              pcapsource.o prism2source.o wtapfilesource.o wsp100source.o \
+-              dronesource.o vihasource.o packetsourcetracker.o kis_packsources.o \
+-              wtapdump.o wtaplocaldump.o gpsdump.o airsnortdump.o fifodump.o \
+-              gpsd.o manuf.o \
++PSO   = util.o ringbuf.o configfile.o ifcontrol.o iwcontrol.o packet.o \
++              pcapsource.o manuf.o \
++              dronesource.o packetsourcetracker.o kis_packsources.o \
++              wtapdump.o wtaplocaldump.o airsnortdump.o fifodump.o \
+               packetracker.o timetracker.o alertracker.o finitestate.o \
+               getopt.o \
+               tcpserver.o server_protocols.o server_globals.o kismet_server.o 
+ PS    = kismet_server
+ DRONEO = util.o ringbuf.o configfile.o getopt.o ifcontrol.o iwcontrol.o packet.o \
+-              tcpstreamer.o prism2source.o pcapsource.o wtapfilesource.o wsp100source.o \
+-              dronesource.o vihasource.o packetsourcetracker.o kis_packsources.o \
+-              timetracker.o gpsd.o server_globals.o kismet_drone.o
++              tcpstreamer.o pcapsource.o \
++              dronesource.o packetsourcetracker.o kis_packsources.o \
++              timetracker.o server_globals.o kismet_drone.o
+ DRONE = kismet_drone
+-NCO   = util.o configfile.o speech.o manuf.o tcpclient.o \
++NCO   = util.o configfile.o manuf.o tcpclient.o \
+               frontend.o cursesfront.o \
+               panelfront.o panelfront_display.o panelfront_input.o \
+-              gpsd.o getopt.o kismet_client.o 
++              getopt.o kismet_client.o 
+ NC    = kismet_client
+ GPSLO = getopt.o util.o configfile.o expat.o manuf.o \
+diff -urN kismet.dev/cursesfront.cc kismet.dev2/cursesfront.cc
+--- kismet.dev/cursesfront.cc  2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/cursesfront.cc 2005-08-23 01:59:25.643220248 +0200
+@@ -30,7 +30,6 @@
+ // Enable the protocols we can use
+ void NCurseFront::AddClient(TcpClient *in_client) {
+     client = in_client;
+-    client->EnableProtocol("GPS");
+     client->EnableProtocol("INFO");
+     client->EnableProtocol("REMOVE");
+     client->EnableProtocol("NETWORK");
+@@ -88,32 +87,8 @@
+         mvwaddstr(netborder, 1, 2, "  SSID                        T W Ch  Data   LLC  Crypt  Wk Flags");
+     }
+-    char gpsdata[1024];
+-    float lat, lon, alt, spd, heading;
+     int mode;
+-    client->FetchLoc(&lat, &lon, &alt, &spd, &heading, &mode);
+-
+-    if (!(lat == 0 && lon == 0 && alt == 0 && spd == 0 && mode == 0)) {
+-
+-        char fix[16];
+-
+-        if (mode == -1)
+-            snprintf(fix, 16, "No signal");
+-        else if (mode == 2)
+-            snprintf(fix, 5, "2D");
+-        else if (mode == 3)
+-            snprintf(fix, 5, "3D");
+-        else
+-            snprintf(fix, 5, "NONE");
+-
+-        snprintf(gpsdata, 1024, "Lat %.3f Lon %.3f Alt %.3f Spd %.3f Fix %s",
+-                 lat, lon, alt, spd, fix);
+-
+-        mvwaddstr(netborder, LINES-statheight-1, 2, gpsdata);
+-
+-    }
+-
+     box(infoborder, '|', '-');
+     mvwaddstr(infoborder, 0, 2, "Info");
+diff -urN kismet.dev/dronesource.cc kismet.dev2/dronesource.cc
+--- kismet.dev/dronesource.cc  2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/dronesource.cc 2005-08-23 01:59:25.644220096 +0200
+@@ -201,9 +201,6 @@
+             return -1;
+         }
+-              // Grab the GPS info
+-              gps_enabled = vpkt.gps_enabled;
+-
+         stream_recv_bytes = 0;
+         // printf("debug - version packet valid\n\n");
+@@ -336,25 +333,6 @@
+     packet->encoding = (encoding_type) phdr.encoding;
+     packet->datarate = (uint32_t) ntohl(phdr.datarate);
+-      if (gps_enabled) {
+-              // If the drone is sending us GPS data, use it
+-              packet->gps_lat = Pair2Float((int16_t) ntohs(phdr.gps_lat),
+-                                                                       (int64_t) kis_ntoh64(phdr.gps_lat_mant));
+-              packet->gps_lon = Pair2Float((int16_t) ntohs(phdr.gps_lon),
+-                                                                       (int64_t) kis_ntoh64(phdr.gps_lon_mant));
+-              packet->gps_alt = Pair2Float((int16_t) ntohs(phdr.gps_alt),
+-                                                                       (int64_t) kis_ntoh64(phdr.gps_alt_mant));
+-              packet->gps_spd = Pair2Float((int16_t) ntohs(phdr.gps_spd),
+-                                                                       (int64_t) kis_ntoh64(phdr.gps_spd_mant));
+-              packet->gps_heading = Pair2Float((int16_t) ntohs(phdr.gps_heading),
+-                                                                               (int64_t) kis_ntoh64(phdr.gps_heading_mant));
+-              packet->gps_fix = phdr.gps_fix;
+-      } else if (gpsd != NULL) {
+-              // Otherwise, no
+-              gpsd->FetchLoc(&packet->gps_lat, &packet->gps_lon, &packet->gps_alt,
+-                                         &packet->gps_spd, &packet->gps_heading, &packet->gps_fix);
+-      }
+-
+     packet->data = data;
+     packet->moddata = moddata;
+     packet->modified = 0;
+diff -urN kismet.dev/dronesource.h kismet.dev2/dronesource.h
+--- kismet.dev/dronesource.h   2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/dronesource.h  2005-08-23 01:59:25.644220096 +0200
+@@ -79,9 +79,6 @@
+     uint8_t databuf[MAX_PACKET_LEN];
+     unsigned int resyncing;
+-
+-      // Is the drone pushing GPS data to us?
+-      int gps_enabled;
+ };
+ // Nothing but a registrant for us
+diff -urN kismet.dev/frontend.cc kismet.dev2/frontend.cc
+--- kismet.dev/frontend.cc     2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/frontend.cc    2005-08-23 01:59:25.645219944 +0200
+@@ -248,33 +248,6 @@
+             }
+-            // Aggregate the GPS data
+-            if (wnet->aggregate_points > 0) {
+-                dnet->virtnet->aggregate_lat += wnet->aggregate_lat;
+-                dnet->virtnet->aggregate_lon += wnet->aggregate_lon;
+-                dnet->virtnet->aggregate_alt += wnet->aggregate_alt;
+-                dnet->virtnet->aggregate_points += wnet->aggregate_points;
+-            }
+-
+-            if (wnet->gps_fixed > dnet->virtnet->gps_fixed)
+-                dnet->virtnet->gps_fixed = wnet->gps_fixed;
+-            if (wnet->min_lat < dnet->virtnet->min_lat || dnet->virtnet->min_lat == 0)
+-                dnet->virtnet->min_lat = wnet->min_lat;
+-            if (wnet->min_lon < dnet->virtnet->min_lon || dnet->virtnet->min_lon == 0)
+-                dnet->virtnet->min_lon = wnet->min_lon;
+-            if (wnet->min_alt < dnet->virtnet->min_alt || dnet->virtnet->min_alt == 0)
+-                dnet->virtnet->min_alt = wnet->min_alt;
+-            if (wnet->min_spd < dnet->virtnet->min_spd || dnet->virtnet->min_spd == 0)
+-                dnet->virtnet->min_spd = wnet->min_spd;
+-            if (wnet->max_lat > dnet->virtnet->max_lat || dnet->virtnet->max_lat == 0)
+-                dnet->virtnet->max_lat = wnet->max_lat;
+-            if (wnet->max_lon > dnet->virtnet->max_lon || dnet->virtnet->max_lon == 0)
+-                dnet->virtnet->max_lon = wnet->max_lon;
+-            if (wnet->max_alt > dnet->virtnet->max_alt || dnet->virtnet->max_alt == 0)
+-                dnet->virtnet->max_alt = wnet->max_alt;
+-            if (wnet->max_spd > dnet->virtnet->max_spd || dnet->virtnet->max_spd == 0)
+-                dnet->virtnet->max_spd = wnet->max_spd;
+-
+             // Aggregate the carriers and encodings
+             dnet->virtnet->carrier_set |= wnet->carrier_set;
+             dnet->virtnet->encoding_set |= wnet->encoding_set;
+diff -urN kismet.dev/kis_packsources.cc kismet.dev2/kis_packsources.cc
+--- kismet.dev/kis_packsources.cc      2005-08-23 00:59:04.465379568 +0200
++++ kismet.dev2/kis_packsources.cc     2005-08-23 02:01:08.585570632 +0200
+@@ -60,13 +60,8 @@
+ #if defined(HAVE_LIBPCAP) && defined(HAVE_LINUX_WIRELESS)
+     // Linux wext-driven cards
+-    sourcetracker->RegisterPacketsource("cisco", 1, "IEEE80211b", 6,
+-                                       pcapsource_wext_registrant,
+-                                       monitor_cisco, unmonitor_cisco, 
+-                                       chancontrol_wext, 1);
+-    sourcetracker->RegisterPacketsource("cisco_wifix", 1, "IEEE80211b", 6,
+-                                       pcapsource_ciscowifix_registrant,
+-                                       monitor_cisco_wifix, NULL, NULL, 1);
++      REG_EMPTY_CARD(sourcetracker, "cisco");
++      REG_EMPTY_CARD(sourcetracker, "cisco_wifix");
+     sourcetracker->RegisterPacketsource("hostap", 1, "IEEE80211b", 6,
+                                        pcapsource_wext_registrant,
+                                        monitor_hostap, unmonitor_hostap, 
+@@ -79,21 +74,9 @@
+                                         pcapsource_wext_registrant,
+                                         monitor_orinoco, unmonitor_orinoco,
+                                         chancontrol_orinoco, 1);
+-    sourcetracker->RegisterPacketsource("acx100", 1, "IEEE80211b", 6,
+-                                       pcapsource_wextfcs_registrant,
+-                                       monitor_acx100, unmonitor_acx100, 
+-                                       chancontrol_wext, 1);
+-    sourcetracker->RegisterPacketsource("admtek", 1, "IEEE80211b", 6,
+-                                        pcapsource_wext_registrant,
+-                                        monitor_admtek, unmonitor_admtek,
+-                                        chancontrol_wext, 1);
+-    sourcetracker->RegisterPacketsource("vtar5k", 1, "IEEE80211a", 36,
+-                                       pcapsource_wext_registrant,
+-                                       monitor_vtar5k, NULL, chancontrol_wext, 1);
+-    sourcetracker->RegisterPacketsource("atmel_usb", 1, "IEEE80211b", 6,
+-                                       pcapsource_wext_registrant,
+-                                       monitor_wext, unmonitor_wext, 
+-                                       chancontrol_wext, 1);
++      REG_EMPTY_CARD(sourcetracker, "acx100");
++      REG_EMPTY_CARD(sourcetracker, "admtek");
++      REG_EMPTY_CARD(sourcetracker, "vtar5k");
+     sourcetracker->RegisterPacketsource("madwifi_a", 1, "IEEE80211a", 36,
+                                         pcapsource_wextfcs_registrant,
+@@ -121,38 +104,14 @@
+                                         monitor_prism54g, unmonitor_prism54g,
+                                         chancontrol_prism54g, 1);
+-    sourcetracker->RegisterPacketsource("wlanng_wext", 1, "IEEE80211b", 6,
+-                                        pcapsource_wlanng_registrant,
+-                                        monitor_wlanng_avs, NULL,
+-                                        chancontrol_wext, 1);
+-
+-    sourcetracker->RegisterPacketsource("ipw2100", 1, "IEEE80211b", 6,
+-                                        pcapsource_wext_registrant,
+-                                        monitor_ipw2100, unmonitor_ipw2100,
+-                                        chancontrol_ipw2100, 1);
+-
+-    sourcetracker->RegisterPacketsource("ipw2200", 1, "IEEE80211g", 6,
+-                                        pcapsource_wext_registrant,
+-                                        monitor_ipw2200, unmonitor_ipw2200,
+-                                        chancontrol_ipw2200, 1);
+-
+-    sourcetracker->RegisterPacketsource("ipw2915", 1, "IEEE80211ab", 6,
+-                                        pcapsource_wext_registrant,
+-                                        monitor_ipw2200, unmonitor_ipw2200,
+-                                        chancontrol_ipw2200, 1);
++      REG_EMPTY_CARD(sourcetracker, "wlanng_wext");
++      REG_EMPTY_CARD(sourcetracker, "ipw2100");
++      REG_EMPTY_CARD(sourcetracker, "ipw2200");
++      REG_EMPTY_CARD(sourcetracker, "ipw2915");
++    REG_EMPTY_CARD(sourcetracker, "rt2400");
++    REG_EMPTY_CARD(sourcetracker, "rt2500");
++    REG_EMPTY_CARD(sourcetracker, "rt8180");
+-    sourcetracker->RegisterPacketsource("rt2400", 1, "IEEE80211b", 6,
+-                                        pcapsource_wext_registrant,
+-                                        monitor_wext, unmonitor_wext,
+-                                        chancontrol_wext, 1);
+-    sourcetracker->RegisterPacketsource("rt2500", 1, "IEEE80211g", 6,
+-                                        pcapsource_11g_registrant,
+-                                        monitor_wext, unmonitor_wext,
+-                                        chancontrol_wext, 1);
+-    sourcetracker->RegisterPacketsource("rt8180", 1, "IEEE80211b", 6,
+-                                        pcapsource_wext_registrant,
+-                                        monitor_wext, unmonitor_wext,
+-                                        chancontrol_wext, 1);
+ #else
+     // Register the linuxwireless pcap stuff as null
+@@ -182,31 +141,13 @@
+     REG_EMPTY_CARD(sourcetracker, "wlanng_wext");
+ #endif
+-#if defined(HAVE_LIBPCAP) && defined(SYS_LINUX)
+-    sourcetracker->RegisterPacketsource("wlanng", 1, "IEEE80211b", 6,
+-                                       pcapsource_wlanng_registrant,
+-                                       monitor_wlanng, NULL, chancontrol_wlanng, 1);
+-    sourcetracker->RegisterPacketsource("wlanng_avs", 1, "IEEE80211b", 6,
+-                                       pcapsource_wlanng_registrant,
+-                                       monitor_wlanng_avs, NULL,
+-                                       chancontrol_wlanng_avs, 1);
+     sourcetracker->RegisterPacketsource("wrt54g", 1, "na", 0,
+                                         pcapsource_wrt54g_registrant,
+-                                                                              monitor_wrt54g, unmonitor_wrt54g, chancontrol_wext, 0);
+-#else
++                                        monitor_wrt54g, unmonitor_wrt54g, chancontrol_wext, 0);
++
+     REG_EMPTY_CARD(sourcetracker, "wlanng");
+     REG_EMPTY_CARD(sourcetracker, "wlanng_avs");
+-    REG_EMPTY_CARD(sourcetracker, "wrt54g");
+-#endif
+-
+-#if defined(SYS_LINUX) && defined(HAVE_LINUX_NETLINK)
+-    sourcetracker->RegisterPacketsource("wlanng_legacy", 1, "IEEE80211b", 6,
+-                                        prism2source_registrant,
+-                                        monitor_wlanng_legacy, NULL,
+-                                        chancontrol_wlanng_legacy, 1);
+-#else
+     REG_EMPTY_CARD(sourcetracker, "wlanng_legacy");
+-#endif
+ #if defined(HAVE_LIBPCAP) && defined(SYS_OPENBSD)
+     sourcetracker->RegisterPacketsource("cisco_openbsd", 1, "IEEE80211b", 6,
+@@ -240,29 +181,11 @@
+     REG_EMPTY_CARD(sourcetracker, "radiotap_bsd_b");
+ #endif
+-#if defined(HAVE_LIBWIRETAP)
+-    sourcetracker->RegisterPacketsource("wtapfile", 0, "na", 0,
+-                                       wtapfilesource_registrant,
+-                                       NULL, NULL, NULL, 0);
+-#else
+     REG_EMPTY_CARD(sourcetracker, "wtapfile");
+-#endif
+-#if defined(HAVE_WSP100)
+-    sourcetracker->RegisterPacketsource("wsp100", 0, "IEEE80211b", 6,
+-                                        wsp100source_registrant,
+-                                        monitor_wsp100, NULL, chancontrol_wsp100, 0);
+-#else
+     REG_EMPTY_CARD(sourcetracker, "wsp100");
+-#endif
+-#if defined(HAVE_VIHAHEADERS)
+-    sourcetracker->RegisterPacketsource("viha", 1, "IEEE80211b", 6,
+-                                        vihasource_registrant,
+-                                        NULL, NULL, chancontrol_viha, 0);
+-#else
+     REG_EMPTY_CARD(sourcetracker, "viha");
+-#endif
+     return 1;
+ }
+diff -urN kismet.dev/kis_packsources.h kismet.dev2/kis_packsources.h
+--- kismet.dev/kis_packsources.h       2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/kis_packsources.h      2005-08-23 01:59:25.646219792 +0200
+@@ -22,11 +22,7 @@
+ #include "config.h"
+ #include "packetsource.h"
+-#include "prism2source.h"
+ #include "pcapsource.h"
+-#include "wtapfilesource.h"
+-#include "wsp100source.h"
+-#include "vihasource.h"
+ #include "dronesource.h"
+ #include "packetsourcetracker.h"
+diff -urN kismet.dev/kismet_client.cc kismet.dev2/kismet_client.cc
+--- kismet.dev/kismet_client.cc        2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/kismet_client.cc       2005-08-23 01:59:25.648219488 +0200
+@@ -28,7 +28,6 @@
+ #include "cursesfront.h"
+ #include "panelfront.h"
+ #include "configfile.h"
+-#include "speech.h"
+ #ifndef exec_name
+ char *exec_name;
+@@ -47,11 +46,7 @@
+ char *configfile;
+ char *uiconfigfile;
+ char *server = NULL;
+-int sound = -1;
+-int speech = -1;
+ int flite = 0;
+-int speech_encoding = 0;
+-string speech_sentence_encrypted, speech_sentence_unencrypted;
+ unsigned int metric = 0;
+ unsigned int reconnect = 0;
+@@ -59,20 +54,9 @@
+ string configdir, groupfile;
+ FILE *group_file = NULL;
+-// Pipe file descriptor pairs and fd's
+-int soundpair[2];
+-int speechpair[2];
+-pid_t soundpid = -1, speechpid = -1;
+-
+ // Catch our interrupt
+ void CatchShutdown(int sig) {
+-    // Kill our sound players
+-    if (soundpid > 0)
+-        kill(soundpid, 9);
+-    if (speechpid > 0)
+-        kill(speechpid, 9);
+-
+     if (group_track) {
+         if ((group_file = fopen(groupfile.c_str(), "w")) == NULL) {
+             fprintf(stderr, "WARNING: Unable to open '%s' for writing, groups will not be saved.\n",
+@@ -116,215 +100,6 @@
+     exit(0);
+ }
+-// Subprocess sound handler
+-void SoundHandler(int *fds, const char *player, map<string, string> soundmap) {
+-    int read_sock = fds[0];
+-
+-    close(fds[1]);
+-
+-    signal(SIGPIPE, PipeHandler);
+-
+-    fd_set rset;
+-
+-    char data[1024];
+-
+-    pid_t sndpid = -1;
+-    int harvested = 1;
+-
+-    while (1) {
+-        FD_ZERO(&rset);
+-        FD_SET(read_sock, &rset);
+-        char *end;
+-
+-        memset(data, 0, 1024);
+-
+-        if (harvested == 0) {
+-            // We consider a wait error to be a sign that the child pid died
+-            // so we flag it as harvested and keep on going
+-            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
+-            if (harvestpid == -1 || harvestpid == sndpid)
+-                harvested = 1;
+-        }
+-
+-        struct timeval tim;
+-        tim.tv_sec = 1;
+-        tim.tv_usec = 0;
+-
+-        if (select(read_sock + 1, &rset, NULL, NULL, &tim) < 0) {
+-            if (errno != EINTR) {
+-                exit(1);
+-            }
+-        }
+-
+-        if (FD_ISSET(read_sock, &rset)) {
+-            int ret;
+-            ret = read(read_sock, data, 1024);
+-
+-            // We'll die off if we get a read error, and we'll let kismet on the
+-            // other side detact that it died
+-            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
+-                exit(1);
+-
+-            if ((end = strstr(data, "\n")) == NULL)
+-                continue;
+-
+-            end[0] = '\0';
+-        }
+-
+-        if (data[0] == '\0')
+-            continue;
+-
+-        // If we've harvested the process, spawn a new one and watch it
+-        // instead.  Otherwise, we just let go of the data we read
+-        if (harvested == 1) {
+-            // Only take the first line
+-            char *nl;
+-            if ((nl = strchr(data, '\n')) != NULL)
+-                *nl = '\0';
+-
+-            char snd[1024];
+-
+-            if (soundmap.size() == 0)
+-                snprintf(snd, 1024, "%s", data);
+-            if (soundmap.find(data) != soundmap.end())
+-                snprintf(snd, 1024, "%s", soundmap[data].c_str());
+-            else
+-                continue;
+-
+-            char plr[1024];
+-            snprintf(plr, 1024, "%s", player);
+-
+-            harvested = 0;
+-            if ((sndpid = fork()) == 0) {
+-                // Suppress errors
+-                int nulfd = open("/dev/null", O_RDWR);
+-                dup2(nulfd, 1);
+-                dup2(nulfd, 2);
+-
+-                char * const echoarg[] = { plr, snd, NULL };
+-                execve(echoarg[0], echoarg, NULL);
+-            }
+-        }
+-
+-        data[0] = '\0';
+-    }
+-}
+-
+-// Subprocess speech handler
+-void SpeechHandler(int *fds, const char *player) {
+-    int read_sock = fds[0];
+-    close(fds[1]);
+-
+-    fd_set rset;
+-
+-    char data[1024];
+-
+-    pid_t sndpid = -1;
+-    int harvested = 1;
+-
+-    while (1) {
+-        FD_ZERO(&rset);
+-        FD_SET(read_sock, &rset);
+-        //char *end;
+-
+-        memset(data, 0, 1024);
+-
+-        struct timeval tim;
+-        tim.tv_sec = 1;
+-        tim.tv_usec = 0;
+-
+-        if (select(read_sock + 1, &rset, NULL, NULL, &tim) < 0) {
+-            if (errno != EINTR) {
+-                exit(1);
+-            }
+-        }
+-
+-        if (harvested == 0) {
+-            // We consider a wait error to be a sign that the child pid died
+-            // so we flag it as harvested and keep on going
+-            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
+-            if (harvestpid == -1 || harvestpid == sndpid)
+-                harvested = 1;
+-        }
+-
+-        if (FD_ISSET(read_sock, &rset)) {
+-            int ret;
+-            ret = read(read_sock, data, 1024);
+-
+-            // We'll die off if we get a read error, and we'll let kismet on the
+-            // other side detact that it died
+-            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
+-                exit(1);
+-
+-            data[ret] = '\0';
+-
+-        }
+-
+-        if (data[0] == '\0')
+-            continue;
+-
+-        // If we've harvested the process, spawn a new one and watch it
+-        // instead.  Otherwise, we just let go of the data we read
+-        if (harvested == 1) {
+-            harvested = 0;
+-            if ((sndpid = fork()) == 0) {
+-                // Only take the first line
+-                char *nl;
+-                if ((nl = strchr(data, '\n')) != NULL)
+-                    *nl = '\0';
+-
+-                // Make sure it's shell-clean
+-                MungeToShell(data, strlen(data));
+-                char spk_call[1024];
+-                snprintf(spk_call, 1024, "echo \"(%s\\\"%s\\\")\" | %s "
+-                                               ">/dev/null 2>/dev/null",
+-                                               flite ? "": "SayText ", data, player);
+-
+-                system(spk_call);
+-
+-                exit(0);
+-            }
+-        }
+-
+-        data[0] = '\0';
+-    }
+-}
+-
+-
+-int PlaySound(string in_sound) {
+-
+-    char snd[1024];
+-
+-    snprintf(snd, 1024, "%s\n", in_sound.c_str());
+-
+-    if (write(soundpair[1], snd, strlen(snd)) < 0) {
+-        char status[STATUS_MAX];
+-        snprintf(status, STATUS_MAX,
+-                 "ERROR: Could not write to sound pipe.  Stopping sound.");
+-        gui->WriteStatus(status);
+-
+-        return 0;
+-    }
+-
+-    return 1;
+-}
+-
+-int SayText(string in_text) {
+-    char snd[1024];
+-
+-    snprintf(snd, 1024, "%s\n", in_text.c_str());
+-
+-    if (write(speechpair[1], snd, strlen(snd)) < 0) {
+-        char status[STATUS_MAX];
+-        snprintf(status, STATUS_MAX,
+-                 "ERROR: Could not write to speech pipe.  Stopping speech.");
+-        gui->WriteStatus(status);
+-
+-        return 0;
+-    }
+-
+-    return 1;
+-}
+ int main(int argc, char *argv[]) {
+     exec_name = argv[0];
+@@ -345,8 +120,6 @@
+     char guihost[1024];
+     int guiport = -1;
+-    int gpsmode = -1;
+-
+     configfile = NULL;
+     uiconfigfile = NULL;
+@@ -391,7 +164,6 @@
+             fprintf(stderr, "Using alternate UI config file: %s\n", uiconfigfile);
+             break;
+         case 'q':
+-            sound = 0;
+             break;
+         case 'g':
+             reqgui = strdup(optarg);
+@@ -515,70 +287,6 @@
+         server = strdup(gui_conf->FetchOpt("host").c_str());
+     }
+-    if (gui_conf->FetchOpt("sound") == "true" && sound == -1) {
+-        if (gui_conf->FetchOpt("soundplay") != "") {
+-            sndplay = gui_conf->FetchOpt("soundplay");
+-            sound = 1;
+-
+-            if (gui_conf->FetchOpt("soundopts") != "")
+-                sndplay += " " + gui_conf->FetchOpt("soundopts");
+-
+-            if (gui_conf->FetchOpt("sound_new") != "")
+-                wav_map["new"] = gui_conf->FetchOpt("sound_new");
+-            if (gui_conf->FetchOpt("sound_new_wep") != "")
+-                wav_map["new_wep"] = gui_conf->FetchOpt("sound_new_wep");
+-            if (gui_conf->FetchOpt("sound_traffic") != "")
+-                wav_map["traffic"] = gui_conf->FetchOpt("sound_traffic");
+-            if (gui_conf->FetchOpt("sound_junktraffic") != "")
+-                wav_map["junktraffic"] = gui_conf->FetchOpt("sound_junktraffic");
+-            if (gui_conf->FetchOpt("sound_gpslock") != "")
+-                wav_map["gpslock"] = gui_conf->FetchOpt("sound_gpslock");
+-            if (gui_conf->FetchOpt("sound_gpslost") != "")
+-                wav_map["gpslost"] = gui_conf->FetchOpt("sound_gpslost");
+-            if (gui_conf->FetchOpt("sound_alert") != "")
+-                wav_map["alert"] = gui_conf->FetchOpt("sound_alert");
+-
+-        } else {
+-            fprintf(stderr, "ERROR:  Sound alerts enabled but no sound playing binary specified.\n");
+-            sound = 0;
+-        }
+-    } else if (sound == -1)
+-        sound = 0;
+-
+-    /* Added by Shaw Innes 17/2/02 */
+-    if (gui_conf->FetchOpt("speech") == "true" && speech == -1) {
+-        if (gui_conf->FetchOpt("festival") != "") {
+-            festival = strdup(gui_conf->FetchOpt("festival").c_str());
+-            speech = 1;
+-
+-                      if (gui_conf->FetchOpt("flite") == "true")
+-                              flite = 1;
+-
+-            string speechtype = gui_conf->FetchOpt("speech_type");
+-
+-            if (!strcasecmp(speechtype.c_str(), "nato"))
+-                speech_encoding = SPEECH_ENCODING_NATO;
+-            else if (!strcasecmp(speechtype.c_str(), "spell"))
+-                speech_encoding = SPEECH_ENCODING_SPELL;
+-            else
+-                speech_encoding = SPEECH_ENCODING_NORMAL;
+-
+-            // Make sure we have encrypted text lines
+-            if (gui_conf->FetchOpt("speech_encrypted") == "" || gui_conf->FetchOpt("speech_unencrypted") == "") {
+-                fprintf(stderr, "ERROR:  Speech request but speech_encrypted or speech_unencrypted line missing.\n");
+-                speech = 0;
+-            }
+-
+-            speech_sentence_encrypted = gui_conf->FetchOpt("speech_encrypted");
+-            speech_sentence_unencrypted = gui_conf->FetchOpt("speech_unencrypted");
+-
+-        } else {
+-            fprintf(stderr, "ERROR: Speech alerts enabled but no path to festival has been specified.\n");
+-            speech = 0;
+-        }
+-    } else if (speech == -1)
+-        speech = 0;
+-
+     if (gui_conf->FetchOpt("decay") != "") {
+         if (sscanf(gui_conf->FetchOpt("decay").c_str(), "%d", &decay) != 1) {
+             fprintf(stderr, "FATAL:  Illegal config file value for decay.\n");
+@@ -636,45 +344,6 @@
+         }
+     }
+-    // Fork and find the sound options
+-    if (sound) {
+-        if (pipe(soundpair) == -1) {
+-            fprintf(stderr, "WARNING:  Unable to create pipe for audio.  Disabling sound.\n");
+-            sound = 0;
+-        } else {
+-            soundpid = fork();
+-
+-            if (soundpid < 0) {
+-                fprintf(stderr, "WARNING:  Unable to fork for audio.  Disabling sound.\n");
+-                sound = 0;
+-            } else if (soundpid == 0) {
+-                SoundHandler(soundpair, sndplay.c_str(), wav_map);
+-                exit(0);
+-            }
+-
+-            close(soundpair[0]);
+-        }
+-    }
+-
+-    if (speech) {
+-        if (pipe(speechpair) == -1) {
+-            fprintf(stderr, "WARNING:  Unable to create pipe for speech.  Disabling speech.\n");
+-            speech = 0;
+-        } else {
+-            speechpid = fork();
+-
+-            if (speechpid < 0) {
+-                fprintf(stderr, "WARNING:  Unable to fork for speech.  Disabling speech.\n");
+-                speech = 0;
+-            } else if (speechpid == 0) {
+-                SpeechHandler(speechpair, festival);
+-                exit(0);
+-            }
+-
+-            close(speechpair[0]);
+-        }
+-    }
+-
+     if (kismet_serv.Connect(guiport, guihost) < 0) {
+         fprintf(stderr, "FATAL:  Could not connect to %s:%d.\n", guihost, guiport);
+         CatchShutdown(-1);
+@@ -884,53 +553,13 @@
+                     }
+                     if (pollret != 0) {
+-                        if (pollret == CLIENT_ALERT)
+-                            if (sound == 1)
+-                                sound = PlaySound("alert");
+-
+                         if (strlen(tcpcli->FetchStatus()) != 0) {
+                             gui->WriteStatus(tcpcli->FetchStatus());
+                             // gui->DrawDisplay();
+                         }
+-                        // The GPS only gets updated for the primary client
+-                        if (tcpcli == primary_client) {
+-                            if (tcpcli->FetchMode() == 0 && gpsmode != 0) {
+-                                if (sound == 1 && gpsmode != -1)
+-                                    sound = PlaySound("gpslost");
+-                                gpsmode = 0;
+-                            } else if (tcpcli->FetchMode() != 0 && gpsmode == 0) {
+-                                if (sound == 1 && gpsmode != -1)
+-                                    sound = PlaySound("gpslock");
+-                                gpsmode = 1;
+-                            }
+-                        }
+-
+                         if (tcpcli->FetchDeltaNumNetworks() > 0) {
+                             wireless_network *newnet = tcpcli->FetchLastNewNetwork();
+-
+-                            if (sound == 1 && newnet != lastspoken) {
+-                                if (newnet->crypt_set && 
+-                                    wav_map.find("new_wep") != wav_map.end())
+-                                    sound = PlaySound("new_wep");
+-                                else
+-                                    sound = PlaySound("new");
+-                            }
+-
+-                            if (speech == 1 && newnet != lastspoken) {
+-                                string text;
+-
+-                                if (newnet != NULL) {
+-                                    if (newnet->crypt_set)
+-                                        text = ExpandSpeechString(speech_sentence_encrypted, newnet, speech_encoding);
+-                                    else
+-                                        text = ExpandSpeechString(speech_sentence_unencrypted, newnet, speech_encoding);
+-
+-                                    speech = SayText(text.c_str());
+-                                }
+-                            }
+-
+-                            lastspoken = newnet;
+                         }
+                         num_networks += tcpcli->FetchNumNetworks();
+@@ -938,17 +567,7 @@
+                         num_noise += tcpcli->FetchNumNoise();
+                         num_dropped += tcpcli->FetchNumDropped();
+-                        if (tcpcli->FetchDeltaNumPackets() != 0) {
+-                            if (time(0) - last_click >= decay && sound == 1) {
+-                                if (tcpcli->FetchDeltaNumPackets() > tcpcli->FetchDeltaNumDropped()) {
+-                                    sound = PlaySound("traffic");
+-                                } else {
+-                                    sound = PlaySound("junktraffic");
+-                                }
+-
+-                                last_click = time(0);
+-                            }
+-                        }
++                                              tcpcli->FetchDeltaNumPackets();
+                     }
+                 }
+             } else {
+diff -urN kismet.dev/kismet_drone.cc kismet.dev2/kismet_drone.cc
+--- kismet.dev/kismet_drone.cc 2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/kismet_drone.cc        2005-08-23 01:59:25.649219336 +0200
+@@ -32,16 +32,11 @@
+ #include "packet.h"
+ #include "packetsource.h"
+-#include "prism2source.h"
+ #include "pcapsource.h"
+-#include "wtapfilesource.h"
+-#include "wsp100source.h"
+-#include "vihasource.h"
+ #include "dronesource.h"
+ #include "packetsourcetracker.h"
+ #include "kis_packsources.h"
+-#include "gpsd.h"
+ #include "tcpstreamer.h"
+ #include "configfile.h"
+@@ -53,10 +48,6 @@
+ const char *config_base = "kismet_drone.conf";
+-GPSD *gps = NULL;
+-int gpsmode = 0;
+-int gps_enable = 0;
+-
+ // Timetracker
+ Timetracker timetracker;
+@@ -81,26 +72,6 @@
+     exit(0);
+ }
+-int GpsEvent(Timetracker::timer_event *evt, void *parm) {
+-    // The GPS only provides us a new update once per second we might
+-    // as well only update it here once a second
+-    if (gps_enable) {
+-        int gpsret;
+-        gpsret = gps->Scan();
+-        if (gpsret < 0) {
+-            if (!silent)
+-                fprintf(stderr, "GPS error fetching data: %s\n",
+-                        gps->FetchError());
+-
+-            gps_enable = 0;
+-        }
+-
+-    }
+-
+-    // We want to be rescheduled
+-    return 1;
+-}
+-
+ // Handle channel hopping... this is actually really simple.
+ int ChannelHopEvent(Timetracker::timer_event *evt, void *parm) {
+     sourcetracker.AdvanceChannel();
+@@ -148,9 +119,6 @@
+     TcpStreamer streamer;
+-    char gpshost[1024];
+-    int gpsport = -1;
+-
+     int channel_hop = -1;
+     int channel_velocity = 1;
+     int channel_dwell = 0;
+@@ -351,46 +319,6 @@
+         exit(1);
+     }
+-    if (conf->FetchOpt("gps") == "true") {
+-        if (sscanf(conf->FetchOpt("gpshost").c_str(), "%1023[^:]:%d", gpshost, &gpsport) != 2) {
+-            fprintf(stderr, "Invalid GPS host in config (host:port required)\n");
+-            exit(1);
+-        }
+-
+-        gps_enable = 1;
+-    } else {
+-            gps_enable = 0;
+-    }
+-
+-    if (gps_enable == 1) {
+-        // Open the GPS
+-        gps = new GPSD(gpshost, gpsport);
+-
+-        // Lock GPS position
+-        if (conf->FetchOpt("gpsmodelock") == "true") {
+-            fprintf(stderr, "Enabling GPS position lock override (broken GPS unit reports 0 always)\n");
+-            gps->SetOptions(GPSD_OPT_FORCEMODE);
+-        }
+-
+-        if (gps->OpenGPSD() < 0) {
+-            fprintf(stderr, "%s\n", gps->FetchError());
+-
+-            gps_enable = 0;
+-        } else {
+-            fprintf(stderr, "Opened GPS connection to %s port %d\n",
+-                    gpshost, gpsport);
+-
+-        }
+-    }
+-
+-    // Update GPS coordinates and handle signal loss if defined
+-    timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &GpsEvent, NULL);
+-
+-      // Add the GPS to the tcpstreamer
+-      streamer.AddGpstracker(gps);
+-
+-    // Register the gps and timetracker with the sourcetracker
+-    sourcetracker.AddGpstracker(gps);
+     sourcetracker.AddTimetracker(&timetracker);
+     // Register the sources
+diff -urN kismet.dev/kismet_server.cc kismet.dev2/kismet_server.cc
+--- kismet.dev/kismet_server.cc        2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/kismet_server.cc       2005-08-23 01:59:25.653218728 +0200
+@@ -37,11 +37,7 @@
+ #include "packet.h"
+ #include "packetsource.h"
+-#include "prism2source.h"
+ #include "pcapsource.h"
+-#include "wtapfilesource.h"
+-#include "wsp100source.h"
+-#include "vihasource.h"
+ #include "dronesource.h"
+ #include "packetsourcetracker.h"
+ #include "kis_packsources.h"
+@@ -51,15 +47,11 @@
+ #include "wtaplocaldump.h"
+ #include "airsnortdump.h"
+ #include "fifodump.h"
+-#include "gpsdump.h"
+-
+-#include "gpsd.h"
+ #include "packetracker.h"
+ #include "timetracker.h"
+ #include "alertracker.h"
+-#include "speech.h"
+ #include "tcpserver.h"
+ #include "server_globals.h"
+ #include "kismet_server.h"
+@@ -89,17 +81,8 @@
+ Alertracker alertracker;
+ Timetracker timetracker;
+-GPSD *gps = NULL;
+-int gpsmode = 0;
+-GPSDump gpsdump;
+-
+-// Last time we tried to reconnect to the gps
+-time_t last_gpsd_reconnect = 0;
+-int gpsd_reconnect_attempt = 0;
+-
+ FifoDumpFile fifodump;
+ TcpServer ui_server;
+-int sound = -1;
+ packet_info last_info;
+ int decay;
+ channel_power channel_graph[CHANNEL_MAX];
+@@ -112,11 +95,8 @@
+ // Wep keys
+ macmap<wep_key_info *> bssid_wep_map;
+-// Pipe file descriptor pairs and fd's
+-int soundpair[2];
+-int speechpair[2];
+ int chanpair[2];
+-pid_t soundpid = -1, speechpid = -1, chanpid = -1;
++pid_t chanpid = -1;
+ // Past alerts
+ unsigned int max_alerts = 50;
+@@ -177,17 +157,6 @@
+ int tcpport = -1;
+ int tcpmax;
+-//const char *sndplay = NULL;
+-string sndplay;
+-
+-const char *festival = NULL;
+-int speech = -1;
+-int flite = 0;
+-int speech_encoding = 0;
+-string speech_sentence_encrypted, speech_sentence_unencrypted;
+-
+-map<string, string> wav_map;
+-
+ int beacon_log = 1;
+ int phy_log = 1;
+ int mangle_log = 0;
+@@ -347,17 +316,6 @@
+         // delete cryptfile;
+     }
+-    if (gps_log == 1) {
+-        if (gpsdump.CloseDump(1) < 0)
+-            fprintf(stderr, "Didn't log any GPS coordinates, unlinking gps file\n");
+-    }
+-
+-    // Kill our sound players
+-    if (soundpid > 0)
+-        kill(soundpid, 9);
+-    if (speechpid > 0)
+-        kill(speechpid, 9);
+-
+     // Shut down the packet sources
+     sourcetracker.CloseSources();
+@@ -368,228 +326,10 @@
+     exit(0);
+ }
+-// Subprocess sound handler
+-void SoundHandler(int *fds, const char *player, map<string, string> soundmap) {
+-    int read_sock = fds[0];
+-    close(fds[1]);
+-
+-    fd_set rset;
+-
+-    char data[1024];
+-
+-    pid_t sndpid = -1;
+-    int harvested = 1;
+-
+-    while (1) {
+-        FD_ZERO(&rset);
+-        FD_SET(read_sock, &rset);
+-        char *end;
+-
+-        memset(data, 0, 1024);
+-
+-        struct timeval tm;
+-        tm.tv_sec = 1;
+-        tm.tv_usec = 0;
+-
+-        if (select(read_sock + 1, &rset, NULL, NULL, &tm) < 0) {
+-            if (errno != EINTR) {
+-                exit(1);
+-            }
+-        }
+-
+-        if (harvested == 0) {
+-            // We consider a wait error to be a sign that the child pid died
+-            // so we flag it as harvested and keep on going
+-            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
+-            if (harvestpid == -1 || harvestpid == sndpid)
+-                harvested = 1;
+-        }
+-
+-        if (FD_ISSET(read_sock, &rset)) {
+-            int ret;
+-            ret = read(read_sock, data, 1024);
+-
+-            // We'll die off if we get a read error, and we'll let kismet on the
+-            // other side detact that it died
+-            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
+-                exit(1);
+-
+-            if ((end = strstr(data, "\n")) == NULL)
+-                continue;
+-
+-            end[0] = '\0';
+-        }
+-
+-        if (data[0] == '\0')
+-            continue;
+-
+-
+-        // If we've harvested the process, spawn a new one and watch it
+-        // instead.  Otherwise, we just let go of the data we read
+-        if (harvested == 1) {
+-            // Only take the first line
+-            char *nl;
+-            if ((nl = strchr(data, '\n')) != NULL)
+-                *nl = '\0';
+-
+-            // Make sure it's shell-clean
+-
+-            char snd[1024];
+-
+-            if (soundmap.size() == 0)
+-                snprintf(snd, 1024, "%s", data);
+-            if (soundmap.find(data) != soundmap.end())
+-                snprintf(snd, 1024, "%s", soundmap[data].c_str());
+-            else
+-                continue;
+-
+-            char plr[1024];
+-            snprintf(plr, 1024, "%s", player);
+-
+-            harvested = 0;
+-            if ((sndpid = fork()) == 0) {
+-                // Suppress errors
+-                if (silent) {
+-                    int nulfd = open("/dev/null", O_RDWR);
+-                    dup2(nulfd, 1);
+-                    dup2(nulfd, 2);
+-                }
+-
+-                char * const echoarg[] = { plr, snd, NULL };
+-                execve(echoarg[0], echoarg, NULL);
+-            }
+-        }
+-        data[0] = '\0';
+-    }
+-}
+-
+-// Subprocess speech handler
+-void SpeechHandler(int *fds, const char *player) {
+-    int read_sock = fds[0];
+-    close(fds[1]);
+-
+-    fd_set rset;
+-
+-    char data[1024];
+-
+-    pid_t sndpid = -1;
+-    int harvested = 1;
+-
+-    while (1) {
+-        FD_ZERO(&rset);
+-        FD_SET(read_sock, &rset);
+-        //char *end;
+-
+-        memset(data, 0, 1024);
+-
+-        if (harvested == 0) {
+-            // We consider a wait error to be a sign that the child pid died
+-            // so we flag it as harvested and keep on going
+-            pid_t harvestpid = waitpid(sndpid, NULL, WNOHANG);
+-            if (harvestpid == -1 || harvestpid == sndpid)
+-                harvested = 1;
+-        }
+-
+-        struct timeval tm;
+-        tm.tv_sec = 1;
+-        tm.tv_usec = 0;
+-
+-        if (select(read_sock + 1, &rset, NULL, NULL, &tm) < 0) {
+-            if (errno != EINTR) {
+-                exit(1);
+-            }
+-        }
+-
+-        if (FD_ISSET(read_sock, &rset)) {
+-            int ret;
+-            ret = read(read_sock, data, 1024);
+-
+-            // We'll die off if we get a read error, and we'll let kismet on the
+-            // other side detact that it died
+-            if (ret <= 0 && (errno != EAGAIN && errno != EPIPE))
+-                exit(1);
+-
+-            data[ret] = '\0';
+-        }
+-
+-        if (data[0] == '\0')
+-            continue;
+-
+-        // If we've harvested the process, spawn a new one and watch it
+-        // instead.  Otherwise, we just let go of the data we read
+-        if (harvested == 1) {
+-            harvested = 0;
+-            if ((sndpid = fork()) == 0) {
+-                // Only take the first line
+-                char *nl;
+-                if ((nl = strchr(data, '\n')) != NULL)
+-                    *nl = '\0';
+-
+-                // Make sure it's shell-clean
+-                MungeToShell(data, strlen(data));
+-                char spk_call[1024];
+-                snprintf(spk_call, 1024, "echo \"(%s\\\"%s\\\")\" | %s "
+-                                               ">/dev/null 2>/dev/null",
+-                                               flite ? "" : "SayText ", data, player);
+-                system(spk_call);
+-
+-                exit(0);
+-            }
+-        }
+-
+-        data[0] = '\0';
+-    }
+-}
+-
+-
+-// Fork and run a system call to play a sound
+-int PlaySound(string in_sound) {
+-
+-    char snd[1024];
+-
+-    snprintf(snd, 1024, "%s\n", in_sound.c_str());
+-
+-    if (write(soundpair[1], snd, strlen(snd)) < 0) {
+-        char status[STATUS_MAX];
+-        if (!silent)
+-            fprintf(stderr, "ERROR:  Write error, closing sound pipe.\n");
+-        snprintf(status, STATUS_MAX, "ERROR:  Write error on sound pipe, closing sound connection");
+-        NetWriteStatus(status);
+-
+-        return 0;
+-    }
+-
+-    return 1;
+-}
+-
+-int SayText(string in_text) {
+-
+-    char snd[1024];
+-
+-    snprintf(snd, 1024, "%s\n", in_text.c_str());
+-    MungeToShell(snd, 1024);
+-
+-    if (write(speechpair[1], snd, strlen(snd)) < 0) {
+-        char status[STATUS_MAX];
+-        if (!silent)
+-            fprintf(stderr, "ERROR:  Write error, closing speech pipe.\n");
+-        snprintf(status, STATUS_MAX, "ERROR:  Write error on speech pipe, closing speech connection");
+-        NetWriteStatus(status);
+-
+-        return 0;
+-    }
+-
+-    return 1;
+-}
+-
+ void KisLocalAlert(const char *in_text) {
+     time_t now = time(0);
+     if (!silent)
+         fprintf(stderr, "ALERT %.24s %s\n", ctime(&now), in_text);
+-
+-    if (sound == 1)
+-        sound = PlaySound("alert");
+-
+ }
+ void KisLocalStatus(const char *in_status) {
+@@ -638,37 +378,6 @@
+     char tmpstr[32];
+-    GPS_data gdata;
+-
+-    if (gps_enable) {
+-        float lat, lon, alt, spd, hed;
+-        int mode;
+-
+-        gps->FetchLoc(&lat, &lon, &alt, &spd, &hed, &mode);
+-
+-        snprintf(tmpstr, 32, "%f", lat);
+-        gdata.lat = tmpstr;
+-        snprintf(tmpstr, 32, "%f", lon);
+-        gdata.lon = tmpstr;
+-        snprintf(tmpstr, 32, "%f", alt);
+-        gdata.alt = tmpstr;
+-        snprintf(tmpstr, 32, "%f", spd);
+-        gdata.spd = tmpstr;
+-        snprintf(tmpstr, 32, "%f", hed);
+-        gdata.heading = tmpstr;
+-        snprintf(tmpstr, 32, "%d", mode);
+-        gdata.mode = tmpstr;
+-    } else {
+-        gdata.lat = "0.0";
+-        gdata.lon = "0.0";
+-        gdata.alt = "0.0";
+-        gdata.spd = "0.0";
+-        gdata.heading = "0.0";
+-        gdata.mode = "0";
+-    }
+-
+-    ui_server.SendToAll(gps_ref, (void *) &gdata);
+-
+     INFO_data idata;
+     snprintf(tmpstr, 32, "%d", tracker.FetchNumNetworks());
+     idata.networks = tmpstr;
+@@ -789,81 +498,6 @@
+     }
+ }
+-int GpsEvent(Timetracker::timer_event *evt, void *parm) {
+-    char status[STATUS_MAX];
+-
+-    // The GPS only provides us a new update once per second we might
+-    // as well only update it here once a second
+-
+-    // If we're disconnected, try to reconnect.
+-    if (gpsd_reconnect_attempt > 0) {
+-        // Increment the time between connection attempts
+-        if (last_gpsd_reconnect + ((gpsd_reconnect_attempt - 1) * 2) < time(0)) {
+-            if (gps->OpenGPSD() < 0) {
+-                last_gpsd_reconnect = time(0);
+-
+-                if (gpsd_reconnect_attempt < 20)
+-                    gpsd_reconnect_attempt++;
+-
+-                snprintf(status, STATUS_MAX, "Unable to reconnect to GPSD, trying "
+-                         "again in %d seconds.", ((gpsd_reconnect_attempt - 1) * 2));
+-
+-                if (!silent || NetWriteStatus(status) == 0)
+-                    fprintf(stderr, "WARNING: %s\n", status);
+-
+-                return 1;
+-            } else {
+-                gpsd_reconnect_attempt = 0;
+-
+-                snprintf(status, STATUS_MAX, "Reopened connection to GPSD");
+-                if (!silent || NetWriteStatus(status) == 0)
+-                    fprintf(stderr, "NOTICE: %s\n", status);
+-            }
+-        } else {
+-            // Don't process more if we haven't woken up yet
+-            return 1;
+-        }
+-
+-    }
+-    
+-    if (gps_enable) {
+-        int gpsret;
+-        gpsret = gps->Scan();
+-
+-        if (gpsret < 0) {
+-            snprintf(status, STATUS_MAX, "GPS error requesting data: %s",
+-                     gps->FetchError());
+-
+-            if (!silent || NetWriteStatus(status) == 0)
+-                fprintf(stderr, "WARNING: %s\n", status);
+-
+-            gpsd_reconnect_attempt = 1;
+-        }
+-
+-        if (gpsret == 0 && gpsmode != 0) {
+-            if (!silent || NetWriteStatus("Lost GPS signal.") == 0)
+-                fprintf(stderr, "Lost GPS signal.\n");
+-            if (sound == 1)
+-                sound = PlaySound("gpslost");
+-
+-            gpsmode = 0;
+-        } else if (gpsret != 0 && gpsmode == 0) {
+-            if (!silent || NetWriteStatus("Acquired GPS signal.") == 0)
+-                fprintf(stderr, "Acquired GPS signal.\n");
+-            if (sound == 1)
+-                sound = PlaySound("gpslock");
+-
+-            gpsmode = 1;
+-        }
+-    }
+-
+-    if (gps_log == 1 && gpsmode != 0 && gps != NULL) {
+-        gpsdump.DumpTrack(gps);
+-    }
+-
+-    // We want to be rescheduled
+-    return 1;
+-}
+ // Simple redirect to the network info drawer.  We don't want to change netwriteinfo to a
+ // timer event since we call it un-timed too
+@@ -884,13 +518,6 @@
+     return 1;
+ }
+-// Write the waypoints for gpsdrive
+-int WaypointSyncEvent(Timetracker::timer_event *evt, void *parm) {
+-    tracker.WriteGpsdriveWaypt(waypoint_file);
+-
+-    return 1;
+-}
+-
+ // Handle tracker maintenance
+ int TrackerTickEvent(Timetracker::timer_event *evt, void *parm) {
+     tracker.Tick();
+@@ -1159,11 +786,9 @@
+            "  -c, --capture-source <src>   Packet capture source line (type,interface,name)\n"
+            "  -C, --enable-capture-sources Comma separated list of named packet sources to use.\n"
+            "  -l, --log-types <types>      Comma separated list of types to log,\n"
+-           "                                (ie, dump,cisco,weak,network,gps)\n"
++           "                                (ie, dump,cisco,weak,network)\n"
+            "  -d, --dump-type <type>       Dumpfile type (wiretap)\n"
+            "  -m, --max-packets <num>      Maximum number of packets before starting new dump\n"
+-           "  -q, --quiet                  Don't play sounds\n"
+-           "  -g, --gps <host:port>        GPS server (host:port or off)\n"
+            "  -p, --port <port>            TCPIP server port for GUI connections\n"
+            "  -a, --allowed-hosts <hosts>  Comma separated list of hosts allowed to connect\n"
+            "  -b, --bind-address <address>    Bind to this address. Default INADDR_ANY\n."
+@@ -1287,23 +912,6 @@
+         ip_track = 1;
+     }
+-
+-    if (conf->FetchOpt("waypoints") == "true") {
+-        if(conf->FetchOpt("waypointdata") == "") {
+-            fprintf(stderr, "WARNING:  Waypoint logging requested but no waypoint data file given.\n"
+-                    "Waypoint logging will be disabled.\n");
+-            waypoint = 0;
+-        } else {
+-            waypointfile = conf->ExpandLogPath(conf->FetchOpt("waypointdata"), "", "", 0, 1);
+-            waypoint = 1;
+-        }
+-        if(conf->FetchOpt("waypoint_essid") == "true") {
+-            waypointformat = 1;
+-        } else {
+-          waypointformat = 0;
+-        }
+-    }
+-
+     if (conf->FetchOpt("metric") == "true") {
+         fprintf(stderr, "Using metric measurements.\n");
+         metric = 1;
+@@ -1421,26 +1029,6 @@
+             }
+         }
+-
+-        if (strstr(logtypes, "gps")) {
+-            if (gps_log == 0) {
+-                fprintf(stderr, "WARNING:  Disabling GPS logging.\n");
+-            } else {
+-                gps_log = 1;
+-
+-                if (conf->FetchOpt("logtemplate") == "") {
+-                    fprintf(stderr, "FATAL:  Logging (gps coordinates) enabled but no logtemplate given in config.\n");
+-                    ErrorShutdown();
+-                }
+-            }
+-
+-        }
+-
+-        if (gps_log == 1 && !net_log) {
+-            fprintf(stderr, "WARNING:  Logging (gps coordinates) enabled but XML logging (networks) was not.\n"
+-                    "It will be enabled now.\n");
+-            xml_log = 1;
+-        }
+     }
+     if (conf->FetchOpt("decay") != "") {
+@@ -1561,72 +1149,6 @@
+         legal_ipblock_vec.push_back(ipb);
+     }
+-    // Process sound stuff
+-    if (conf->FetchOpt("sound") == "true" && sound == -1) {
+-        if (conf->FetchOpt("soundplay") != "") {
+-            sndplay = conf->FetchOpt("soundplay");
+-
+-            if (conf->FetchOpt("soundopts") != "")
+-                sndplay += " " + conf->FetchOpt("soundopts");
+-
+-            sound = 1;
+-
+-            if (conf->FetchOpt("sound_new") != "")
+-                wav_map["new"] = conf->FetchOpt("sound_new");
+-            if (conf->FetchOpt("sound_new_wep") != "")
+-                wav_map["new_wep"] = conf->FetchOpt("sound_new_wep");
+-            if (conf->FetchOpt("sound_traffic") != "")
+-                wav_map["traffic"] = conf->FetchOpt("sound_traffic");
+-            if (conf->FetchOpt("sound_junktraffic") != "")
+-                wav_map["junktraffic"] = conf->FetchOpt("sound_traffic");
+-            if (conf->FetchOpt("sound_gpslock") != "")
+-                wav_map["gpslock"] = conf->FetchOpt("sound_gpslock");
+-            if (conf->FetchOpt("sound_gpslost") != "")
+-                wav_map["gpslost"] = conf->FetchOpt("sound_gpslost");
+-            if (conf->FetchOpt("sound_alert") != "")
+-                wav_map["alert"] = conf->FetchOpt("sound_alert");
+-
+-        } else {
+-            fprintf(stderr, "ERROR:  Sound alerts enabled but no sound playing binary specified.\n");
+-            sound = 0;
+-        }
+-    } else if (sound == -1)
+-        sound = 0;
+-
+-    /* Added by Shaw Innes 17/2/02 */
+-    /* Modified by Andrew Etter 15/9/02 */
+-    if (conf->FetchOpt("speech") == "true" && speech == -1) {
+-        if (conf->FetchOpt("festival") != "") {
+-            festival = strdup(conf->FetchOpt("festival").c_str());
+-            speech = 1;
+-              
+-                      if (conf->FetchOpt("flite") == "true")
+-                              flite = 1;
+-
+-            string speechtype = conf->FetchOpt("speech_type");
+-
+-            if (!strcasecmp(speechtype.c_str(), "nato"))
+-                speech_encoding = SPEECH_ENCODING_NATO;
+-            else if (!strcasecmp(speechtype.c_str(), "spell"))
+-                speech_encoding = SPEECH_ENCODING_SPELL;
+-            else
+-                speech_encoding = SPEECH_ENCODING_NORMAL;
+-
+-            // Make sure we have encrypted text lines
+-            if (conf->FetchOpt("speech_encrypted") == "" || conf->FetchOpt("speech_unencrypted") == "") {
+-                fprintf(stderr, "ERROR:  Speech request but speech_encrypted or speech_unencrypted line missing.\n");
+-                speech = 0;
+-            }
+-
+-            speech_sentence_encrypted = conf->FetchOpt("speech_encrypted");
+-            speech_sentence_unencrypted = conf->FetchOpt("speech_unencrypted");
+-        } else {
+-            fprintf(stderr, "ERROR: Speech alerts enabled but no path to festival has been specified.\n");
+-            speech = 0;
+-        }
+-    } else if (speech == -1)
+-        speech = 0;
+-
+     if (conf->FetchOpt("writeinterval") != "") {
+         if (sscanf(conf->FetchOpt("writeinterval").c_str(), "%d", &datainterval) != 1) {
+             fprintf(stderr, "FATAL:  Illegal config file value for data interval.\n");
+@@ -1646,45 +1168,6 @@
+         fprintf(stderr, "WARNING:  No client_manuf file specified.  Client manufacturers will not be detected.\n");
+     }
+-    // Fork and find the sound options
+-    if (sound) {
+-        if (pipe(soundpair) == -1) {
+-            fprintf(stderr, "WARNING:  Unable to create pipe for audio.  Disabling sound.\n");
+-            sound = 0;
+-        } else {
+-            soundpid = fork();
+-
+-            if (soundpid < 0) {
+-                fprintf(stderr, "WARNING:  Unable to fork for audio.  Disabling sound.\n");
+-                sound = 0;
+-            } else if (soundpid == 0) {
+-                SoundHandler(soundpair, sndplay.c_str(), wav_map);
+-                exit(0);
+-            }
+-
+-            close(soundpair[0]);
+-        }
+-    }
+-
+-    if (speech) {
+-        if (pipe(speechpair) == -1) {
+-            fprintf(stderr, "WARNING:  Unable to create pipe for speech.  Disabling speech.\n");
+-            speech = 0;
+-        } else {
+-            speechpid = fork();
+-
+-            if (speechpid < 0) {
+-                fprintf(stderr, "WARNING:  Unable to fork for speech.  Disabling speech.\n");
+-                speech = 0;
+-            } else if (speechpid == 0) {
+-                SpeechHandler(speechpair, festival);
+-                exit(0);
+-            }
+-
+-            close(speechpair[0]);
+-        }
+-    }
+-
+     // Grab the filtering
+     string filter_bit;
+@@ -1710,7 +1193,7 @@
+     }
+     if ((filter_bit = conf->FetchOpt("filter_export")) != "") {
+-        fprintf(stderr, "Enabling filtering on exported (csv, xml, network, gps) files.\n");
++        fprintf(stderr, "Enabling filtering on exported (csv, xml, network) files.\n");
+         filter_export = 1;
+         if (ConfigFile::ParseFilterLine(filter_bit, &filter_export_bssid, &filter_export_source,
+                                         &filter_export_dest, &filter_export_bssid_invert,
+@@ -1816,14 +1299,6 @@
+     }
+-    if (waypoint) {
+-        if ((waypoint_file = fopen(waypointfile.c_str(), "a")) == NULL) {
+-            fprintf(stderr, "WARNING:  Could not open waypoint file '%s' for writing: %s\n",
+-                    waypointfile.c_str(), strerror(errno));
+-            waypoint = 0;
+-        }
+-    }
+-
+     // Create all the logs and title/number them appropriately
+     // We need to save this for after we toast the conf record
+     int logfile_matched = 0;
+@@ -1871,13 +1346,6 @@
+                 continue;
+         }
+-        if (gps_log == 1) {
+-            gpslogfile = conf->ExpandLogPath(conf->FetchOpt("logtemplate"), logname, "gps", run_num);
+-
+-            if (gpslogfile == "")
+-                continue;
+-        }
+-
+         // if we made it this far we're cool -- all the logfiles we're writing to matched
+         // this number
+         logfile_matched = 1;
+@@ -1906,9 +1374,6 @@
+     if (cisco_log)
+         fprintf(stderr, "Logging cisco product information to %s\n", ciscologfile.c_str());
+-    if (gps_log == 1)
+-        fprintf(stderr, "Logging gps coordinates to %s\n", gpslogfile.c_str());
+-
+     if (data_log)
+         fprintf(stderr, "Logging data to %s\n", dumplogfile.c_str());
+@@ -2055,7 +1520,6 @@
+         { "dump-type", required_argument, 0, 'd' },
+         { "max-packets", required_argument, 0, 'm' },
+         { "quiet", no_argument, 0, 'q' },
+-        { "gps", required_argument, 0, 'g' },
+         { "port", required_argument, 0, 'p' },
+         { "allowed-hosts", required_argument, 0, 'a' },
+         { "bind-address", required_argument, 0, 'b'},
+@@ -2136,18 +1600,6 @@
+                 Usage(argv[0]);
+             }
+             break;
+-        case 'g':
+-            // GPS
+-            if (strcmp(optarg, "off") == 0) {
+-                gps_enable = 0;
+-            }
+-            else if (sscanf(optarg, "%1023[^:]:%d", gpshost, &gpsport) < 2) {
+-                fprintf(stderr, "Invalid GPS host '%s' (host:port or off required)\n",
+-                       optarg);
+-                gps_enable = 1;
+-                Usage(argv[0]);
+-            }
+-            break;
+         case 'p':
+             // Port
+             if (sscanf(optarg, "%d", &tcpport) != 1) {
+@@ -2169,7 +1621,6 @@
+             break;
+         case 'q':
+             // Quiet
+-            sound = 0;
+             break;
+         case 'v':
+             // version
+@@ -2323,39 +1774,6 @@
+     // And we're done
+     fclose(pid_file);
+             
+-
+-    // Set up the GPS object to give to the children
+-    if (gpsport == -1 && gps_enable) {
+-        if (conf->FetchOpt("gps") == "true") {
+-            if (sscanf(conf->FetchOpt("gpshost").c_str(), "%1023[^:]:%d", gpshost, 
+-                       &gpsport) != 2) {
+-                fprintf(stderr, "Invalid GPS host in config (host:port required)\n");
+-                exit(1);
+-            }
+-
+-            gps_enable = 1;
+-        } else {
+-            gps_enable = 0;
+-            gps_log = 0;
+-        }
+-    }
+-
+-    if (gps_enable == 1) {
+-        gps = new GPSD(gpshost, gpsport);
+-
+-        // Lock GPS position
+-        if (conf->FetchOpt("gpsmodelock") == "true") {
+-            fprintf(stderr, "Enabling GPS position lock override (broken GPS unit "
+-                    "reports 0 always)\n");
+-            gps->SetOptions(GPSD_OPT_FORCEMODE);
+-        }
+-
+-    } else {
+-        gps_log = 0;
+-    }
+-
+-    // Register the gps and timetracker with the sourcetracker
+-    sourcetracker.AddGpstracker(gps);
+     sourcetracker.AddTimetracker(&timetracker);
+     // Handle errors here maybe in the future
+@@ -2522,13 +1940,6 @@
+         fprintf(stderr, "Dump file format: %s\n", dumpfile->FetchType());
+     }
+-    if (gps_enable && gps_log == 1) {
+-        if (gpsdump.OpenDump(gpslogfile.c_str(), xmllogfile.c_str()) < 0) {
+-            fprintf(stderr, "FATAL: GPS dump error: %s\n", gpsdump.FetchError());
+-            ErrorShutdown();
+-        }
+-    }
+-
+     // Open our files first to make sure we can, we'll unlink the empties later.
+     FILE *testfile = NULL;
+     if (net_log) {
+@@ -2600,14 +2011,13 @@
+     */
+     if (data_log || net_log || crypt_log) {
+-        snprintf(status, STATUS_MAX, "Logging%s%s%s%s%s%s%s",
++        snprintf(status, STATUS_MAX, "Logging%s%s%s%s%s%s",
+                  data_log ? " data" : "" ,
+                  net_log ? " networks" : "" ,
+                  csv_log ? " CSV" : "" ,
+                  xml_log ? " XML" : "" ,
+                  crypt_log ? " weak" : "",
+-                 cisco_log ? " cisco" : "",
+-                 gps_log == 1 ? " gps" : "");
++                 cisco_log ? " cisco" : "");
+         fprintf(stderr, "%s\n", status);
+     } else if (no_log) {
+         snprintf(status, STATUS_MAX, "Not logging any data.");
+@@ -2625,23 +2035,6 @@
+         }
+     }
+-    if (gps_enable) {
+-        // Open the GPS
+-        if (gps->OpenGPSD() < 0) {
+-            fprintf(stderr, "%s\n", gps->FetchError());
+-
+-            gps_enable = 0;
+-            gps_log = 0;
+-        } else {
+-            fprintf(stderr, "Opened GPS connection to %s port %d\n",
+-                    gpshost, gpsport);
+-
+-            gpsmode = gps->FetchMode();
+-
+-            last_gpsd_reconnect = time(0);
+-        }
+-    }
+-
+     fprintf(stderr, "Listening on port %d.\n", tcpport);
+     for (unsigned int ipvi = 0; ipvi < legal_ipblock_vec.size(); ipvi++) {
+         char *netaddr = strdup(inet_ntoa(legal_ipblock_vec[ipvi]->network));
+@@ -2682,8 +2075,6 @@
+                                              &Protocol_NETWORK, &ProtocolNetworkEnable);
+     client_ref = ui_server.RegisterProtocol("CLIENT", 0, CLIENT_fields_text,
+                                             &Protocol_CLIENT, &ProtocolClientEnable);
+-    gps_ref = ui_server.RegisterProtocol("GPS", 0, GPS_fields_text,
+-                                         &Protocol_GPS, NULL);
+     info_ref = ui_server.RegisterProtocol("INFO", 0, INFO_fields_text,
+                                           &Protocol_INFO, NULL);
+     remove_ref = ui_server.RegisterProtocol("REMOVE", 0, REMOVE_fields_text,
+@@ -2738,14 +2129,9 @@
+     // Write network info and tick the tracker once per second
+     timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &NetWriteEvent, NULL);
+     timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &TrackerTickEvent, NULL);
+-    // Update GPS coordinates and handle signal loss if defined
+-    timetracker.RegisterTimer(SERVER_TIMESLICES_SEC, NULL, 1, &GpsEvent, NULL);
+     // Sync the data files if requested
+     if (datainterval > 0 && no_log == 0)
+         timetracker.RegisterTimer(datainterval * SERVER_TIMESLICES_SEC, NULL, 1, &ExportSyncEvent, NULL);
+-    // Write waypoints if requested
+-    if (waypoint)
+-        timetracker.RegisterTimer(decay * SERVER_TIMESLICES_SEC, NULL, 1, &WaypointSyncEvent, NULL);
+     // Channel hop if requested
+     if (channel_hop) {
+         if (channel_dwell)
+@@ -2769,7 +2155,6 @@
+     snprintf(status, 1024, "%s", TIMESTAMP);
+     kdata.timestamp = status;
+-    time_t last_click = 0;
+     int num_networks = 0, num_packets = 0, num_noise = 0, num_dropped = 0;
+@@ -2918,54 +2303,13 @@
+                     }
+-                    if (gps_log == 1 && info.type != packet_noise && 
+-                        info.type != packet_unknown && info.type != packet_phy && 
+-                        info.corrupt == 0) {
+-                        if (gpsdump.DumpPacket(&info) < 0) {
+-                            snprintf(status, STATUS_MAX, "%s", gpsdump.FetchError());
+-                            if (!silent || NetWriteStatus(status) == 0)
+-                                fprintf(stderr, "%s\n", status);
+-                        }
+-                    }
+-
+                     // tracker.ProcessPacket(info);
+                     tracker.ProcessPacket(&packet, &info, &bssid_wep_map, 
+                                                                                 wep_identity);
+-                    if (tracker.FetchNumNetworks() > num_networks) {
+-                        if (sound == 1)
+-                            if (info.crypt_set && 
+-                                                              wav_map.find("new_wep") != wav_map.end())
+-                                sound = PlaySound("new_wep");
+-                            else
+-                                sound = PlaySound("new");
+-                        if (speech == 1) {
+-                            string text;
+-
+-                            if (info.crypt_set)
+-                                text = ExpandSpeechString(speech_sentence_encrypted, &info, 
+-                                                          speech_encoding);
+-                            else
+-                                text = ExpandSpeechString(speech_sentence_unencrypted, 
+-                                                          &info, speech_encoding);
+-
+-                            speech = SayText(MungeToShell(text).c_str());
+-                        }
+-                    }
+                     num_networks = tracker.FetchNumNetworks();
+                     if (tracker.FetchNumPackets() != num_packets) {
+-                        if (cur_time - last_click >= decay && sound == 1) {
+-                            if (tracker.FetchNumPackets() - num_packets >
+-                                tracker.FetchNumDropped() + localdropnum - num_dropped) {
+-                                sound = PlaySound("traffic");
+-                            } else {
+-                                sound = PlaySound("junktraffic");
+-                            }
+-
+-                            last_click = cur_time;
+-                        }
+-
+                         num_packets = tracker.FetchNumPackets();
+                         num_noise = tracker.FetchNumNoise();
+                         num_dropped = tracker.FetchNumDropped() + localdropnum;
+diff -urN kismet.dev/kismet_server.h kismet.dev2/kismet_server.h
+--- kismet.dev/kismet_server.h 2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/kismet_server.h        2005-08-23 01:59:25.653218728 +0200
+@@ -33,10 +33,6 @@
+ void handle_command(TcpServer *tcps, client_command *cc);
+ int NetWriteStatus(const char *in_status);
+ void NetWriteInfo();
+-int SayText(string in_text);
+-int PlaySound(string in_sound);
+-void SpeechHandler(int *fds, const char *player);
+-void SoundHandler(int *fds, const char *player, map<string, string> soundmap);
+ void ProtocolAlertEnable(int in_fd);
+ void ProtocolNetworkEnable(int in_fd);
+ void ProtocolClientEnable(int in_fd);
+diff -urN kismet.dev/packetracker.cc kismet.dev2/packetracker.cc
+--- kismet.dev/packetracker.cc 2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/packetracker.cc        2005-08-23 01:59:25.656218272 +0200
+@@ -2439,23 +2439,3 @@
+ }
+-// Write a gpsdrive compatable waypoint file
+-int Packetracker::WriteGpsdriveWaypt(FILE *in_file) {
+-    fseek(in_file, 0L, SEEK_SET);
+-    ftruncate(fileno(in_file), 0);
+-
+-    // Convert the map to a vector and sort it
+-    for (map<mac_addr, wireless_network *>::const_iterator i = bssid_map.begin();
+-         i != bssid_map.end(); ++i) {
+-        wireless_network *net = i->second;
+-
+-        float lat, lon;
+-        lat = (net->min_lat + net->max_lat) / 2;
+-        lon = (net->min_lon + net->max_lon) / 2;
+-        fprintf(in_file, "%s\t%f  %f\n", waypointformat == 1 ? net->ssid.c_str() : net->bssid.Mac2String().c_str(), lat, lon);
+-    }
+-
+-    fflush(in_file);
+-
+-    return 1;
+-}
+diff -urN kismet.dev/packetracker.h kismet.dev2/packetracker.h
+--- kismet.dev/packetracker.h  2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/packetracker.h 2005-08-23 01:59:25.656218272 +0200
+@@ -30,7 +30,6 @@
+ #include <string>
+ #include "util.h"
+-#include "gpsd.h"
+ #include "packet.h"
+ #include "tracktypes.h"
+ #include "manuf.h"
+@@ -85,8 +84,6 @@
+     int WriteXMLNetworks(string in_fname);
+     int WriteCisco(string in_fname);
+-    int WriteGpsdriveWaypt(FILE *in_file);
+-
+     void WriteSSIDMap(FILE *in_file);
+     void ReadSSIDMap(FILE *in_file);
+diff -urN kismet.dev/packetsourcetracker.cc kismet.dev2/packetsourcetracker.cc
+--- kismet.dev/packetsourcetracker.cc  2005-08-23 00:59:39.969982048 +0200
++++ kismet.dev2/packetsourcetracker.cc 2005-08-23 01:59:25.657218120 +0200
+@@ -24,7 +24,6 @@
+ Packetsourcetracker::Packetsourcetracker() {
+     next_packsource_id = 0;
+     next_meta_id = 0;
+-    gpsd = NULL;
+     timetracker = NULL;
+     chanchild_pid = 0;
+     sockpair[0] = sockpair[1] = 0;
+@@ -691,7 +690,6 @@
+         
+         // Register the trackers with it
+         meta->capsource->AddTimetracker(timetracker);
+-        meta->capsource->AddGpstracker(gpsd);
+        
+         // Open it
+         fprintf(stderr, "Source %d (%s): Opening %s source interface %s...\n",
+diff -urN kismet.dev/packetsourcetracker.h kismet.dev2/packetsourcetracker.h
+--- kismet.dev/packetsourcetracker.h   2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/packetsourcetracker.h  2005-08-23 01:59:25.658217968 +0200
+@@ -30,7 +30,6 @@
+ #include <string>
+ #include "timetracker.h"
+-#include "gpsd.h"
+ #include "packetsource.h"
+ // Sentinel for starting a new packet
+@@ -144,9 +143,6 @@
+     // Register a timer event handler for us to use
+     void AddTimetracker(Timetracker *in_tracker) { timetracker = in_tracker; }
+-    // Register the GPS server for us to use
+-    void AddGpstracker(GPSD *in_gpsd) { gpsd = in_gpsd; }
+-    
+     // Register a packet prototype source...  Card type string, root binding requirement,
+     // function to generate an instance of the source, and function to change channel 
+     // for this card type.  This fills out the prototype. Sources that don't hop 
+@@ -221,7 +217,6 @@
+         uint16_t channel;
+     } chanchild_changepacket;
+-    GPSD *gpsd;
+     Timetracker *timetracker;
+     
+     char errstr[1024];
+diff -urN kismet.dev/panelfront.cc kismet.dev2/panelfront.cc
+--- kismet.dev/panelfront.cc   2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/panelfront.cc  2005-08-23 01:59:25.659217816 +0200
+@@ -37,7 +37,6 @@
+     "  Key  Action",
+     "   e   List Kismet servers",
+     "   z   Toggle fullscreen zoom of network view",
+-    "   m   Toggle muting of sound and speech",
+     "   t   Tag (or untag) selected network",
+     "   g   Group tagged networks",
+     "   u   Ungroup current group",
+@@ -121,7 +120,6 @@
+     "Key Action",
+     " e  List Kismet servers",
+     " z  Toggle fullscreen net list",
+-    " m  Toggle muting",
+     " t  Tag (or untag) selected",
+     " g  Group tagged networks",
+     " u  Ungroup current group",
+@@ -237,19 +235,6 @@
+ };
+-char *KismetHelpGps[] = {
+-    "KISMET NETWORK FOLLOW",
+-    "This panel estimates the center of a network, the current",
+-    "direction of travel, and the direction of the network center",
+-    "and distance relative to the current direction of movement.",
+-    " Key   Action",
+-    "  s    Follow location of strongest packet",
+-    "  c    Follow location of estimated network center",
+-    "  q    Close popup",
+-    NULL
+-};
+-
+-
+ char *KismetHelpStats[] = {
+     "KISMET NETWORK STATISTICS",
+     "This panel displays overall statistics about the wireless",
+@@ -678,7 +663,6 @@
+     }
+     // Enable all the protocols we handle
+-    in_client->EnableProtocol("GPS");
+     in_client->EnableProtocol("INFO");
+     in_client->EnableProtocol("REMOVE");
+     in_client->EnableProtocol("NETWORK");
+@@ -1282,27 +1266,6 @@
+         if (con->client == NULL)
+             continue;
+-        // Update GPS
+-        float newlat, newlon, newalt, newspd, newheading;
+-        int newfix;
+-        con->client->FetchLoc(&newlat, &newlon, &newalt, &newspd, &newheading, &newfix);
+-
+-        if (GPSD::EarthDistance(newlat, newlon, last_lat, last_lon) > 10) {
+-            con->last_lat = con->lat;
+-            con->last_lon = con->lon;
+-            con->last_spd = con->spd;
+-            con->last_alt = con->alt;
+-            con->last_fix = con->fix;
+-            con->last_heading = con->heading;
+-        }
+-
+-        con->lat = newlat;
+-        con->lon = newlon;
+-        con->alt = newalt;
+-        con->spd = newspd;
+-        con->heading = newheading;
+-        con->fix = newfix;
+-
+         // Update quality
+         con->quality = con->client->FetchQuality();
+         con->power = con->client->FetchPower();
+diff -urN kismet.dev/panelfront.h kismet.dev2/panelfront.h
+--- kismet.dev/panelfront.h    2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/panelfront.h   2005-08-23 01:59:25.660217664 +0200
+@@ -65,7 +65,6 @@
+ #define SORT_SIZE 10
+ extern char *KismetHelpPower[];
+ extern char *KismetHelpRate[];
+-extern char *KismetHelpGps[];
+ extern char *KismetHelpStats[];
+ extern char *KismetHelpDump[];
+ extern char *KismetHelpPack[];
+@@ -269,7 +268,6 @@
+     int RatePrinter(void *in_window);
+     int StatsPrinter(void *in_window);
+     int PackPrinter(void *in_window);
+-    int GpsPrinter(void *in_window);
+     int AlertPrinter(void *in_window);
+     int MainClientPrinter(void *in_window);
+@@ -298,7 +296,6 @@
+     int PackInput(void *in_window, int in_chr);
+     // Help has a generic handler
+     int TextInput(void *in_window, int in_chr);
+-    int GpsInput(void *in_window, int in_chr);
+     int AlertInput(void *in_window, int in_chr);
+     int MainClientInput(void *in_window, int in_chr);
+diff -urN kismet.dev/panelfront_display.cc kismet.dev2/panelfront_display.cc
+--- kismet.dev/panelfront_display.cc   2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/panelfront_display.cc  2005-08-23 01:59:25.663217208 +0200
+@@ -727,7 +727,7 @@
+         mvwaddstr(netwin, netwin->_maxy, netwin->_maxx - 14, ptxt);
+     }
+-#ifdef HAVE_GPS
++#if 0
+     if (!(lat == 0 && lon == 0 && alt == 0 && spd == 0 && fix == 0)) {
+@@ -1496,51 +1496,6 @@
+         snprintf(output, print_width, "Networks: %d", (int) details_network->networks.size());
+         kwin->text.push_back(output);
+-        if (details_network->virtnet->gps_fixed != -1) {
+-            if ((details_network->virtnet->min_lat == 90) && (details_network->virtnet->min_lon == 180) &&
+-                (details_network->virtnet->max_lat == -90) && (details_network->virtnet->max_lon == -180)) {
+-                   snprintf(output, print_width, "Min Loc : N/A");
+-                   kwin->text.push_back(output);
+-                   snprintf(output, print_width, "Max Loc : N/A");
+-                   kwin->text.push_back(output);
+-                   snprintf(output, print_width, "Range   : N/A");
+-                   kwin->text.push_back(output);
+-            }
+-          else {
+-                snprintf(output, print_width, "Min Loc : Lat %f Lon %f Alt %f Spd %f",
+-                         details_network->virtnet->min_lat, details_network->virtnet->min_lon,
+-                         metric ? details_network->virtnet->min_alt / 3.3 : details_network->virtnet->min_alt,
+-                         metric ? details_network->virtnet->min_spd * 1.6093 : details_network->virtnet->min_spd);
+-                kwin->text.push_back(output);
+-                snprintf(output, print_width, "Max Loc : Lat %f Lon %f Alt %f Spd %f",
+-                         details_network->virtnet->max_lat, details_network->virtnet->max_lon,
+-                         metric ? details_network->virtnet->max_alt / 3.3 : details_network->virtnet->max_alt,
+-                         metric ? details_network->virtnet->max_spd * 1.6093 : details_network->virtnet->max_spd);
+-                kwin->text.push_back(output);
+-
+-                double diagdist = GPSD::EarthDistance(details_network->virtnet->min_lat,
+-                                                      details_network->virtnet->min_lon,
+-                                                      details_network->virtnet->max_lat,
+-                                                      details_network->virtnet->max_lon);
+-
+-                if (finite(diagdist)) {
+-                    if (metric) {
+-                        if (diagdist < 1000)
+-                            snprintf(output, print_width, "Range    : %.3f meters", diagdist);
+-                        else
+-                            snprintf(output, print_width, "Range   : %.3f kilometers", diagdist / 1000);
+-                    } else {
+-                        diagdist *= 3.3;
+-                        if (diagdist < 5280)
+-                            snprintf(output, print_width, "Range   : %.3f feet", diagdist);
+-                        else
+-                            snprintf(output, print_width, "Range   : %.3f miles", diagdist / 5280);
+-                    }
+-                    kwin->text.push_back(output);
+-                }
+-          }
+-        }
+-
+         if (details_network->virtnet->carrier_set & (1 << (int) carrier_80211b)) {
+             snprintf(output, print_width, "Carrier : IEEE 802.11b");
+             kwin->text.push_back(output);
+@@ -1853,49 +1808,6 @@
+                      dnet->ipdata.range_ip[2], dnet->ipdata.range_ip[3]);
+             kwin->text.push_back(output);
+         }
+-    
+-        if (dnet->gps_fixed != -1) {
+-            if ((dnet->min_lat == 90) && (dnet->min_lon == 180) &&
+-              (dnet->max_lat == -90) && (dnet->max_lon == -180)) {
+-                   snprintf(output, print_width, "Min Loc : N/A");
+-                   kwin->text.push_back(output);
+-                   snprintf(output, print_width, "Max Loc : N/A");
+-                   kwin->text.push_back(output);
+-                   snprintf(output, print_width, "Range   : N/A");
+-                   kwin->text.push_back(output);
+-          }
+-          else {
+-                snprintf(output, print_width, "Min Loc : Lat %f Lon %f Alt %f Spd %f",
+-                         dnet->min_lat, dnet->min_lon,
+-                         metric ? dnet->min_alt / 3.3 : dnet->min_alt,
+-                         metric ? dnet->min_spd * 1.6093 : dnet->min_spd);
+-                kwin->text.push_back(output);
+-                snprintf(output, print_width, "Max Loc : Lat %f Lon %f Alt %f Spd %f",
+-                         dnet->max_lat, dnet->max_lon,
+-                         metric ? dnet->max_alt / 3.3 : dnet->max_alt,
+-                         metric ? dnet->max_spd * 1.6093 : dnet->max_spd);
+-                kwin->text.push_back(output);
+-
+-                double diagdist = GPSD::EarthDistance(dnet->min_lat, dnet->min_lon,
+-                                                  dnet->max_lat, dnet->max_lon);
+-
+-                if (finite(diagdist)) {
+-                    if (metric) {
+-                        if (diagdist < 1000)
+-                            snprintf(output, print_width, "Range    : %f meters", diagdist);
+-                        else
+-                            snprintf(output, print_width, "Range   : %f kilometers", diagdist / 1000);
+-                    } else {
+-                        diagdist *= 3.3;
+-                        if (diagdist < 5280)
+-                            snprintf(output, print_width, "Range   : %f feet", diagdist);
+-                        else
+-                            snprintf(output, print_width, "Range   : %f miles", diagdist / 5280);
+-                    }
+-                    kwin->text.push_back(output);
+-                }
+-          }
+-        }
+     }
+     // Now we just use the text printer to handle the rest for us
+@@ -1903,184 +1815,6 @@
+     return TextPrinter(in_window);
+ }
+-int PanelFront::GpsPrinter(void *in_window) {
+-    kis_window *kwin = (kis_window *) in_window;
+-
+-    char output[1024];
+-    kwin->text.clear();
+-
+-      if (details_network == NULL) {
+-              kwin->text.push_back("The network or group being displayed");
+-              kwin->text.push_back("has been deleted.  Please select a ");
+-              kwin->text.push_back("different network.");
+-              return TextPrinter(in_window);
+-      }
+-
+-    wireless_network *dnet = details_network->virtnet;
+-
+-    int print_width = kwin->print_width;
+-    if (print_width > 1024)
+-        print_width = 1023;
+-
+-    if (print_width < 32) {
+-        kwin->text.push_back("Display not wide enough");
+-        return TextPrinter(in_window);
+-    }
+-
+-    if (dnet->aggregate_points == 0) {
+-        kwin->text.push_back("No GPS data.");
+-        return TextPrinter(in_window);
+-    }
+-
+-    float center_lat, center_lon;
+-
+-    // We hijack the "selected" field as a toggle
+-    if (kwin->selected == 1) {
+-        center_lat = dnet->best_lat;
+-        center_lon = dnet->best_lon;
+-    } else {
+-        center_lat = dnet->aggregate_lat / dnet->aggregate_points;
+-        center_lon = dnet->aggregate_lon / dnet->aggregate_points;
+-    }
+-
+-    // Get bearing to the center
+-    float center_angle = GPSD::CalcHeading(center_lat, center_lon, lat, lon);
+-
+-    float difference_angle = heading - center_angle;
+-    if (difference_angle < 0)
+-        difference_angle += 360;
+-
+-    double diagdist = GPSD::EarthDistance(lat, lon, center_lat, center_lon);
+-
+-    // Now we know everything - where we are, where we are headed, where we SHOULD be headed
+-    // to get to the supposed center of the network, how far it is, and the orientation on our
+-    // compass to get to it.  Time to start drawing our output.
+-
+-    char compass[5][10];
+-    memset(compass, 0, sizeof(char) * 5 * 10);
+-
+-    // |  41.12345x-74.12345     .-|-/    |
+-    // | Bearing:               /  |/ \   |
+-    // |  123.23 degrees       |   O   |  |
+-    // |                        \   \ /   |
+-    // | Estimated center:       '---\    |
+-
+-
+-    // Find the orientation on our compass:
+-    if (difference_angle > 330 || difference_angle <= 22) {
+-        snprintf(compass[0], 10, "  .-|-.  ");
+-        snprintf(compass[1], 10, " /  |  \\ ");
+-        snprintf(compass[2], 10, "|   O   |");
+-        snprintf(compass[3], 10, " \\     / ");
+-        snprintf(compass[4], 10, "  '---'  ");
+-    } else if (difference_angle > 22 && difference_angle <= 66) {
+-        snprintf(compass[0], 10, "  .---/  ");
+-        snprintf(compass[1], 10, " /   / \\ ");
+-        snprintf(compass[2], 10, "|   O   |");
+-        snprintf(compass[3], 10, " \\     / ");
+-        snprintf(compass[4], 10, "  '---'  ");
+-    } else if (difference_angle > 66 && difference_angle <= 110) {
+-        snprintf(compass[0], 10, "  .---.  ");
+-        snprintf(compass[1], 10, " /     \\ ");
+-        snprintf(compass[2], 10, "|   O----");
+-        snprintf(compass[3], 10, " \\     / ");
+-        snprintf(compass[4], 10, "  '---'  ");
+-    } else if (difference_angle > 110 && difference_angle <= 154) {
+-        snprintf(compass[0], 10, "  .---.  ");
+-        snprintf(compass[1], 10, " /     \\ ");
+-        snprintf(compass[2], 10, "|   O   |");
+-        snprintf(compass[3], 10, " \\   \\ / ");
+-        snprintf(compass[4], 10, "  '---\\  ");
+-    } else if (difference_angle > 154 && difference_angle <= 198) {
+-        snprintf(compass[0], 10, "  .---.  ");
+-        snprintf(compass[1], 10, " /     \\ ");
+-        snprintf(compass[2], 10, "|   O   |");
+-        snprintf(compass[3], 10, " \\  |  / ");
+-        snprintf(compass[4], 10, "  '-|-'  ");
+-    } else if (difference_angle > 198 && difference_angle <= 242) {
+-        snprintf(compass[0], 10, "  .---.  ");
+-        snprintf(compass[1], 10, " /     \\ ");
+-        snprintf(compass[2], 10, "|   O   |");
+-        snprintf(compass[3], 10, " \\ /   / ");
+-        snprintf(compass[4], 10, "  /---'  ");
+-    } else if (difference_angle > 242 && difference_angle <= 286) {
+-        snprintf(compass[0], 10, "  .---.  ");
+-        snprintf(compass[1], 10, " /     \\ ");
+-        snprintf(compass[2], 10, "----O   |");
+-        snprintf(compass[3], 10, " \\     / ");
+-        snprintf(compass[4], 10, "  '---'  ");
+-    } else if (difference_angle > 286 && difference_angle <= 330) {
+-        snprintf(compass[0], 10, "  \\---.  ");
+-        snprintf(compass[1], 10, " / \\   \\ ");
+-        snprintf(compass[2], 10, "|   O   |");
+-        snprintf(compass[3], 10, " \\     / ");
+-        snprintf(compass[4], 10, "  '---'  ");
+-    } else {
+-        snprintf(compass[0], 10, "%f\n", difference_angle);
+-    }
+-
+-
+-    // - Network GPS ---------------------|
+-    // | Current:                         |
+-    // |  41.12345x-74.12345     .-|-.    |
+-    // | Bearing:               /  |  \   |
+-    // |  123.23 degrees       |   O   |  |
+-    // |                        \   \ /   |
+-    // | Estimated center:       '---\    |
+-    // | -73.12345x43.12345               |
+-    // |                        120 feet  |
+-    // ------------------------------------
+-    char textfrag[23];
+-
+-    snprintf(output, print_width, "Current:");
+-    kwin->text.push_back(output);
+-
+-    snprintf(textfrag, 23, "%.3f x %.3f", lat, lon);
+-    snprintf(output, print_width, "%-22s%s", textfrag, compass[0]);
+-    kwin->text.push_back(output);
+-
+-    snprintf(textfrag, 23, " Bearing:");
+-    snprintf(output, print_width, "%-22s%s", textfrag, compass[1]);
+-    kwin->text.push_back(output);
+-
+-    snprintf(textfrag, 23, " %.2f*", heading);
+-    snprintf(output, print_width, "%-22s%s", textfrag, compass[2]);
+-    kwin->text.push_back(output);
+-
+-    snprintf(textfrag, 23, " ");
+-    snprintf(output, print_width, "%-22s%s", textfrag, compass[3]);
+-    kwin->text.push_back(output);
+-
+-    if (kwin->selected == 1)
+-        snprintf(textfrag, 23, "Strongest signal:");
+-    else
+-        snprintf(textfrag, 23, "Estimated Center:");
+-    snprintf(output, print_width, "%-22s%s", textfrag, compass[4]);
+-    kwin->text.push_back(output);
+-
+-    snprintf(textfrag, 23, "%.3f x %.3f", center_lat, center_lon);
+-    snprintf(output, print_width, "%-22s%.2f*", textfrag, difference_angle);
+-    kwin->text.push_back(output);
+-
+-    if (metric) {
+-        if (diagdist < 1000)
+-            snprintf(textfrag, 23, "%.2f m", diagdist);
+-        else
+-            snprintf(textfrag, 23, "%.2f km", diagdist / 1000);
+-    } else {
+-        diagdist *= 3.3;
+-        if (diagdist < 5280)
+-            snprintf(textfrag, 23, "%.2f ft", diagdist);
+-        else
+-            snprintf(textfrag, 23, "%.2f mi", diagdist / 5280);
+-    }
+-
+-    snprintf(output, print_width, "%-22s%s", "", textfrag);
+-    kwin->text.push_back(output);
+-
+-    return TextPrinter(in_window);
+-}
+-
+ int PanelFront::PackPrinter(void *in_window) {
+     kis_window *kwin = (kis_window *) in_window;
+@@ -3049,53 +2783,6 @@
+              details_client->ipdata.ip[2], details_client->ipdata.ip[3]);
+     kwin->text.push_back(output);
+-    if (details_client->gps_fixed != -1) {
+-        kwin->text.push_back("");
+-
+-        if ((details_client->min_lat == 90) && (details_client->min_lon == 180) &&
+-            (details_client->max_lat == -90) && (details_client->max_lon == -180)) {
+-               snprintf(output, print_width, "Min Loc : N/A");
+-               kwin->text.push_back(output);
+-               snprintf(output, print_width, "Max Loc : N/A");
+-               kwin->text.push_back(output);
+-               snprintf(output, print_width, "Range   : N/A");
+-               kwin->text.push_back(output);
+-        }
+-      else {
+-            snprintf(output, print_width, "Min Loc : Lat %f Lon %f Alt %f Spd %f",
+-                     details_client->min_lat, details_client->min_lon,
+-                     metric ? details_client->min_alt / 3.3 : details_client->min_alt,
+-                     metric ? details_client->min_spd * 1.6093 : details_client->min_spd);
+-            kwin->text.push_back(output);
+-            snprintf(output, print_width, "Max Loc : Lat %f Lon %f Alt %f Spd %f",
+-                     details_client->max_lat, details_client->max_lon,
+-                     metric ? details_client->max_alt / 3.3 : details_client->max_alt,
+-                     metric ? details_client->max_spd * 1.6093 : details_client->max_spd);
+-            kwin->text.push_back(output);
+-
+-            double diagdist = GPSD::EarthDistance(details_client->min_lat,
+-                                                  details_client->min_lon,
+-                                                  details_client->max_lat,
+-                                                  details_client->max_lon);
+-
+-            if (finite(diagdist)) {
+-                if (metric) {
+-                    if (diagdist < 1000)
+-                        snprintf(output, print_width, "Range    : %f meters", diagdist);
+-                    else
+-                        snprintf(output, print_width, "Range    : %f kilometers", diagdist / 1000);
+-                } else {
+-                    diagdist *= 3.3;
+-                    if (diagdist < 5280)
+-                        snprintf(output, print_width, "Range   : %f feet", diagdist);
+-                    else
+-                        snprintf(output, print_width, "Range   : %f miles", diagdist / 5280);
+-                }
+-                kwin->text.push_back(output);
+-            }
+-        }
+-        kwin->text.push_back("");
+-    }
+     snprintf(output, print_width, "Packets :");
+     kwin->text.push_back(output);
+diff -urN kismet.dev/panelfront_input.cc kismet.dev2/panelfront_input.cc
+--- kismet.dev/panelfront_input.cc     2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/panelfront_input.cc    2005-08-23 01:59:25.665216904 +0200
+@@ -300,16 +300,9 @@
+         break;
+     case 'f':
+     case 'F':
+-        if (sortby != sort_auto && last_displayed.size() > 0) {
+-            details_network = last_displayed[kwin->selected];
+-            SpawnWindow("Network Location", &PanelFront::GpsPrinter, &PanelFront::GpsInput, 8, 34);
+-        } else {
+-            WriteStatus("Cannot view network GPS info in autofit sort mode.  Sort by a different method.");
+-        }
+         break;
+     case 'm':
+     case 'M':
+-        MuteToggle();
+         break;
+     case 'e':
+     case 'E':
+@@ -447,7 +440,6 @@
+     switch(in_chr) {
+     case 'm':
+     case 'M':
+-        MuteToggle();
+         break;
+     case 'p':
+     case 'P':
+@@ -546,33 +538,6 @@
+     return 1;
+ }
+-int PanelFront::GpsInput(void *in_window, int in_chr) {
+-    kis_window *kwin = (kis_window *) in_window;
+-
+-    switch (in_chr) {
+-    case 's':
+-    case 'S':
+-        kwin->selected = 1;
+-        break;
+-    case 'c':
+-    case 'C':
+-        kwin->selected = 0;
+-        break;
+-    case 'h':
+-    case 'H':
+-        SpawnHelp(KismetHelpGps);
+-        break;
+-    case 'x':
+-    case 'X':
+-    case 'q':
+-    case 'Q':
+-        return 0;
+-        break;
+-    }
+-
+-    return 1;
+-}
+-
+ int PanelFront::RateInput(void *in_window, int in_chr) {
+     switch (in_chr) {
+     case 'h':
+@@ -645,24 +610,6 @@
+     return 1;
+ }
+-void PanelFront::MuteToggle() {
+-    if (muted) {
+-        speech = old_speech;
+-        sound = old_sound;
+-        muted = 0;
+-        WriteStatus("Restoring sound");
+-    } else if (sound != 0 || speech != 0) {
+-        old_speech = speech;
+-        old_sound = sound;
+-        sound = 0;
+-        speech = 0;
+-        muted = 1;
+-        WriteStatus("Muting sound");
+-    } else if (sound == 0 && speech == 0) {
+-        WriteStatus("Sound not enabled.");
+-    }
+-}
+-
+ int PanelFront::AlertInput(void *in_window, int in_chr) {
+     kis_window *kwin = (kis_window *) in_window;
+diff -urN kismet.dev/pcapsource.cc kismet.dev2/pcapsource.cc
+--- kismet.dev/pcapsource.cc   2005-08-23 01:03:45.652632608 +0200
++++ kismet.dev2/pcapsource.cc  2005-08-23 01:59:25.667216600 +0200
+@@ -343,11 +343,6 @@
+     packet->moddata = moddata;
+     packet->modified = 0;
+-    if (gpsd != NULL) {
+-        gpsd->FetchLoc(&packet->gps_lat, &packet->gps_lon, &packet->gps_alt,
+-                       &packet->gps_spd, &packet->gps_heading, &packet->gps_fix);
+-    }
+-
+     if (datalink_type == DLT_PRISM_HEADER) {
+         ret = Prism2KisPack(packet, data, moddata);
+     } else if (datalink_type == KDLT_BSD802_11) {
+@@ -1146,133 +1141,6 @@
+ // Monitor commands
+ #ifdef HAVE_LINUX_WIRELESS
+-// Cisco uses its own config file in /proc to control modes
+-int monitor_cisco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    FILE *cisco_config;
+-    char cisco_path[128];
+-
+-    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
+-    (*in_if) = ifparm;
+-
+-    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    if (Iwconfig_Get_SSID(in_dev, in_err, ifparm->essid) < 0)
+-        return -1;
+-
+-    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
+-        return -1;
+-
+-    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
+-        return -1;
+-
+-    if (Ifconfig_Delta_Flags(in_dev, in_err, IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
+-        return -1;
+-
+-    // Try the iwpriv
+-    if (Iwconfig_Set_IntPriv(in_dev, "setRFMonitor", 1, 0, in_err) >= 0) {
+-        return 0;
+-    }
+-
+-    // Zero the ssid - nonfatal
+-    Iwconfig_Set_SSID(in_dev, in_err, NULL);
+-   
+-    // Build the proc control path
+-    snprintf(cisco_path, 128, "/proc/driver/aironet/%s/Config", in_dev);
+-
+-    if ((cisco_config = fopen(cisco_path, "w")) == NULL) {
+-        snprintf(in_err, STATUS_MAX, "Unable to open cisco control file '%s' %d:%s",
+-                 cisco_path, errno, strerror(errno));
+-        return -1;
+-    }
+-
+-    fprintf(cisco_config, "Mode: r\n");
+-    fprintf(cisco_config, "Mode: y\n");
+-    fprintf(cisco_config, "XmitPower: 1\n");
+-
+-    fclose(cisco_config);
+-
+-    // Channel can't be set on cisco with these drivers.
+-
+-    return 0;
+-}
+-
+-int unmonitor_cisco(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
+-    int ret = -1;
+-
+-    // Try the iwpriv
+-    if (Iwconfig_Set_IntPriv(in_dev, "setRFMonitor", 0, 0, in_err) >= 0) {
+-        // If we're the new drivers, unmonitor
+-        if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
+-            return -1;
+-        }
+-
+-        // Reset the SSID since monitor mode nukes it
+-        if (Iwconfig_Set_SSID(in_dev, in_err, ifparm->essid) < 0)
+-            return -1;
+-
+-        if (ifparm->channel > 0) {
+-            if (Iwconfig_Set_Channel(in_dev, ifparm->channel, in_err) < 0)
+-                return -1;
+-        }
+-
+-        ret = 1;
+-    }
+-
+-    free(ifparm);
+-
+-    return ret;
+-}
+-
+-// Cisco uses its own config file in /proc to control modes
+-//
+-// I was doing this with ioctls but that seems to cause lockups while
+-// this method doesn't.  I don't think I like these drivers.
+-int monitor_cisco_wifix(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    FILE *cisco_config;
+-    char cisco_path[128];
+-    vector<string> devbits = StrTokenize(in_dev, ":");
+-
+-    if (devbits.size() < 2) {
+-        snprintf(in_err, STATUS_MAX, "Invalid device pair '%s'.  Proper device "
+-                               "for cisco_wifix is eth?:wifi?.", in_dev);
+-        return -1;
+-    }
+-
+-    // Bring the device up, zero its ip, and set promisc
+-    if (Ifconfig_Delta_Flags(devbits[0].c_str(), in_err, 
+-                             IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
+-        return -1;
+-    if (Ifconfig_Delta_Flags(devbits[1].c_str(), in_err, 
+-                             IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
+-        return -1;
+-
+-    // Zero the ssid, nonfatally
+-    Iwconfig_Set_SSID(devbits[0].c_str(), in_err, NULL);
+-    Iwconfig_Set_SSID(devbits[1].c_str(), in_err, NULL);
+-    
+-    // Build the proc control path
+-    snprintf(cisco_path, 128, "/proc/driver/aironet/%s/Config", devbits[0].c_str());
+-
+-    if ((cisco_config = fopen(cisco_path, "w")) == NULL) {
+-        snprintf(in_err, STATUS_MAX, "Unable to open cisco control file '%s' %d:%s",
+-                 cisco_path, errno, strerror(errno));
+-        return -1;
+-    }
+-
+-    fprintf(cisco_config, "Mode: r\n");
+-    fprintf(cisco_config, "Mode: y\n");
+-    fprintf(cisco_config, "XmitPower: 1\n");
+-
+-    fclose(cisco_config);
+-
+-    // Channel can't be set on cisco with these drivers.
+-
+-    return 0;
+-}
+-
+ // Hostap uses iwpriv and iwcontrol settings to control monitor mode
+ int monitor_hostap(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+     int ret;
+@@ -1421,134 +1289,6 @@
+     return 1;
+ }
+-
+-// Acx100 uses the packhdr iwpriv control to set link state, rest is normal
+-int monitor_acx100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    int ret;
+-
+-    // Allocate a tracking record for the interface settings and remember our
+-    // setup
+-    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
+-    (*in_if) = ifparm;
+-
+-    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    if (Iwconfig_Get_SSID(in_dev, in_err, ifparm->essid) < 0)
+-        return -1;
+-
+-    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
+-        return -1;
+-
+-    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
+-        return -1;
+-
+-    // it looks like an orinoco now, apparently
+-    if ((ret = Iwconfig_Set_IntPriv(in_dev, "monitor", 1, initch, in_err)) < 0) {
+-        if (ret == -2)
+-            snprintf(in_err, 1024, "Could not find 'monitor' private ioctl "
+-                     "Make sure you have the latest ACX100 development release.");
+-        return -1;
+-    }
+-
+-    if (chancontrol_wext(in_dev, initch, in_err, NULL) < 0)
+-        return -1;
+-
+-    return 0;
+-}
+-
+-int unmonitor_acx100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    // Restore the IP settings
+-    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
+-
+-    if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    Iwconfig_Set_IntPriv(in_dev, "monitor", 0, ifparm->channel, in_err);
+-    Iwconfig_Set_Mode(in_dev, in_err, ifparm->mode);
+-
+-    if (Iwconfig_Set_SSID(in_dev, in_err, ifparm->essid) < 0)
+-        return -1;
+-    
+-    free(ifparm);
+-
+-    return 1;
+-}
+-
+-int monitor_admtek(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    // Allocate a tracking record for the interface settings and remember our
+-    // setup
+-    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
+-    (*in_if) = ifparm;
+-
+-    // Try to figure out the name so we know if we have fcs bytes or not
+-    char iwname[IFNAMSIZ+1];
+-    if (Iwconfig_Get_Name(in_dev, in_err, iwname) < 0)
+-        return -1;
+-
+-    if (strncmp(iwname, "IEEE 802.11b", IFNAMSIZ) == 0) {
+-        // Looks like the GPL driver, we need to adjust the fcsbytes
+-        PcapSource *psrc = (PcapSource *) in_ext;
+-        psrc->fcsbytes = 4;
+-    }
+-
+-    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    if ((ifparm->flags & IFF_UP)) {
+-        if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
+-            return -1;
+-
+-        if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
+-            return -1;
+-
+-        if (Iwconfig_Get_SSID(in_dev, in_err, ifparm->essid) < 0)
+-            return -1;
+-    
+-    } else {
+-        ifparm->channel = -1;
+-        ifparm->mode = -1;
+-    }
+-
+-    int ret = monitor_wext(in_dev, initch, in_err, in_if, in_ext);
+-
+-    if (ret < 0 && ret != -2)
+-        return ret;
+-
+-    if (Iwconfig_Set_SSID(in_dev, in_err, "") < 0)
+-        return -1;
+-    
+-    return 0;
+-}
+-
+-int unmonitor_admtek(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
+-
+-    if (unmonitor_wext(in_dev, initch, in_err, in_if, in_ext))
+-        return -1;
+-
+-    if (Iwconfig_Set_SSID(in_dev, in_err, ifparm->essid) < 0)
+-        return -1;
+-   
+-    return 1;
+-}
+-// vtar5k iwpriv control to set link state, rest is normal
+-int monitor_vtar5k(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    // Set the prism iwpriv control to 1
+-    if (Iwconfig_Set_IntPriv(in_dev, "prism", 1, 0, in_err) < 0) {
+-        return -1;
+-    }
+-    
+-    // The rest is standard wireless extensions
+-    if (monitor_wext(in_dev, initch, in_err, in_if, in_ext) < 0)
+-        return -1;
+-
+-    return 0;
+-}
+-
+ // Madwifi stuff uses iwpriv mode
+ int monitor_madwifi_a(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+     // Allocate a tracking record for the interface settings and remember our
+@@ -1726,89 +1466,6 @@
+     return unmonitor_wext(in_dev, initch, in_err, in_if, in_ext);
+ }
+-
+-int monitor_ipw2100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    // Allocate a tracking record for the interface settings and remember our
+-    // setup
+-    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
+-    (*in_if) = ifparm;
+-
+-    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
+-        return -1;
+-
+-    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
+-        return -1;
+-
+-    // Call the normal monitor mode
+-    return (monitor_wext(in_dev, initch, in_err, in_if, in_ext));
+-}
+-
+-int unmonitor_ipw2100(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    // Restore initial monitor header
+-    // linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
+-
+-    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
+-
+-    if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    if (Iwconfig_Set_Mode(in_dev, in_err, ifparm->mode) < 0)
+-        return -1;
+-
+-    free(ifparm);
+-
+-    return 1;
+-}
+-
+-int monitor_ipw2200(const char *in_dev, int initch, char *in_err, 
+-                                      void **in_if, void *in_ext) {
+-    // Allocate a tracking record for the interface settings and remember our
+-    // setup
+-    linux_ifparm *ifparm = (linux_ifparm *) malloc(sizeof(linux_ifparm));
+-    (*in_if) = ifparm;
+-
+-    if (Ifconfig_Get_Flags(in_dev, in_err, &ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    if ((ifparm->channel = Iwconfig_Get_Channel(in_dev, in_err)) < 0)
+-        return -1;
+-
+-    if (Iwconfig_Get_Mode(in_dev, in_err, &ifparm->mode) < 0)
+-        return -1;
+-
+-    // Call the normal monitor mode
+-    return (monitor_wext(in_dev, initch, in_err, in_if, in_ext));
+-}
+-
+-int unmonitor_ipw2200(const char *in_dev, int initch, char *in_err, 
+-                                        void **in_if, void *in_ext) {
+-    // Restore initial monitor header
+-    // linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
+-
+-    linux_ifparm *ifparm = (linux_ifparm *) (*in_if);
+-
+-    if (Ifconfig_Set_Flags(in_dev, in_err, ifparm->flags) < 0) {
+-        return -1;
+-    }
+-
+-    if (Iwconfig_Set_Mode(in_dev, in_err, ifparm->mode) < 0)
+-        return -1;
+-
+-      // James says this wants to be set to channel 0 for proper scanning operation
+-      if (Iwconfig_Set_Channel(in_dev, 0, in_err) < 0)
+-              return -1;
+-
+-    free(ifparm);
+-
+-    return 1;
+-}
+-
+ // "standard" wireless extension monitor mode
+ int monitor_wext(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+     int mode;
+@@ -1870,108 +1527,6 @@
+ #endif
+ #ifdef SYS_LINUX
+-// wlan-ng modern standard
+-int monitor_wlanng(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    // I really didn't want to do this...
+-    char cmdline[2048];
+-
+-    // Sanitize the device just to be safe.  The ifconfig should fail if
+-    // the device is invalid, but why take risks
+-    for (unsigned int x = 0; x < strlen(in_dev); x++) {
+-        if (!isalnum(in_dev[x])) {
+-            snprintf(in_err, STATUS_MAX, "Invalid device '%s'", in_dev);
+-            return -1;
+-        }
+-    }
+-    
+-    if (Ifconfig_Delta_Flags(in_dev, in_err, IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
+-        return -1;
+-
+-    // Enable the interface
+-    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_ifstate ifstate=enable >/dev/null 2>/dev/null", in_dev);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    // Turn off WEP
+-    snprintf(cmdline, 2048, "wlanctl-ng %s dot11req_mibset "
+-             "mibattribute=dot11PrivacyInvoked=false >/dev/null 2>/dev/null", in_dev);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    // Don't exclude packets
+-    snprintf(cmdline, 2048, "wlanctl-ng %s dot11req_mibset "
+-             "mibattribute=dot11ExcludeUnencrypted=false >/dev/null 2>/dev/null", in_dev);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    // Turn on rfmon on the initial channel
+-    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_wlansniff channel=%d "
+-             "enable=true prismheader=true >/dev/null 2>/dev/null", in_dev, initch);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-    
+-    return 0;
+-}
+-
+-// wlan-ng avs
+-int monitor_wlanng_avs(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext) {
+-    // I really didn't want to do this...
+-    char cmdline[2048];
+-
+-    // Sanitize the device just to be safe.  The ifconfig should fail if
+-    // the device is invalid, but why take risks
+-    for (unsigned int x = 0; x < strlen(in_dev); x++) {
+-        if (!isalnum(in_dev[x])) {
+-            snprintf(in_err, STATUS_MAX, "Invalid device '%s'", in_dev);
+-            return -1;
+-        }
+-    }
+-
+-    if (Ifconfig_Delta_Flags(in_dev, in_err, IFF_UP | IFF_RUNNING | IFF_PROMISC) < 0)
+-        return -1;
+-
+-    // Enable the interface
+-    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_ifstate ifstate=enable >/dev/null 2>/dev/null", in_dev);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    // Turn off WEP
+-    snprintf(cmdline, 2048, "wlanctl-ng %s dot11req_mibset "
+-             "mibattribute=dot11PrivacyInvoked=false >/dev/null 2>/dev/null", in_dev);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    // Don't exclude packets
+-    snprintf(cmdline, 2048, "wlanctl-ng %s dot11req_mibset "
+-             "mibattribute=dot11ExcludeUnencrypted=false >/dev/null 2>/dev/null", in_dev);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    // Turn on rfmon on the initial channel
+-    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_wlansniff channel=%d prismheader=false "
+-             "wlanheader=true stripfcs=false keepwepflags=false enable=true >/dev/null 2>/dev/null", in_dev, initch);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-    
+-    return 0;
+-}
+-
+ int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, 
+                                  void *in_ext) {
+     char cmdline[2048];
+@@ -1981,7 +1536,7 @@
+                       snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 1'. "
+                                        "Some custom firmware images require you to specify the origial "
+                                        "device and a new dynamic device and use the iwconfig controls. "
+-                                       "see the README for how to configure your capture source.");
++                                       "see the README for how to configure your capture source.", in_dev);
+                       return -1;
+               }
+@@ -1998,7 +1553,7 @@
+                       snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 0'. "
+                                        "Some custom firmware images require you to specify the origial "
+                                        "device and a new dynamic device and use the iwconfig controls. "
+-                                       "see the README for how to configure your capture source.");
++                                       "see the README for how to configure your capture source.", in_dev);
+                       return -1;
+               }
+@@ -2244,75 +1799,6 @@
+     return 0;
+ }
+-int chancontrol_ipw2100(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
+-    // Introduce a slight delay to let the driver settle, a la orinoco.  I don't
+-    // like doing this at all since it introduces hiccups into the channel control
+-    // process, but....
+-
+-    int ret = 0;
+-
+-    ret = chancontrol_wext(in_dev, in_ch, in_err, in_ext);
+-    usleep(5000);
+-
+-    return ret;
+-}
+-
+-int chancontrol_ipw2200(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
+-      // Lets see if this really needs the channel change delay like the 2100 did
+-    int ret = 0;
+-
+-    ret = chancontrol_wext(in_dev, in_ch, in_err, in_ext);
+-      // Drop a tiny sleep in here to let the channel set settle, otherwise we
+-      // run the risk of the card freaking out
+-      usleep(7000);
+-
+-    return ret;
+-}
+-
+-#endif
+-
+-#ifdef SYS_LINUX
+-int chancontrol_wlanng(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
+-    // I really didn't want to do this...
+-    char cmdline[2048];
+-
+-    // Turn on rfmon on the initial channel
+-    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_wlansniff channel=%d enable=true "
+-             "prismheader=true >/dev/null 2>&1", in_dev, in_ch);
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    if (in_ext != NULL) {
+-        PcapSourceWlanng *src = (PcapSourceWlanng *) in_ext;
+-        src->last_channel = in_ch;
+-    }
+-    
+-    return 0;
+-}
+-
+-int chancontrol_wlanng_avs(const char *in_dev, int in_ch, char *in_err, void *in_ext) {
+-    // I really didn't want to do this...
+-    char cmdline[2048];
+-
+-    // Turn on rfmon on the initial channel
+-    snprintf(cmdline, 2048, "wlanctl-ng %s lnxreq_wlansniff channel=%d "
+-             "prismheader=false wlanheader=true stripfcs=false keepwepflags=false "
+-             "enable=true >/dev/null 2>&1", in_dev, in_ch);
+-
+-    if (RunSysCmd(cmdline) < 0) {
+-        snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
+-        return -1;
+-    }
+-
+-    if (in_ext != NULL) {
+-        PcapSourceWlanng *src = (PcapSourceWlanng *) in_ext;
+-        src->last_channel = in_ch;
+-    }
+-    
+-    return 0;
+-}
+ #endif
+ #ifdef SYS_OPENBSD
+diff -urN kismet.dev/tcpstreamer.cc kismet.dev2/tcpstreamer.cc
+--- kismet.dev/tcpstreamer.cc  2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/tcpstreamer.cc 2005-08-23 01:59:25.668216448 +0200
+@@ -30,8 +30,6 @@
+     serv_fd = 0;
+     max_fd = 0;
+-
+-      gpsd = NULL;
+ }
+ TcpStreamer::~TcpStreamer()
+@@ -287,10 +285,6 @@
+     hdr.frame_len = (uint32_t) htonl(sizeof(struct stream_version_packet));
+     vpkt.drone_version = (uint16_t) htons(STREAM_DRONE_VERSION);
+-      if (gpsd != NULL)
+-              vpkt.gps_enabled = 1;
+-      else
+-              vpkt.gps_enabled = 0;
+     if (!FD_ISSET(in_fd, &client_fds))
+         return -1;
+diff -urN kismet.dev/tcpstreamer.h kismet.dev2/tcpstreamer.h
+--- kismet.dev/tcpstreamer.h   2005-08-16 03:22:51.000000000 +0200
++++ kismet.dev2/tcpstreamer.h  2005-08-23 01:59:25.669216296 +0200
+@@ -42,7 +42,6 @@
+ #include "ringbuf.h"
+ #include "packet.h"
+ #include "packetstream.h"
+-#include "gpsd.h"
+ // Global in kismet_drone.cc
+ extern int silent;
+@@ -76,9 +75,6 @@
+     int FetchDescriptor() { return serv_fd; }
+-    // Register the GPS server for us to use
+-    void AddGpstracker(GPSD *in_gpsd) { gpsd = in_gpsd; }
+-
+     void Kill(int in_fd);
+     int Poll(fd_set& in_rset, fd_set& in_wset);
+@@ -124,8 +120,6 @@
+     fd_set client_fds;
+     unsigned int max_fd;
+-
+-      GPSD *gpsd;
+ };
+ #endif
diff --git a/openwrt/package/kismet/patches/120-wrt54g_source.patch b/openwrt/package/kismet/patches/120-wrt54g_source.patch
deleted file mode 100644 (file)
index 2a0eac2..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-diff -urN kismet.old/kis_packsources.cc kismet.dev/kis_packsources.cc
---- kismet.old/kis_packsources.cc      2005-08-15 00:15:11.107594000 +0200
-+++ kismet.dev/kis_packsources.cc      2005-08-15 01:56:36.467769104 +0200
-@@ -215,7 +215,7 @@
- #endif
-     sourcetracker->RegisterPacketsource("wrt54g", 1, "na", 0,
-                                         pcapsource_wrt54g_registrant,
--                                        monitor_wrt54g, NULL, NULL, 0);
-+                                        monitor_wrt54g, unmonitor_wrt54g, chancontrol_wext, 0);
- #else
-     REG_EMPTY_CARD(sourcetracker, "wlanng");
-     REG_EMPTY_CARD(sourcetracker, "wlanng_avs");
-diff -urN kismet.old/packetsourcetracker.cc kismet.dev/packetsourcetracker.cc
---- kismet.old/packetsourcetracker.cc  2005-08-15 00:33:14.628874000 +0200
-+++ kismet.dev/packetsourcetracker.cc  2005-08-15 01:20:41.284203096 +0200
-@@ -984,6 +984,7 @@
-                     (meta_packsources[chanpak.meta_num]->device.c_str(), 
-                      chanpak.channel, errstr, 
-                      (void *) (meta_packsources[chanpak.meta_num]->capsource)) < 0) {
-+#if 0
-                                       meta_packsources[chanpak.meta_num]->consec_errors++;
-@@ -1005,6 +1006,7 @@
-                                                                                                                                        CHANFLAG_FATAL));
-                                               continue;
-                                       }
-+#endif
-                 } else {
-                                       // Otherwise reset the error count
-                                       meta_packsources[chanpak.meta_num]->consec_errors = 0;
-diff -urN kismet.old/pcapsource.cc kismet.dev/pcapsource.cc
---- kismet.old/pcapsource.cc   2005-08-15 00:40:28.291416000 +0200
-+++ kismet.dev/pcapsource.cc   2005-08-15 01:55:53.972229408 +0200
-@@ -115,6 +115,53 @@
- u_char callback_data[MAX_PACKET_LEN];
- // Open a source
-+int PcapSourceWrt54g::OpenSource() {
-+    channel = 0;
-+
-+    errstr[0] = '\0';
-+
-+    char *unconst = strdup("prism0");
-+
-+    pd = pcap_open_live(unconst, MAX_PACKET_LEN, 1, 1000, errstr);
-+
-+    #if defined (SYS_OPENBSD) || defined(SYS_NETBSD) && defined(HAVE_RADIOTAP)
-+    /* Request desired DLT on multi-DLT systems that default to EN10MB. We do this
-+       later anyway but doing it here ensures we have the desired DLT from the get go. */
-+     pcap_set_datalink(pd, DLT_IEEE802_11_RADIO);
-+    #endif
-+
-+    free(unconst);
-+
-+    if (strlen(errstr) > 0)
-+        return -1; // Error is already in errstr
-+
-+    paused = 0;
-+
-+    errstr[0] = '\0';
-+
-+    num_packets = 0;
-+
-+    if (DatalinkType() < 0)
-+        return -1;
-+
-+#ifdef HAVE_PCAP_NONBLOCK
-+    pcap_setnonblock(pd, 1, errstr);
-+#elif !defined(SYS_OPENBSD)
-+    // do something clever  (Thanks to Guy Harris for suggesting this).
-+    int save_mode = fcntl(pcap_get_selectable_fd(pd), F_GETFL, 0);
-+    if (fcntl(pcap_get_selectable_fd(pd), F_SETFL, save_mode | O_NONBLOCK) < 0) {
-+        snprintf(errstr, 1024, "fcntl failed, errno %d (%s)",
-+                 errno, strerror(errno));
-+    }
-+#endif
-+
-+    if (strlen(errstr) > 0)
-+        return -1; // Ditto
-+    
-+    return 1;
-+}
-+
-+// Open a source
- int PcapSource::OpenSource() {
-     channel = 0;
-@@ -1561,45 +1608,39 @@
- int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, 
-                                  void *in_ext) {
--    char cmdline[2048];
-+      char cmdline[2048];
-       int mode;
-       int wlmode = 0;
--    vector<string> devbits = StrTokenize(in_dev, ":");
-+      vector<string> devbits = StrTokenize(in_dev, ":");
--    if (devbits.size() < 2) {
--              snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
--              if (RunSysCmd(cmdline) < 0) {
--                      snprintf(in_err, 1024, "Unable to set mode using 'wl monitor 1'.  Some "
--                                       "custom firmware images require you to specify the origial "
--                                       "device and a new dynamic device and use the iwconfig controls. "
--                                       "see the README for how to configure your capture source.");
--                      return -1;
--              }
--    } else {
--              // Get the mode ... If this doesn't work, try the old wl method.
--              if (Iwconfig_Get_Mode(devbits[0].c_str(), in_err, &mode) < 0) {
--                      fprintf(stderr, "WARNING:  Getting wireless mode via ioctls failed, "
--                                      "defaulting to trying the 'wl' command.\n");
--                      wlmode = 1;
--              }
-+      snprintf(cmdline, 2048, "/usr/sbin/iwpriv %s set_monitor 1", in_dev);
-+      if (RunSysCmd(cmdline) < 0) {
-+              snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 1'.  Some "
-+                               "custom firmware images require you to specify the origial "
-+                               "device and a new dynamic device and use the iwconfig controls. "
-+                               "see the README for how to configure your capture source.", in_dev);
-+              return -1;
-+      }
--              if (wlmode == 1) {
--                      snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
--                      if (RunSysCmd(cmdline) < 0) {
--                              snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
--                              return -1;
--                      }
--              } else if (mode != LINUX_WLEXT_MONITOR) {
--                      // Set it
--                      if (Iwconfig_Set_Mode(devbits[0].c_str(), in_err, 
--                                                                LINUX_WLEXT_MONITOR) < 0) {
--                              snprintf(in_err, STATUS_MAX, "Unable to set iwconfig monitor "
--                                               "mode.  If you are using an older wrt54g, try specifying "
--                                               "only the ethernet device, not ethX:prismX");
--                              return -1;
--                      }
--              }
-+      return 1;
-+}
-+
-+int unmonitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, 
-+                                 void *in_ext) {
-+      char cmdline[2048];
-+      int mode;
-+      int wlmode = 0;
-+
-+      vector<string> devbits = StrTokenize(in_dev, ":");
-+
-+      snprintf(cmdline, 2048, "/usr/sbin/iwpriv %s set_monitor 0", in_dev);
-+      if (RunSysCmd(cmdline) < 0) {
-+              snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 0'.  Some "
-+                               "custom firmware images require you to specify the origial "
-+                               "device and a new dynamic device and use the iwconfig controls. "
-+                               "see the README for how to configure your capture source.", in_dev);
-+              return -1;
-       }
-       return 1;
-diff -urN kismet.old/pcapsource.h kismet.dev/pcapsource.h
---- kismet.old/pcapsource.h    2005-08-15 00:42:50.849744000 +0200
-+++ kismet.dev/pcapsource.h    2005-08-15 01:56:07.649150200 +0200
-@@ -265,6 +265,7 @@
-     PcapSourceWrt54g(string in_name, string in_dev) : PcapSource(in_name, in_dev) { 
-         fcsbytes = 4;
-     }
-+    int OpenSource();
-     int FetchPacket(kis_packet *packet, uint8_t *data, uint8_t *moddata);
- protected:
-     carrier_type IEEE80211Carrier();
-@@ -388,6 +389,7 @@
- #ifdef SYS_LINUX
- // linksys wrt54g monitoring
- int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
-+int unmonitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
- #endif
- // This should be expanded to handle BSD...