diff --git a/LICENSE b/LICENSE index 4e8724eaf5..f246415b21 100644 --- a/LICENSE +++ b/LICENSE @@ -32,10 +32,6 @@ Copyright: 2003-2010 Mark Borgerding 2009-2012 H D Moore License: BSD-3-clause -Files: external/ruby-lorcon/* -Copyright: 2005, dragorn and Joshua Wright -License: LGPL-2.1 - Files: external/source/exploits/IE11SandboxEscapes/* Copyright: James Forshaw, 2014 License: GPLv3 diff --git a/external/ruby-lorcon/Lorcon.c b/external/ruby-lorcon/Lorcon.c deleted file mode 100644 index 196d67919b..0000000000 --- a/external/ruby-lorcon/Lorcon.c +++ /dev/null @@ -1,525 +0,0 @@ -#include "Lorcon.h" -#include "ruby.h" - -/* - self.license = GPLv2; -*/ - -/* - This is a derivative of the tx.c sample included with lorcon: - http://802.11ninja.net/lorcon/ - - lorcon is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - lorcon is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with lorcon; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Copyright (c) 2005 dragorn and Joshua Wright - -*/ - -/* - Lots of code borrowed from Tom Wambold's pylorcon: - http://pylorcon.googlecode.com/ - tom5760[at]gmail.com -*/ - -/* - All ruby-lorcon/rubyisms are by Rapid7, Inc (C) 2006-2007 - http://metasploit.com/ - msfdev[at]metasploit.com -*/ - -VALUE mLorcon; -VALUE cDevice; - -VALUE lorcon_get_version(VALUE self) { - return INT2NUM(tx80211_getversion()); -} - -VALUE lorcon_cap_to_list(int cap) { - VALUE list; - list = rb_ary_new(); - - if ((cap & TX80211_CAP_SNIFF) != 0) - rb_ary_push(list, rb_str_new2("SNIFF")); - - if ((cap & TX80211_CAP_TRANSMIT) != 0) - rb_ary_push(list, rb_str_new2("TRANSMIT")); - - if ((cap & TX80211_CAP_SEQ) != 0) - rb_ary_push(list, rb_str_new2("SEQ")); - - if ((cap & TX80211_CAP_BSSTIME) != 0) - rb_ary_push(list, rb_str_new2("BSSTIME")); - - if ((cap & TX80211_CAP_FRAG) != 0) - rb_ary_push(list, rb_str_new2("FRAG")); - - if ((cap & TX80211_CAP_CTRL) != 0) - rb_ary_push(list, rb_str_new2("CTRL")); - - if ((cap & TX80211_CAP_DURID) != 0) - rb_ary_push(list, rb_str_new2("DURID")); - - if ((cap & TX80211_CAP_SNIFFACK) != 0) - rb_ary_push(list, rb_str_new2("SNIFFACK")); - - if ((cap & TX80211_CAP_SELFACK) != 0) - rb_ary_push(list, rb_str_new2("SELFACK")); - - if ((cap & TX80211_CAP_TXNOWAIT) != 0) - rb_ary_push(list, rb_str_new2("TXNOWAIT")); - - if ((cap & TX80211_CAP_DSSSTX) != 0) - rb_ary_push(list, rb_str_new2("DSSSTX")); - - if ((cap & TX80211_CAP_OFDMTX) != 0) - rb_ary_push(list, rb_str_new2("OFDMTX")); - - if ((cap & TX80211_CAP_MIMOTX) != 0) - rb_ary_push(list, rb_str_new2("MIMOTX")); - - if ((cap & TX80211_CAP_SETRATE) != 0) - rb_ary_push(list, rb_str_new2("SETRATE")); - - if ((cap & TX80211_CAP_SETMODULATION) != 0) - rb_ary_push(list, rb_str_new2("SETMODULATION")); - - if ((cap & TX80211_CAP_NONE) != 0) - rb_ary_push(list, rb_str_new2("NONE")); - - return list; -} - - -static VALUE lorcon_driver_list(VALUE self) { - VALUE list; - VALUE hash; - - struct tx80211_cardlist *cards = NULL; - int i; - - list = rb_hash_new(); - cards = tx80211_getcardlist(); - if (cards == NULL) { - return(Qnil); - } - - for (i = 1; i < cards->num_cards; i++) { - hash = rb_hash_new(); - rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(cards->cardnames[i])); - rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(cards->descriptions[i])); - rb_hash_aset(hash, rb_str_new2("capabilities"), lorcon_cap_to_list(cards->capabilities[i])); - rb_hash_aset(list, rb_str_new2(cards->cardnames[i]), hash); - } - - tx80211_freecardlist(cards); - return(list); -} - -static VALUE lorcon_device_get_channel(VALUE self) { - struct rldev *rld; - Data_Get_Struct(self, struct rldev, rld); - return INT2NUM(tx80211_getchannel(&rld->in_tx)); -} - -static VALUE lorcon_device_set_channel(VALUE self, VALUE channel) { - struct rldev *rld; - Data_Get_Struct(self, struct rldev, rld); - tx80211_setchannel(&rld->in_tx, NUM2INT(channel)); - return INT2NUM(tx80211_getchannel(&rld->in_tx)); -} - -void lorcon_device_free(struct rldev *rld) { - if (tx80211_getmode(&rld->in_tx) >= 0) { - tx80211_close(&rld->in_tx); - } - free(&rld->in_tx); -} - - -static VALUE lorcon_device_get_mode(VALUE self) { - struct rldev *rld; - int mode; - Data_Get_Struct(self, struct rldev, rld); - - - mode = tx80211_getmode(&rld->in_tx); - if (mode < 0) { - rb_raise(rb_eArgError, "Lorcon could not determine the mode of this device: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - switch (mode) { - case TX80211_MODE_AUTO: - return rb_str_new2("AUTO"); - break; - case TX80211_MODE_ADHOC: - return rb_str_new2("ADHOC"); - break; - case TX80211_MODE_INFRA: - return rb_str_new2("INFRA"); - break; - case TX80211_MODE_MASTER: - return rb_str_new2("MASTER"); - break; - case TX80211_MODE_REPEAT: - return rb_str_new2("REPEAT"); - break; - case TX80211_MODE_SECOND: - return rb_str_new2("SECOND"); - break; - case TX80211_MODE_MONITOR: - return rb_str_new2("MONITOR"); - break; - default: - return Qnil; - break; - } -} - -static VALUE lorcon_device_set_mode(VALUE self, VALUE rmode) { - struct rldev *rld; - char *setmode = StringValuePtr(rmode); - int mode = -1; - - Data_Get_Struct(self, struct rldev, rld); - - if (strcmp(setmode, "AUTO") == 0) { - mode = TX80211_MODE_AUTO; - } else if (strcmp(setmode, "ADHOC") == 0) { - mode = TX80211_MODE_ADHOC; - } else if (strcmp(setmode, "INFRA") == 0) { - mode = TX80211_MODE_INFRA; - } else if (strcmp(setmode, "MASTER") == 0) { - mode = TX80211_MODE_MASTER; - } else if (strcmp(setmode, "REPEAT") == 0) { - mode = TX80211_MODE_REPEAT; - } else if (strcmp(setmode, "SECOND") == 0) { - mode = TX80211_MODE_SECOND; - } else if (strcmp(setmode, "MONITOR") == 0) { - mode = TX80211_MODE_MONITOR; - } else { - rb_raise(rb_eArgError, "Invalid mode specified: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - return INT2NUM(tx80211_setmode(&rld->in_tx, mode)); -} - - -static VALUE lorcon_device_set_functional_mode(VALUE self, VALUE rmode) { - struct rldev *rld; - char *funcmode = StringValuePtr(rmode); - int mode = -1; - - Data_Get_Struct(self, struct rldev, rld); - - if (strcmp(funcmode, "RFMON") == 0) { - mode = TX80211_FUNCMODE_RFMON; - } else if (strcmp(funcmode, "INJECT") == 0) { - mode = TX80211_FUNCMODE_INJECT; - } else if (strcmp(funcmode, "INJMON") == 0) { - mode = TX80211_FUNCMODE_INJMON; - } else { - rb_raise(rb_eArgError, "Invalid mode specified: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - if (tx80211_setfunctionalmode(&rld->in_tx, mode) != 0) { - rb_raise(rb_eArgError, "Lorcon could not set the functional mode: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - return Qtrue; -} - - -static VALUE lorcon_device_get_txrate(VALUE self) { - struct rldev *rld; - int txrate; - - txrate = tx80211_gettxrate(&rld->in_packet); - Data_Get_Struct(self, struct rldev, rld); - - switch (txrate) { - case TX80211_RATE_DEFAULT: - return UINT2NUM(0); - break; - case TX80211_RATE_1MB: - return UINT2NUM(1); - break; - case TX80211_RATE_2MB: - return UINT2NUM(2); - break; - case TX80211_RATE_5_5MB: - return UINT2NUM(5); - break; - case TX80211_RATE_6MB: - return UINT2NUM(6); - break; - case TX80211_RATE_9MB: - return UINT2NUM(9); - break; - case TX80211_RATE_11MB: - return UINT2NUM(11); - break; - case TX80211_RATE_24MB: - return UINT2NUM(24); - break; - case TX80211_RATE_36MB: - return UINT2NUM(36); - break; - case TX80211_RATE_48MB: - return UINT2NUM(48); - break; - case TX80211_RATE_108MB: - return UINT2NUM(108); - break; - default: - rb_raise(rb_eArgError, "Lorcon could not determine the tx rate: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - return Qnil; -} - - -static VALUE lorcon_device_set_txrate(VALUE self, VALUE rrate) { - struct rldev *rld; - float settxrate = -1; - int txrate = -1; - - Data_Get_Struct(self, struct rldev, rld); - - - if ((tx80211_getcapabilities(&rld->in_tx) & TX80211_CAP_SETRATE) == 0) { - rb_raise(rb_eArgError, "Lorcon does not support setting the tx rate for this card"); - return(Qnil); - } - - settxrate = NUM2DBL(rrate); - - if (settxrate == -1) { - txrate = TX80211_RATE_DEFAULT; - } else if (settxrate == 1) { - txrate = TX80211_RATE_1MB; - } else if (settxrate == 2) { - txrate = TX80211_RATE_2MB; - } else if (settxrate == 5.5) { - txrate = TX80211_RATE_5_5MB; - } else if (settxrate == 6) { - txrate = TX80211_RATE_6MB; - } else if (settxrate == 9) { - txrate = TX80211_RATE_9MB; - } else if (settxrate == 11) { - txrate = TX80211_RATE_11MB; - } else if (settxrate == 24) { - txrate = TX80211_RATE_24MB; - } else if (settxrate == 36) { - txrate = TX80211_RATE_36MB; - } else if (settxrate == 48) { - txrate = TX80211_RATE_48MB; - } else if (settxrate == 108) { - txrate = TX80211_RATE_108MB; - } else { - rb_raise(rb_eArgError, "Lorcon does not support this rate setting"); - return(Qnil); - } - - if (tx80211_settxrate(&rld->in_tx, &rld->in_packet, txrate) < 0) { - rb_raise(rb_eArgError, "Lorcon could not set the tx rate: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - return INT2NUM(txrate); -} - -static VALUE lorcon_device_get_modulation(VALUE self) { - struct rldev *rld; - int mod; - - Data_Get_Struct(self, struct rldev, rld); - - mod = tx80211_getmodulation(&rld->in_packet); - switch (mod) { - case TX80211_MOD_DEFAULT: - return rb_str_new2("DEFAULT"); - break; - case TX80211_MOD_FHSS: - return rb_str_new2("FHSS"); - break; - case TX80211_MOD_DSSS: - return rb_str_new2("DSSS"); - break; - case TX80211_MOD_OFDM: - return rb_str_new2("OFDM"); - break; - case TX80211_MOD_TURBO: - return rb_str_new2("TURBO"); - break; - case TX80211_MOD_MIMO: - return rb_str_new2("MIMO"); - break; - case TX80211_MOD_MIMOGF: - return rb_str_new2("MIMOGF"); - break; - default: - rb_raise(rb_eArgError, "Lorcon could not get the modulation value"); - return(Qnil); - } - return(Qnil); -} - -static VALUE lorcon_device_set_modulation(VALUE self, VALUE rmod) { - struct rldev *rld; - char *setmod = NULL; - int mod; - - Data_Get_Struct(self, struct rldev, rld); - - if ((tx80211_getcapabilities(&rld->in_tx) & TX80211_CAP_SETMODULATION) == 0) { - rb_raise(rb_eArgError, "Lorcon does not support setting the modulation for this card"); - return(Qnil); - } - - setmod = StringValuePtr(rmod); - - if (strcmp(setmod, "DEFAULT") == 0) { - mod = TX80211_MOD_DEFAULT; - } else if (strcmp(setmod, "FHSS") == 0) { - mod = TX80211_MOD_FHSS; - } else if (strcmp(setmod, "DSSS") == 0) { - mod = TX80211_MOD_DSSS; - } else if (strcmp(setmod, "OFDM") == 0) { - mod = TX80211_MOD_OFDM; - } else if (strcmp(setmod, "TURBO") == 0) { - mod = TX80211_MOD_TURBO; - } else if (strcmp(setmod, "MIMO") == 0) { - mod = TX80211_MOD_MIMO; - } else if (strcmp(setmod, "MIMOGF") == 0) { - mod = TX80211_MOD_MIMOGF; - } else { - rb_raise(rb_eArgError, "Lorcon does not support this modulation setting"); - return(Qnil); - } - - if (tx80211_setmodulation(&rld->in_tx, &rld->in_packet, mod) < 0) { - rb_raise(rb_eArgError, "Lorcon could not set the modulation: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - return INT2NUM(mod); -} - -static VALUE lorcon_device_get_capabilities(VALUE self) { - struct rldev *rld; - Data_Get_Struct(self, struct rldev, rld); - return(lorcon_cap_to_list(tx80211_getcapabilities(&rld->in_tx))); -} - -static VALUE lorcon_device_open(int argc, VALUE *argv, VALUE self) { - struct rldev *rld; - int ret = 0; - int drivertype = INJ_NODRIVER; - char *driver, *intf; - VALUE rbdriver, rbintf; - VALUE obj; - - rb_scan_args(argc, argv, "2", &rbintf, &rbdriver); - - driver = STR2CSTR(rbdriver); - intf = STR2CSTR(rbintf); - - obj = Data_Make_Struct(cDevice, struct rldev, 0, lorcon_device_free, rld); - - drivertype = tx80211_resolvecard(driver); - if (drivertype == INJ_NODRIVER) { - rb_raise(rb_eArgError, "Lorcon did not recognize the specified driver"); - return(Qnil); - } - - if (tx80211_init(&rld->in_tx, intf, drivertype) < 0) { - rb_raise(rb_eRuntimeError, "Lorcon could not initialize the interface: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - /* Open the interface to get a socket */ - ret = tx80211_open(&rld->in_tx); - if (ret < 0) { - rb_raise(rb_eRuntimeError, "Lorcon could not open the interface: %s", tx80211_geterrstr(&rld->in_tx)); - return(Qnil); - } - - rb_obj_call_init(obj, 0, 0); - return(obj); -} - -static VALUE lorcon_device_write(int argc, VALUE *argv, VALUE self) { - struct rldev *rld; - int ret = 0; - int cnt = 0; - int dly = 0; - - VALUE rbbuff, rbcnt, rbdelay; - - Data_Get_Struct(self, struct rldev, rld); - - switch(rb_scan_args(argc, argv, "12", &rbbuff, &rbcnt, &rbdelay)) { - case 1: - rbdelay = INT2NUM(0); - case 2: - rbcnt = INT2NUM(1); - default: - break; - } - - cnt = NUM2INT(rbcnt); - dly = NUM2INT(rbdelay); - - rld->in_packet.packet = StringValuePtr(rbbuff); - rld->in_packet.plen = RSTRING(rbbuff)->len; - - for (; cnt > 0; cnt--) { - ret = tx80211_txpacket(&rld->in_tx, &rld->in_packet); - if (ret < 0) { - rb_raise(rb_eRuntimeError, "Lorcon could not transmit packet: %s", tx80211_geterrstr(&rld->in_tx)); - return(INT2NUM(ret)); - } - if (dly > 0) -#ifdef _MSC_VER - Sleep(dly); -#else - usleep(dly); -#endif - } - - return (rbcnt); -} - -void Init_Lorcon() { - mLorcon = rb_define_module("Lorcon"); - rb_define_module_function(mLorcon, "drivers", lorcon_driver_list, 0); - rb_define_module_function(mLorcon, "version", lorcon_get_version, 0); - - cDevice = rb_define_class_under(mLorcon, "Device", rb_cObject); - rb_define_singleton_method(cDevice, "new", lorcon_device_open, -1); - rb_define_method(cDevice, "channel", lorcon_device_get_channel, 0); - rb_define_method(cDevice, "channel=", lorcon_device_set_channel, 1); - rb_define_method(cDevice, "write", lorcon_device_write, -1); - rb_define_method(cDevice, "mode", lorcon_device_get_mode, 0); - rb_define_method(cDevice, "mode=", lorcon_device_set_mode, 1); - rb_define_method(cDevice, "fmode=", lorcon_device_set_functional_mode, 1); - rb_define_method(cDevice, "txrate", lorcon_device_get_txrate, 0); - rb_define_method(cDevice, "txrate=", lorcon_device_set_txrate, 1); - rb_define_method(cDevice, "modulation", lorcon_device_get_modulation, 0); - rb_define_method(cDevice, "modulation=", lorcon_device_set_modulation, 1); - rb_define_method(cDevice, "capabilities", lorcon_device_get_capabilities, 0); -} diff --git a/external/ruby-lorcon/Lorcon.h b/external/ruby-lorcon/Lorcon.h deleted file mode 100644 index 7954c1f367..0000000000 --- a/external/ruby-lorcon/Lorcon.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _MSFLORCON_H -#define _MSFLORCON_H - -#include -#include -#include -#include -#include -#include -#include - - -struct rldev { - struct tx80211 in_tx; - struct tx80211_packet in_packet; -}; - - -#endif diff --git a/external/ruby-lorcon/README b/external/ruby-lorcon/README deleted file mode 100644 index eaea96f856..0000000000 --- a/external/ruby-lorcon/README +++ /dev/null @@ -1,41 +0,0 @@ -This is an experimental interface for lorcon, a 802.11 library -developed by Joshua Wright and dragorn. This interface is only -available on Linux and with lorcon-supported wireless drivers. - -For more information, please see the lorcon documentation and code: -http://www.802.11mercenary.net/lorcon/ - -To build this extension: - -1) Download, compile, and install lorcon -The latest version of lorcon can pulled from SVN: -$ svn co https://802.11ninja.net/svn/lorcon/trunk/ lorcon -$ cd lorcon -$ ./configure -$ make - $ sudo make install - -- or -- - $ su - # make install - # exit -$ cd .. - -2) build the ruby extension.. -$ ruby extconf.rb -$ make -$ sudo make install - -- or -- -$ su -# make install - - -NOTES: - -if Ubuntu 8.04 (and probably others) bitches about 'mkmf', -you need ruby dev package. - -:~/metasploit/external/ruby-lorcon$ ruby extconf.rb -extconf.rb:2:in `require': no such file to load -- mkmf (LoadError) - from extconf.rb:2 - -:~/metasploit/external/ruby-lorcon$ sudo apt-get install ruby1.8-dev diff --git a/external/ruby-lorcon/extconf.rb b/external/ruby-lorcon/extconf.rb deleted file mode 100644 index 7fcf31bda3..0000000000 --- a/external/ruby-lorcon/extconf.rb +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -require 'mkmf' - -if (have_library("orcon", "tx80211_txpacket", "tx80211.h") or find_library("orcon", "tx80211_txpacket", "tx80211.h")) - create_makefile("Lorcon") -else - puts "Error: the lorcon library was not found, please see the README" -end diff --git a/external/ruby-lorcon/test.rb b/external/ruby-lorcon/test.rb deleted file mode 100755 index 4f4398b563..0000000000 --- a/external/ruby-lorcon/test.rb +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env ruby - -$:.unshift(File.dirname(__FILE__)) -require "Lorcon" -require "pp" - -pp Lorcon.version -pp Lorcon.drivers - -# Beacon frame from tx.c -packet = [ - 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, # dur ffff - 0xff, 0xff, 0x00, 0x0f, 0x66, 0xe3, 0xe4, 0x03, - 0x00, 0x0f, 0x66, 0xe3, 0xe4, 0x03, 0x00, 0x00, # 0x0000 - seq no. - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, # BSS timestamp - 0x64, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x73, 0x6f, - 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x63, - 0x6c, 0x65, 0x76, 0x65, 0x72, 0x01, 0x08, 0x82, - 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, 0x03, - 0x01, 0x01, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x2a, 0x01, 0x05, 0x2f, 0x01, 0x05, 0x32, 0x04, - 0x0c, 0x12, 0x18, 0x60, 0xdd, 0x05, 0x00, 0x10, - 0x18, 0x01, 0x01, 0xdd, 0x16, 0x00, 0x50, 0xf2, - 0x01, 0x01, 0x00, 0x00, 0x50, 0xf2, 0x02, 0x01, - 0x00, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x00, 0x00, - 0x50, 0xf2, 0x02 -].pack('C*') - - -# Configure the card for reliable injection - -tx = Lorcon::Device.new('ath0', 'madwifing') -tx.fmode = "INJECT" -tx.channel = 11 -tx.txrate = 2 -tx.modulation = "DSSS" - -sa = Time.now.to_f -tx.write(packet, 500, 0) -ea = Time.now.to_f - sa - -sb = Time.now.to_f -500.times { tx.write(packet, 1, 0) } -eb = Time.now.to_f - sb - -$stdout.puts "Sent 500 packets (C) in #{ea.to_s} seconds" -$stdout.puts "Sent 500 packets (Ruby) in #{eb.to_s} seconds" diff --git a/external/ruby-lorcon2/Lorcon2.c b/external/ruby-lorcon2/Lorcon2.c deleted file mode 100644 index 1a69658d2d..0000000000 --- a/external/ruby-lorcon2/Lorcon2.c +++ /dev/null @@ -1,655 +0,0 @@ -#include "Lorcon2.h" -#include "ruby.h" - -#ifndef RUBY_19 -#include "rubysig.h" -#endif - -/* - self.license = GPLv2; -*/ - -/* - This is a derivative of the tx.c sample included with lorcon: - http://802.11ninja.net/lorcon/ - - lorcon is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - lorcon is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with lorcon; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Copyright (c) 2005 dragorn and Joshua Wright - -*/ - -/* - Lots of code borrowed from Tom Wambold's pylorcon: - http://pylorcon.googlecode.com/ - tom5760[at]gmail.com -*/ - -/* - All ruby-lorcon/rubyisms are by Rapid7, Inc. (C) 2006-2007 - http://metasploit.com/ - msfdev[at]metasploit.com -*/ - -VALUE mLorcon; -VALUE cDevice; -VALUE cPacket; - -VALUE Lorcon_get_version(VALUE self) { - return INT2NUM(lorcon_get_version()); -} - -static VALUE Lorcon_list_drivers(VALUE self) { - VALUE list; - VALUE hash; - - lorcon_driver_t *drvlist, *dri; - - list = rb_hash_new(); - - dri = drvlist = lorcon_list_drivers(); - - if (dri == NULL) - return Qnil; - - while (dri) { - hash = rb_hash_new(); - rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name)); - rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details)); - rb_hash_aset(list, rb_str_new2(dri->name),hash); - dri = dri->next; - } - - lorcon_free_driver_list(drvlist); - - return(list); -} - -static VALUE Lorcon_find_driver(VALUE self, VALUE driver) { - VALUE hash; - lorcon_driver_t *dri; - char *drivert = RSTRING_PTR(driver); - - dri = lorcon_find_driver(drivert); - - if (dri == NULL) - return Qnil; - - hash = rb_hash_new(); - - rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name)); - rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details)); - - lorcon_free_driver_list(dri); - - return(hash); -} - -static VALUE Lorcon_auto_driver(VALUE self, VALUE interface) { - VALUE hash; - lorcon_driver_t *dri; - char *intf = RSTRING_PTR(interface); - - dri = lorcon_auto_driver(intf); - - if (dri == NULL) - return Qnil; - - hash = rb_hash_new(); - rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name)); - rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details)); - - lorcon_free_driver_list(dri); - - return hash; -} - -void Lorcon_free(struct rldev *rld) { - if (rld->context != NULL) - lorcon_free(rld->context); -} - -static VALUE Lorcon_create(int argc, VALUE *argv, VALUE self) { - struct rldev *rld; - char *intf = NULL, *driver = NULL; - VALUE rbdriver, rbintf, obj; - lorcon_driver_t *dri; - - if (argc == 2) { - rb_scan_args(argc, argv, "2", &rbintf, &rbdriver); - intf = StringValuePtr(rbintf); - driver = StringValuePtr(rbdriver); - } else { - rb_scan_args(argc, argv, "1", &rbintf); - intf = StringValuePtr(rbintf); - } - - if (driver == NULL) { - if ((dri = lorcon_auto_driver(intf)) == NULL) { - rb_raise(rb_eRuntimeError, - "LORCON could not detect a driver and none specified"); - return (Qnil); - } - } else { - if ((dri = lorcon_find_driver(driver)) == NULL) { - rb_raise(rb_eArgError, - "LORCON could not recognize the specified driver"); - return (Qnil); - } - } - - obj = Data_Make_Struct(cDevice, struct rldev, 0, Lorcon_free, rld); - - rld->context = lorcon_create(intf, dri); - - // Obsolete: XXX - // lorcon_set_timeout(rld->context, 100); - - if (rld->context == NULL) { - rb_raise(rb_eRuntimeError, - "LORCON could not create context"); - return (Qnil); - } - - lorcon_free_driver_list(dri); - - rb_obj_call_init(obj, 0, 0); - return(obj); -} - - -static VALUE Lorcon_open_inject(VALUE self) { - struct rldev *rld; - - Data_Get_Struct(self, struct rldev, rld); - - if (lorcon_open_inject(rld->context) < 0) - return Qfalse; - - return Qtrue; -} - -static VALUE Lorcon_open_monitor(VALUE self) { - struct rldev *rld; - - Data_Get_Struct(self, struct rldev, rld); - - if (lorcon_open_monitor(rld->context) < 0) - return Qfalse; - - return Qtrue; -} - -static VALUE Lorcon_open_injmon(VALUE self) { - struct rldev *rld; - - Data_Get_Struct(self, struct rldev, rld); - - if (lorcon_open_injmon(rld->context) < 0) - return Qfalse; - - return Qtrue; -} - -static VALUE Lorcon_get_error(VALUE self) { - struct rldev *rld; - - Data_Get_Struct(self, struct rldev, rld); - - return rb_str_new2(lorcon_get_error(rld->context)); -} - -static VALUE Lorcon_get_capiface(VALUE self) { - struct rldev *rld; - Data_Get_Struct(self, struct rldev, rld); - - return rb_str_new2(lorcon_get_capiface(rld->context)); -} - -void Lorcon_packet_free(struct rlpack *rlp) { - if (rlp->packet != NULL) { - lorcon_packet_free(rlp->packet); - rlp->packet = NULL; - free(rlp); - } -} - -static VALUE Lorcon_packet_create(int argc, VALUE *argv, VALUE self) { - struct rlpack *rlp; - VALUE obj; - - obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp); - - rlp->packet = (struct lorcon_packet *) malloc(sizeof(struct lorcon_packet)); - memset(rlp->packet, 0, sizeof(struct lorcon_packet)); - - rlp->bssid = NULL; - rlp->dot3 = NULL; - rlp->len = 0; - rlp->dir = 0; - - rb_obj_call_init(obj, 0, 0); - return(obj); -} - -static VALUE Lorcon_packet_get_channel(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - return INT2FIX(rlp->packet->channel); -} - -static VALUE Lorcon_packet_set_channel(VALUE self, VALUE channel) { - struct rlpack *rlp; - - Data_Get_Struct(self, struct rlpack, rlp); - - lorcon_packet_set_channel(rlp->packet, NUM2INT(channel)); - - return channel; -} - -static VALUE Lorcon_packet_get_dlt(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - return INT2FIX(rlp->packet->dlt); -} - -static VALUE Lorcon_packet_get_bssid(VALUE self) { - struct rlpack *rlp; - struct lorcon_dot11_extra *extra; - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->packet->extra_info == NULL || - rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211) - return Qnil; - - extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info; - - if (extra->bssid_mac == NULL) - return Qnil; - - return rb_str_new((char *)extra->bssid_mac, 6); -} - -static VALUE Lorcon_packet_get_source(VALUE self) { - struct rlpack *rlp; - struct lorcon_dot11_extra *extra; - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->packet->extra_info == NULL || - rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211) - return Qnil; - - extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info; - - if (extra->source_mac == NULL) - return Qnil; - - return rb_str_new((char *)extra->source_mac, 6); -} - -static VALUE Lorcon_packet_get_dest(VALUE self) { - struct rlpack *rlp; - struct lorcon_dot11_extra *extra; - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->packet->extra_info == NULL || - rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211) - return Qnil; - - extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info; - - if (extra->dest_mac == NULL) - return Qnil; - - return rb_str_new((char *)extra->dest_mac, 6); -} - -static VALUE Lorcon_packet_get_rawdata(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->packet->packet_raw == NULL) - return Qnil; - - return rb_str_new((char *)rlp->packet->packet_raw, rlp->packet->length); -} - -static VALUE Lorcon_packet_get_headerdata(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->packet->packet_header == NULL) - return Qnil; - - return rb_str_new((char *)rlp->packet->packet_header, rlp->packet->length_header); -} - -static VALUE Lorcon_packet_get_data(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->packet->packet_data == NULL) - return Qnil; - - return rb_str_new((char *)rlp->packet->packet_data, rlp->packet->length_data); -} - - -static VALUE Lorcon_packet_getdot3(VALUE self) { - struct rlpack *rlp; - u_char *pdata; - int len; - VALUE ret; - - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->packet->packet_data == NULL) - return Qnil; - - len = lorcon_packet_to_dot3(rlp->packet, &pdata); - - ret = rb_str_new((char *)pdata, len); - - free(pdata); - - return ret; -} - -static VALUE Lorcon_packet_prepdot3(VALUE self, VALUE dot3) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - rlp->dot3 = (unsigned char *) RSTRING_PTR(dot3); - rlp->len = RSTRING_LEN(dot3); - - return dot3; -} - -static VALUE Lorcon_packet_prepbssid(VALUE self, VALUE bssid) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - rlp->bssid = (unsigned char *)RSTRING_PTR(bssid); - - return bssid; -} - -static VALUE Lorcon_packet_prepdir(VALUE self, VALUE dir) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - rlp->dir = NUM2INT(dir); - - return dir; -} - -static VALUE Lorcon_packet_getdir(VALUE self) { - struct rlpack *rlp; - struct lorcon_dot11_extra *extra; - Data_Get_Struct(self, struct rlpack, rlp); - - if (rlp->dir != 0) - return INT2FIX(rlp->dir); - - if (rlp->packet == NULL) - return Qnil; - - if (rlp->packet->extra_info == NULL || - rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211) - return Qnil; - - extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info; - - if (extra->from_ds && !extra->to_ds) - return INT2FIX(LORCON_DOT11_DIR_FROMDS); - else if (!extra->from_ds && extra->to_ds) - return INT2FIX(LORCON_DOT11_DIR_TODS); - else if (!extra->from_ds && !extra->to_ds) - return INT2FIX(LORCON_DOT11_DIR_ADHOCDS); - else if (extra->from_ds && extra->to_ds) - return INT2FIX(LORCON_DOT11_DIR_INTRADS); - - return Qnil; -} - -static VALUE Lorcon_packet_get_rawlength(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - return INT2FIX(rlp->packet->length); -} - -static VALUE Lorcon_packet_get_headerlength(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - return INT2FIX(rlp->packet->length_header); -} - -static VALUE Lorcon_packet_get_datalength(VALUE self) { - struct rlpack *rlp; - Data_Get_Struct(self, struct rlpack, rlp); - - return INT2FIX(rlp->packet->length_data); -} - -VALUE new_lorcon_packet(struct lorcon_packet **packet) { - struct rlpack *rlp; - VALUE obj; - - obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp); - - rlp->packet = *packet; - rb_obj_call_init(obj, 0, 0); - return(obj); -} - -static VALUE Lorcon_inject_packet(VALUE self, VALUE packet) { - struct rldev *rld; - struct rlpack *rlp; - lorcon_packet_t *pack = NULL; - int ret; - - if (rb_obj_is_kind_of(packet, cPacket) == 0) { - rb_raise(rb_eTypeError, "wrong type expected %s", rb_class2name(cPacket)); - return Qnil; - } - - Data_Get_Struct(self, struct rldev, rld); - Data_Get_Struct(packet, struct rlpack, rlp); - - if (rlp->bssid != NULL && rlp->dot3 != NULL) { - pack = lorcon_packet_from_dot3(rlp->bssid, rlp->dir, rlp->dot3, rlp->len); - ret = lorcon_inject(rld->context, pack); - lorcon_packet_free(pack); - } else { - ret = lorcon_inject(rld->context, rlp->packet); - } - - return INT2FIX(ret); -} - -static VALUE Lorcon_write_raw(VALUE self, VALUE rpacket) { - struct rldev *rld; - int ret; - - Data_Get_Struct(self, struct rldev, rld); - - if(TYPE(rpacket) != T_STRING) { - rb_raise(rb_eArgError, "packet data must be a string"); - return Qnil; - } - - ret = lorcon_send_bytes(rld->context, RSTRING_LEN(rpacket), (unsigned char *)RSTRING_PTR(rpacket)); - return INT2FIX(ret); -} - -static VALUE Lorcon_set_filter(VALUE self, VALUE filter) { - struct rldev *rld; - Data_Get_Struct(self, struct rldev, rld); - return INT2FIX(lorcon_set_filter(rld->context, RSTRING_PTR(filter))); -} - -static VALUE Lorcon_set_channel(VALUE self, VALUE channel) { - struct rldev *rld; - Data_Get_Struct(self, struct rldev, rld); - return INT2FIX(lorcon_set_channel(rld->context, NUM2INT(channel))); -} - -static VALUE Lorcon_get_channel(VALUE self) { - struct rldev *rld; - Data_Get_Struct(self, struct rldev, rld); - return INT2FIX(lorcon_get_channel(rld->context)); -} - -static void rblorcon_pcap_handler(rblorconjob_t *job, struct pcap_pkthdr *hdr, u_char *pkt){ - job->pkt = (unsigned char *)pkt; - job->hdr = *hdr; -} - -static VALUE Lorcon_capture_next(VALUE self) { - struct rldev *rld; - int ret = 0; - struct lorcon_packet *packet; - unsigned char *raw; - pcap_t *pd; - rblorconjob_t job; - Data_Get_Struct(self, struct rldev, rld); - - pd = lorcon_get_pcap(rld->context); - -#ifndef RUBY_19 - TRAP_BEG; -#endif - ret = pcap_dispatch(pd, 1, (pcap_handler) rblorcon_pcap_handler, (u_char *)&job); -#ifndef RUBY_19 - TRAP_END; -#endif - - if (ret == 0) - return(Qnil); - - if (ret < 0 || job.hdr.caplen <= 0) - return INT2FIX(ret); - - raw = malloc(job.hdr.caplen); - if(! raw) return Qnil; - - memcpy(raw, job.pkt, job.hdr.caplen); - packet = lorcon_packet_from_pcap(rld->context, &job.hdr, raw); - lorcon_packet_set_freedata(packet, 1); - - return new_lorcon_packet(&packet); -} - - -static VALUE Lorcon_capture_loop(int argc, VALUE *argv, VALUE self) { - struct rldev *rld; - int count = 0; - int p = 0; - VALUE v_cnt; - VALUE ret; - int fd; - - Data_Get_Struct(self, struct rldev, rld); - - if (rb_scan_args(argc, argv, "01", &v_cnt) >= 1) { - count = FIX2INT(v_cnt); - } else { - count = -1; - } - - fd = lorcon_get_selectable_fd(rld->context); - if(fd < 0 ) { - rb_raise(rb_eRuntimeError, - "LORCON context could not provide a pollable descriptor " - "and we need one for the threaded dispatch loop"); - } - - while (p < count || count <= 0) { - ret = Lorcon_capture_next(self); - if(TYPE(ret) == T_FIXNUM) return(ret); - if(ret == Qnil) { - rb_thread_wait_fd(fd); - } else { - rb_yield(ret); - p++; - } - } - - return INT2FIX(p); -} - - -void Init_Lorcon2() { - mLorcon = rb_define_module("Lorcon"); - - cPacket = rb_define_class_under(mLorcon, "Packet", rb_cObject); - - rb_define_const(cPacket, "LORCON_FROM_DS", INT2NUM(LORCON_DOT11_DIR_FROMDS)); - rb_define_const(cPacket, "LORCON_TO_DS", INT2NUM(LORCON_DOT11_DIR_TODS)); - rb_define_const(cPacket, "LORCON_INTRA_DS", INT2NUM(LORCON_DOT11_DIR_INTRADS)); - rb_define_const(cPacket, "LORCON_ADHOC_DS", INT2NUM(LORCON_DOT11_DIR_ADHOCDS)); - - rb_define_singleton_method(cPacket, "new", Lorcon_packet_create, -1); - rb_define_method(cPacket, "bssid", Lorcon_packet_get_bssid, 0); - rb_define_method(cPacket, "source", Lorcon_packet_get_source, 0); - rb_define_method(cPacket, "dest", Lorcon_packet_get_dest, 0); - - rb_define_method(cPacket, "channel", Lorcon_packet_get_channel, 0); - rb_define_method(cPacket, "channel=", Lorcon_packet_set_channel, 1); - rb_define_method(cPacket, "dlt", Lorcon_packet_get_dlt, 0); - - rb_define_method(cPacket, "rawdata", Lorcon_packet_get_rawdata, 0); - rb_define_method(cPacket, "headerdata", Lorcon_packet_get_headerdata, 0); - rb_define_method(cPacket, "data", Lorcon_packet_get_data, 0); - - rb_define_method(cPacket, "dot3", Lorcon_packet_getdot3, 0); - - rb_define_method(cPacket, "dot3=", Lorcon_packet_prepdot3, 1); - rb_define_method(cPacket, "bssid=", Lorcon_packet_prepbssid, 1); - rb_define_method(cPacket, "direction=", Lorcon_packet_prepdir, 1); - rb_define_method(cPacket, "direction", Lorcon_packet_getdir, 0); - - rb_define_method(cPacket, "size", Lorcon_packet_get_rawlength, 0); - rb_define_method(cPacket, "linesize", Lorcon_packet_get_rawlength, 0); - rb_define_method(cPacket, "headersize", Lorcon_packet_get_headerlength, 0); - rb_define_method(cPacket, "datasize", Lorcon_packet_get_datalength, 0); - - cDevice = rb_define_class_under(mLorcon, "Device", rb_cObject); - rb_define_singleton_method(cDevice, "new", Lorcon_create, -1); - rb_define_method(cDevice, "openinject", Lorcon_open_inject, 0); - rb_define_method(cDevice, "openmonitor", Lorcon_open_monitor, 0); - rb_define_method(cDevice, "openinjmon", Lorcon_open_injmon, 0); - rb_define_method(cDevice, "error", Lorcon_get_error, 0); - rb_define_method(cDevice, "capiface", Lorcon_get_capiface, 0); - - rb_define_method(cDevice, "filter=", Lorcon_set_filter, 1); - rb_define_method(cDevice, "channel=", Lorcon_set_channel, 1); - rb_define_method(cDevice, "channel", Lorcon_get_channel, 0); - - rb_define_method(cDevice, "loop", Lorcon_capture_loop, -1); - rb_define_method(cDevice, "each", Lorcon_capture_loop, -1); - rb_define_method(cDevice, "each_packet", Lorcon_capture_loop, -1); - rb_define_method(cDevice, "write", Lorcon_write_raw, 1); - rb_define_method(cDevice, "inject", Lorcon_inject_packet, 1); - rb_define_module_function(mLorcon, "drivers", Lorcon_list_drivers, 0); - rb_define_module_function(mLorcon, "version", Lorcon_get_version, 0); - rb_define_module_function(mLorcon, "find_driver", Lorcon_find_driver, 1); - rb_define_module_function(mLorcon, "auto_driver", Lorcon_auto_driver, 1); -} - - diff --git a/external/ruby-lorcon2/Lorcon2.h b/external/ruby-lorcon2/Lorcon2.h deleted file mode 100644 index c175ab7dd6..0000000000 --- a/external/ruby-lorcon2/Lorcon2.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _MSFLORCON_H -#define _MSFLORCON_H - -#include -#include -#include -#include -#include - -#include -#include - -struct rldev { - struct lorcon *context; -}; - -struct rlpack { - struct lorcon_packet *packet; - - /* dot3 construction via multiple elements */ - u_char *bssid, *dot3; - int dir, len; -}; - - -typedef struct rblorconjob { - struct pcap_pkthdr hdr; - unsigned char *pkt; -} rblorconjob_t; - -#endif diff --git a/external/ruby-lorcon2/README b/external/ruby-lorcon2/README deleted file mode 100644 index eaea96f856..0000000000 --- a/external/ruby-lorcon2/README +++ /dev/null @@ -1,41 +0,0 @@ -This is an experimental interface for lorcon, a 802.11 library -developed by Joshua Wright and dragorn. This interface is only -available on Linux and with lorcon-supported wireless drivers. - -For more information, please see the lorcon documentation and code: -http://www.802.11mercenary.net/lorcon/ - -To build this extension: - -1) Download, compile, and install lorcon -The latest version of lorcon can pulled from SVN: -$ svn co https://802.11ninja.net/svn/lorcon/trunk/ lorcon -$ cd lorcon -$ ./configure -$ make - $ sudo make install - -- or -- - $ su - # make install - # exit -$ cd .. - -2) build the ruby extension.. -$ ruby extconf.rb -$ make -$ sudo make install - -- or -- -$ su -# make install - - -NOTES: - -if Ubuntu 8.04 (and probably others) bitches about 'mkmf', -you need ruby dev package. - -:~/metasploit/external/ruby-lorcon$ ruby extconf.rb -extconf.rb:2:in `require': no such file to load -- mkmf (LoadError) - from extconf.rb:2 - -:~/metasploit/external/ruby-lorcon$ sudo apt-get install ruby1.8-dev diff --git a/external/ruby-lorcon2/extconf.rb b/external/ruby-lorcon2/extconf.rb deleted file mode 100644 index 955244f708..0000000000 --- a/external/ruby-lorcon2/extconf.rb +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env ruby -require 'mkmf' - - -$CFLAGS += " -I/usr/include/lorcon2" - -if ( RUBY_VERSION =~ /^(1\.9|2\.0)/ ) - $CFLAGS += " -DRUBY_19" -end - -if find_library("orcon2", "lorcon_list_drivers", "lorcon2/lorcon.h") - create_makefile("Lorcon2") -else - puts "Error: the lorcon2 library was not found, please see the README" -end - diff --git a/external/ruby-lorcon2/test.rb b/external/ruby-lorcon2/test.rb deleted file mode 100755 index 7dd8803058..0000000000 --- a/external/ruby-lorcon2/test.rb +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env ruby - -$:.unshift(File.dirname(__FILE__)) - -require "Lorcon2" -require 'thread' -require "pp" - -intf = ARGV.shift || "wlan0" - -$stdout.puts "Checking LORCON version" - -pp Lorcon.version - -$stdout.puts "\nFetching LORCON driver list" - -pp Lorcon.drivers - -$stdout.puts "\nResolving driver by name 'mac80211'" - -pp Lorcon.find_driver("mac80211") - -$stdout.puts "\nAuto-detecting driver for interface wlan0" - -pp Lorcon.auto_driver(intf) - - -tx = Lorcon::Device.new(intf) -$stdout.puts "\nCreated LORCON context" - -if tx.openinjmon() - $stdout.puts "\nOpened as INJMON: " + tx.capiface -else - $stdout.puts "\nFAILED to open " + tx.capiface + " as INJMON: " + tx.error -end - -def safe_loop(wifi) - @q = Queue.new - reader = Thread.new do - wifi.each_packet {|pkt| @q << pkt } - end - - eater = Thread.new do - while(pkt = @q.pop) - yield(pkt) - end - end - - begin - eater.join - rescue ::Interrupt => e - reader.kill if reader.alive? - puts "ALL DONE!" - end -end - -safe_loop(tx) do |pkt| - pp pkt -end diff --git a/external/ruby-lorcon2/upstream.svn b/external/ruby-lorcon2/upstream.svn deleted file mode 100644 index daeb943a7f..0000000000 --- a/external/ruby-lorcon2/upstream.svn +++ /dev/null @@ -1,11 +0,0 @@ -Path: . -URL: http://802.11ninja.net/svn/lorcon/trunk/ruby-lorcon -Repository Root: http://802.11ninja.net/svn/lorcon -Repository UUID: 61418039-352c-0410-8488-9e586b2135b2 -Revision: 204 -Node Kind: directory -Schedule: normal -Last Changed Author: dragorn -Last Changed Rev: 202 -Last Changed Date: 2009-09-15 09:31:29 -0500 (Tue, 15 Sep 2009) -