11# -*- coding: utf-8 -*-
22
33import ctypes as ct
4- import re
4+ import sys
55import weakref
66import version
77
@@ -684,13 +684,13 @@ class XTablesError(Exception):
684684 """Raised when an xtables call fails for some reason."""
685685
686686
687- _libc = find_library ("c" )
687+ _libc , _ = find_library ("c" )
688688_optind = ct .c_long .in_dll (_libc , "optind" )
689689_optarg = ct .c_char_p .in_dll (_libc , "optarg" )
690690
691- _lib_xtables = find_library ("xtables" )
691+ _lib_xtables , _xtables_version = find_library ("xtables" )
692692
693- _lib_xtwrapper = find_library ("xtwrapper" )
693+ _lib_xtwrapper , _ = find_library ("xtwrapper" )
694694
695695_throw = _lib_xtwrapper .throw_exception
696696
@@ -783,6 +783,16 @@ def _xtinit(self, proto):
783783 self ._xt_globals .opts = None
784784 self ._xt_globals .exit_err = _xt_exit
785785
786+ thismodule = sys .modules [__name__ ]
787+ matchname = "_xtables_match_v%d" % (_xtables_version )
788+ targetname = "_xtables_target_v%d" % (_xtables_version )
789+ try :
790+ self ._match_struct = getattr (thismodule , matchname )
791+ self ._target_struct = getattr (thismodule , targetname )
792+ except :
793+ raise XTablesError ("unknown xtables version %d" %
794+ (_xtables_version ))
795+
786796 self ._loaded_exts = []
787797
788798 # make sure we're initializing with clean state
@@ -828,15 +838,6 @@ def _restore_globals(self):
828838 xtables ._xtables_targets .value = self ._targets
829839 xtables ._xtables_pending_targets .value = self ._pending_targets
830840
831- @classmethod
832- def _get_xtables_version (cls , version ):
833- version_match = re .match ("libxtables.so.(\d+)" , version )
834-
835- if version_match :
836- return int (version_match .group (1 ))
837- else :
838- raise RuntimeError ("Xtables returned unknown version format" )
839-
840841 def _check_extname (self , name ):
841842 if name in ["" , "ACCEPT" , "DROP" , "QUEUE" , "RETURN" ]:
842843 name = "standard"
@@ -893,26 +894,8 @@ def find_match(self, name):
893894 if not match :
894895 return match
895896 self ._loaded (name )
896- version = xtables ._get_xtables_version (match .contents .v1 .version )
897-
898- if 1 == version :
899- return ct .cast (match , ct .POINTER (_xtables_match_v1 ))
900- elif 2 == version :
901- return ct .cast (match , ct .POINTER (_xtables_match_v2 ))
902- elif 4 == version :
903- return ct .cast (match , ct .POINTER (_xtables_match_v4 ))
904- elif 5 == version :
905- return ct .cast (match , ct .POINTER (_xtables_match_v5 ))
906- elif 6 == version :
907- return ct .cast (match , ct .POINTER (_xtables_match_v6 ))
908- elif 7 == version :
909- return ct .cast (match , ct .POINTER (_xtables_match_v7 ))
910- elif 9 == version :
911- return ct .cast (match , ct .POINTER (_xtables_match_v9 ))
912- elif 10 <= version :
913- return ct .cast (match , ct .POINTER (_xtables_match_v10 ))
914- else :
915- raise Exception ("Match object casting failed" )
897+
898+ return ct .cast (match , ct .POINTER (self ._match_struct ))
916899
917900 @preserve_globals
918901 def find_target (self , name ):
@@ -924,26 +907,8 @@ def find_target(self, name):
924907 if not target :
925908 return target
926909 self ._loaded (name )
927- version = xtables ._get_xtables_version (target .contents .v1 .version )
928-
929- if 1 == version :
930- return ct .cast (target , ct .POINTER (_xtables_target_v1 ))
931- elif 2 == version :
932- return ct .cast (target , ct .POINTER (_xtables_target_v2 ))
933- elif 4 == version :
934- return ct .cast (target , ct .POINTER (_xtables_target_v4 ))
935- elif 5 == version :
936- return ct .cast (target , ct .POINTER (_xtables_target_v5 ))
937- elif 6 == version :
938- return ct .cast (target , ct .POINTER (_xtables_target_v6 ))
939- elif 7 == version :
940- return ct .cast (target , ct .POINTER (_xtables_target_v7 ))
941- elif 9 == version :
942- return ct .cast (target , ct .POINTER (_xtables_target_v9 ))
943- elif 10 <= version :
944- return ct .cast (target , ct .POINTER (_xtables_target_v10 ))
945- else :
946- raise Exception ("Target object casting failed" )
910+
911+ return ct .cast (target , ct .POINTER (self ._target_struct ))
947912
948913 @preserve_globals
949914 def save (self , module , ip , ptr ):
0 commit comments