116 lines
3.7 KiB
Ruby
116 lines
3.7 KiB
Ruby
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")
|