From 32b710444f9b09fc06840be349eff54fa893f64c Mon Sep 17 00:00:00 2001 From: Pierre LALET Date: Mon, 26 Sep 2016 19:37:42 +0200 Subject: [PATCH] Arch: move constant values to a new submodule This avoids a circular import problem affecting Windows platforms. --- scapy/arch/__init__.py | 18 +++--------------- scapy/arch/consts.py | 24 ++++++++++++++++++++++++ scapy/sendrecv.py | 4 ++-- 3 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 scapy/arch/consts.py diff --git a/scapy/arch/__init__.py b/scapy/arch/__init__.py index a64907bad..f8687512f 100644 --- a/scapy/arch/__init__.py +++ b/scapy/arch/__init__.py @@ -7,9 +7,10 @@ Operating system specific functionality. """ +import socket -import sys,os,socket - +from scapy.arch.consts import LINUX, OPENBSD, FREEBSD, NETBSD, DARWIN, \ + SOLARIS, WINDOWS, BSD, X86_64, ARM_64 from scapy.error import * import scapy.config from scapy.pton_ntop import inet_pton @@ -54,19 +55,6 @@ def get_if_hwaddr(iff): raise Scapy_Exception("Unsupported address family (%i) for interface [%s]" % (addrfamily,iff)) -LINUX = sys.platform.startswith("linux") -OPENBSD = sys.platform.startswith("openbsd") -FREEBSD = "freebsd" in sys.platform -NETBSD = sys.platform.startswith("netbsd") -DARWIN = sys.platform.startswith("darwin") -SOLARIS = sys.platform.startswith("sunos") -WINDOWS = sys.platform.startswith("win32") -BSD = DARWIN or FREEBSD or OPENBSD or NETBSD - -X86_64 = not WINDOWS and (os.uname()[4] == 'x86_64') -ARM_64 = not WINDOWS and (os.uname()[4] == 'aarch64') - - # Next step is to import following architecture specific functions: # def get_if_raw_hwaddr(iff) # def get_if_raw_addr(iff): diff --git a/scapy/arch/consts.py b/scapy/arch/consts.py new file mode 100644 index 000000000..f475f5b9b --- /dev/null +++ b/scapy/arch/consts.py @@ -0,0 +1,24 @@ +## This file is part of Scapy +## See http://www.secdev.org/projects/scapy for more informations +## Copyright (C) Philippe Biondi +## This program is published under a GPLv2 license + +import os +from sys import platform + +LINUX = platform.startswith("linux") +OPENBSD = platform.startswith("openbsd") +FREEBSD = "freebsd" in platform +NETBSD = platform.startswith("netbsd") +DARWIN = platform.startswith("darwin") +SOLARIS = platform.startswith("sunos") +WINDOWS = platform.startswith("win32") +BSD = DARWIN or FREEBSD or OPENBSD or NETBSD + +if WINDOWS: + X86_64 = False + ARM_64 = False +else: + uname = os.uname() + X86_64 = uname[4] == 'x86_64' + ARM_64 = uname[4] == 'aarch64' diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py index 0686bcb0d..d94f88a6c 100644 --- a/scapy/sendrecv.py +++ b/scapy/sendrecv.py @@ -11,8 +11,8 @@ import errno import cPickle,os,sys,time,subprocess import itertools from select import select +from scapy.arch.consts import DARWIN, FREEBSD from scapy.data import * -from scapy import arch from scapy.config import conf from scapy.packet import Gen from scapy.utils import warning,get_temp_file,PcapReader,wrpcap @@ -127,7 +127,7 @@ def sndrcv(pks, pkt, timeout = None, inter = 0, verbose=None, chainCC=0, retry=0 if remaintime <= 0: break r = None - if not isinstance(pks, StreamSocket) and (arch.FREEBSD or arch.DARWIN): + if not isinstance(pks, StreamSocket) and (FREEBSD or DARWIN): inp, out, err = select(inmask,[],[], 0.05) if len(inp) == 0 or pks in inp: r = pks.nonblock_recv()