From 170af8c566faa9605c1ead558792a031f1d0d48d Mon Sep 17 00:00:00 2001 From: Yasuyuki KOZAKAI Date: Sat, 4 Aug 2007 05:22:17 +0000 Subject: Tries to load libxt_*.so at first. If failed, it tries libip[6]t_*.so. --- extensions/Makefile | 12 ------------ xtables.c | 37 ++++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/extensions/Makefile b/extensions/Makefile index 49e95caa..36c9b442 100644 --- a/extensions/Makefile +++ b/extensions/Makefile @@ -56,14 +56,12 @@ SHARED_LIBS+=$(foreach T,$(PF_EXT_SLIB),extensions/libipt_$(T).so) SHARED_SE_LIBS+=$(foreach T,$(PF_EXT_SE_SLIB),extensions/libipt_$(T).so) EXTRA_INSTALLS+=$(foreach T, $(PF_EXT_SLIB), $(DEST_IPT_LIBDIR)/libipt_$(T).so) EXTRA_INSTALLS+=$(foreach T, $(PF_EXT_SE_SLIB), $(DEST_IPT_LIBDIR)/libipt_$(T).so) -EXTRA_INSTALLS+=$(foreach T, $(PFX_EXT_SLIB), $(DEST_IPT_LIBDIR)/libipt_$(T).so) ifeq ($(DO_IPV6), 1) SHARED_LIBS+=$(foreach T,$(PF6_EXT_SLIB),extensions/libip6t_$(T).so) SHARED_SE_LIBS+=$(foreach T,$(PF6_EXT_SE_SLIB),extensions/libip6t_$(T).so) EXTRA_INSTALLS+=$(foreach T, $(PF6_EXT_SLIB), $(DEST_IPT_LIBDIR)/libip6t_$(T).so) EXTRA_INSTALLS+=$(foreach T, $(PF6_EXT_SE_SLIB), $(DEST_IPT_LIBDIR)/libip6t_$(T).so) -EXTRA_INSTALLS+=$(foreach T, $(PFX_EXT_SLIB), $(DEST_IPT_LIBDIR)/libip6t_$(T).so) endif SHARED_LIBS+=$(foreach T,$(PFX_EXT_SLIB),extensions/libxt_$(T).so) @@ -192,16 +190,6 @@ extensions/libip6t_matches.man: $(patsubst %, extensions/libip6t_%.man, $(PF6_EX done ;\ fi >>extensions/libip6t_matches.man -PF_XTLIBS=$(foreach T, $(PFX_EXT_SLIB), $(DEST_IPT_LIBDIR)/libipt_$(T).so) -$(PF_XTLIBS): $(DEST_IPT_LIBDIR)/libipt_%.so : $(DEST_IPT_LIBDIR)/libxt_%.so - @[ -d $(DEST_IPT_LIBDIR)/ ] || mkdir -p $(DEST_IPT_LIBDIR)/ - ln -sf $< $@ - -PF6_XTLIBS=$(foreach T, $(PFX_EXT_SLIB), $(DEST_IPT_LIBDIR)/libip6t_$(T).so) -$(PF6_XTLIBS): $(DEST_IPT_LIBDIR)/libip6t_%.so : $(DEST_IPT_LIBDIR)/libxt_%.so - @[ -d $(DEST_IPT_LIBDIR)/ ] || mkdir -p $(DEST_IPT_LIBDIR)/ - ln -sf $< $@ - $(DEST_IPT_LIBDIR)/libipt_%.so: extensions/libipt_%.so @[ -d $(DEST_IPT_LIBDIR)/ ] || mkdir -p $(DEST_IPT_LIBDIR)/ cp $< $@ diff --git a/xtables.c b/xtables.c index baee4834..58b4e81b 100644 --- a/xtables.c +++ b/xtables.c @@ -292,18 +292,21 @@ struct xtables_match *find_match(const char *name, enum xt_tryload tryload, if (!ptr && tryload != DONT_LOAD && tryload != DURING_LOAD) { char path[strlen(lib_dir) + sizeof("/.so") + strlen(afinfo.libprefix) + strlen(name)]; - sprintf(path, "%s/%s%s.so", lib_dir, afinfo.libprefix, - name); - if (dlopen(path, RTLD_NOW)) { + + sprintf(path, "%s/libxt_%s.so", lib_dir, name); + if (dlopen(path, RTLD_NOW) != NULL) /* Found library. If it didn't register itself, maybe they specified target as match. */ ptr = find_match(name, DONT_LOAD, NULL); - if (!ptr) - exit_error(PARAMETER_PROBLEM, - "Couldn't load match `%s'\n", - name); - } else if (tryload == LOAD_MUST_SUCCEED) + if (ptr == NULL) { + sprintf(path, "%s/%s%s.so", lib_dir, afinfo.libprefix, + name); + if (dlopen(path, RTLD_NOW) != NULL) + ptr = find_match(name, DONT_LOAD, NULL); + } + + if (ptr == NULL && tryload == LOAD_MUST_SUCCEED) exit_error(PARAMETER_PROBLEM, "Couldn't load match `%s':%s\n", name, dlerror()); @@ -362,16 +365,20 @@ struct xtables_target *find_target(const char *name, enum xt_tryload tryload) if (!ptr && tryload != DONT_LOAD && tryload != DURING_LOAD) { char path[strlen(lib_dir) + sizeof("/.so") + strlen(afinfo.libprefix) + strlen(name)]; - sprintf(path, "%s/%s%s.so", lib_dir, afinfo.libprefix, name); - if (dlopen(path, RTLD_NOW)) { + + sprintf(path, "%s/libxt_%s.so", lib_dir, name); + if (dlopen(path, RTLD_NOW) != NULL) /* Found library. If it didn't register itself, maybe they specified match as a target. */ ptr = find_target(name, DONT_LOAD); - if (!ptr) - exit_error(PARAMETER_PROBLEM, - "Couldn't load target `%s'\n", - name); - } else if (tryload == LOAD_MUST_SUCCEED) + + if (ptr == NULL) { + sprintf(path, "%s/%s%s.so", lib_dir, afinfo.libprefix, + name); + if (dlopen(path, RTLD_NOW) != NULL) + ptr = find_target(name, DONT_LOAD); + } + if (ptr == NULL && tryload == LOAD_MUST_SUCCEED) exit_error(PARAMETER_PROBLEM, "Couldn't load target `%s':%s\n", name, dlerror()); -- cgit v1.2.3