From 23976ac5efe5d45d78ee6f05e487a1b9feb46655 Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Sun, 20 Jan 2008 13:32:50 +0000 Subject: print warning when dlopen fails If the file exists but could not be loaded, print the dlerror(). Often it is a missing symbol. Signed-off-by: Jan Engelhardt --- xtables.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'xtables.c') diff --git a/xtables.c b/xtables.c index 0a2fdb1d..673ba763 100644 --- a/xtables.c +++ b/xtables.c @@ -307,6 +307,9 @@ void parse_interface(const char *arg, char *vianame, unsigned char *mask) struct xtables_match *find_match(const char *name, enum xt_tryload tryload, struct xtables_rule_match **matches) { +#ifndef NO_SHARED_LIBS + struct stat sb; +#endif struct xtables_match *ptr; const char *icmp6 = "icmp6"; @@ -347,12 +350,16 @@ struct xtables_match *find_match(const char *name, enum xt_tryload tryload, /* Found library. If it didn't register itself, maybe they specified target as match. */ ptr = find_match(name, DONT_LOAD, NULL); + else if (stat(path, &sb) == 0) + fprintf(stderr, "%s: %s\n", path, dlerror()); 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); + else if (stat(path, &sb) == 0) + fprintf(stderr, "%s: %s\n", path, dlerror()); } if (ptr == NULL && tryload == LOAD_MUST_SUCCEED) @@ -395,6 +402,9 @@ struct xtables_match *find_match(const char *name, enum xt_tryload tryload, struct xtables_target *find_target(const char *name, enum xt_tryload tryload) { +#ifndef NO_SHARED_LIBS + struct stat sb; +#endif struct xtables_target *ptr; /* Standard target? */ @@ -420,12 +430,16 @@ struct xtables_target *find_target(const char *name, enum xt_tryload tryload) /* Found library. If it didn't register itself, maybe they specified match as a target. */ ptr = find_target(name, DONT_LOAD); + else if (stat(path, &sb) == 0) + fprintf(stderr, "%s: %s\n", path, dlerror()); 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); + else if (stat(path, &sb) == 0) + fprintf(stderr, "%s: %s\n", path, dlerror()); } if (ptr == NULL && tryload == LOAD_MUST_SUCCEED) exit_error(PARAMETER_PROBLEM, -- cgit v1.2.3