metasploit-framework/external/pcaprub/extconf.rb

116 lines
3.7 KiB
Ruby
Raw Normal View History

require 'mkmf'
puts("platform is #{RUBY_PLATFORM}")
########################
# Netifaces
########################
puts "\n[*] Running checks for netifaces code added by metasploit project"
puts "-----------------------------------------------------------------"
#uncoment to force ioctl on non windows systems
#@force_ioctl = true
@supported_archs = ["i386-mingw32", "i486-linux", "universal-darwin10.0", "i386-openbsd4.8","i386-freebsd8","arm-linux-eabi"]
#arm-linux-eabi tested on maemo5 / N900
puts "[*] Warning : this platform as not been tested" unless @supported_archs.include? RUBY_PLATFORM
if RUBY_PLATFORM =~ /i386-mingw32/
unless have_library("ws2_32" ) and
have_library("iphlpapi") and
have_header("windows.h") and
have_header("winsock2.h") and
have_header("iphlpapi.h")
puts "\nNot all dependencies are satisfied, please check logs"
exit
end
else
headers = ['net/if_dl.h', 'netash/ash.h','netatalk/at.h', 'netax25/ax25.h',
'neteconet/ec.h', 'netipx/ipx.h','netpacket/packet.h', 'netrose/rose.h']
if RUBY_PLATFORM =~ /linux/
headers += [ 'linux/irda.h', 'linux/atm.h',
'linux/llc.h', 'linux/tipc.h',
'linux/dn.h']
end
additionnal_headers = ["sys/types.h","sys/socket.h","sys/un.h","net/if.h","netinet/in.h"]
optional_headers = []
sockaddrs = [ 'at', 'ax25', 'dl', 'eon', 'in', 'in6',
'inarp', 'ipx', 'iso', 'ns', 'un', 'x25',
'rose', 'ash', 'ec', 'll', 'atmpvc', 'atmsvc',
'dn', 'irda', 'llc']
# 1) Check for getifaddrs
unless @force_ioctl
need_ioctl = !(have_func("getifaddrs"))
end
# 2) Check for getnameinfo or redefine it in netifaces.c
have_func("getnameinfo")
# 3) Whitout getifaddrs we'll have to deal with ioctls
if need_ioctl or @force_ioctl
ioctls = [
'SIOCGIFCONF','SIOCGSIZIFCONF','SIOCGIFHWADDR','SIOCGIFADDR','SIOCGIFFLAGS','SIOCGIFDSTADDR',
'SIOCGIFBRDADDR','SIOCGIFNETMASK','SIOCGLIFNUM','SIOCGLIFCONF','SIOCGLIFFLAGS']
ioctls_headers = ['sys/types.h','sys/socket.h','sys/ioctl.h','net/if.h','netinet/in.h','arpa/inet.h']
#TODO Test this on sunos
#if RUBY_PLATFORM =~ /sunos/
# ioctls_headers += ['unistd.h','stropts.h','sys/sockio.h']
#end
$defs.push '-DHAVE_SOCKET_IOCTLS'
ioctls.each do |ioctl|
if have_macro(ioctl, ioctls_headers)
$defs.push "-DHAVE_#{ioctl}"
end
end
end
# 4) Check for optionnal headers
headers.each do |header|
if have_header(header)
optional_headers.push(header)
end
end
# 5) On certain platforms (Linux), there's no sa_len.
# Unfortunately, getifaddrs() doesn't return the
# lengths, because they're in the sa_len field on just about
# everything but Linux.
# In this case we will define a macro that will return the sa_len from
# the sockaddr_xx structure if they are available
if (!have_struct_member("struct sockaddr", "sa_len", ["sys/types.h","sys/socket.h","net/if.h"]))
sockaddrs.each do |sockaddr|
have_type("struct sockaddr_" + sockaddr, additionnal_headers + optional_headers)
end
end
end
#rework the defs to make them compatible with the original netifaces.c code
$defs = $defs.map do |a|
if a =~ /^-DHAVE_TYPE_STRUCT_SOCKADDR_.*$/ then a.gsub("TYPE_STRUCT_","")
elsif a == "-DHAVE_ST_SA_LEN" then a.gsub("HAVE_ST_","HAVE_SOCKADDR_")
else a
end
end
########################
# Pcap
########################
puts "\n[*] Running checks for pcap code..."
puts "-----------------------------------"
if /i386-mingw32/ =~ RUBY_PLATFORM
dir_config("pcap","C:/WpdPack/include","C:/WpdPack/lib")
have_library("wpcap", "pcap_open_live")
have_library("wpcap", "pcap_setnonblock")
else
have_library("pcap", "pcap_open_live")
have_library("pcap", "pcap_setnonblock")
end
if ( RUBY_VERSION =~ /^1\.9/ )
$CFLAGS += " -DRUBY_19"
end
create_makefile("pcaprub")