diff options
author | Yasuyuki KOZAKAI <yasuyuki@netfilter.org> | 2007-08-04 05:22:17 +0000 |
---|---|---|
committer | Yasuyuki KOZAKAI <yasuyuki@netfilter.org> | 2007-08-04 05:22:17 +0000 |
commit | 170af8c566faa9605c1ead558792a031f1d0d48d (patch) | |
tree | 218419f8d7bd6ae980d2604835d90bff924d3d47 /xtables.c | |
parent | d884051d7dfa51ebe1a37e343af516b1bba6943d (diff) |
Tries to load libxt_*.so at first.
If failed, it tries libip[6]t_*.so.
Diffstat (limited to 'xtables.c')
-rw-r--r-- | xtables.c | 37 |
1 files changed, 22 insertions, 15 deletions
@@ -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()); |