Replace readdir_r with readdir
[platform/upstream/ltrace.git] / output.c
index cc45e52..b63befe 100644 (file)
--- a/output.c
+++ b/output.c
@@ -197,6 +197,28 @@ snip_period(char *buf)
        }
 }
 
+struct lookup_prototype_alias_context
+{
+       struct library *lib;
+       struct prototype *result; // output
+};
+static enum callback_status
+lookup_prototype_alias_cb(const char *name, void *data)
+{
+       struct lookup_prototype_alias_context *context =
+               (struct lookup_prototype_alias_context*)data;
+
+       struct library *lib = context->lib;
+
+       context->result =
+               protolib_lookup_prototype(lib->protolib, name,
+                                         lib->type != LT_LIBTYPE_SYSCALL);
+       if (context->result != NULL)
+               return CBS_STOP;
+
+       return CBS_CONT;
+}
+
 static struct prototype *
 library_get_prototype(struct library *lib, const char *name)
 {
@@ -214,16 +236,18 @@ library_get_prototype(struct library *lib, const char *name)
                         && snip_period(buf));
 
 #if defined(HAVE_LIBDW)
-               // DWARF data fills in the gaps in the .conf files, so I don't check for
-               // lib->protolib==NULL here
-               if (lib->dwfl != NULL &&
-                       (filter_matches_library(options.plt_filter,    lib ) ||
-                        filter_matches_library(options.static_filter, lib ) ||
-                        filter_matches_library(options.export_filter, lib )))
+               // DWARF data fills in the gaps in the .conf files, so I don't
+               // check for lib->protolib==NULL here
+               if (lib->dwfl_module != NULL &&
+                   (filter_matches_library(options.plt_filter,    lib ) ||
+                    filter_matches_library(options.static_filter, lib ) ||
+                    filter_matches_library(options.export_filter, lib )))
                        import_DWARF_prototypes(lib);
                else
-                       debug(DEBUG_FUNCTION, "Filter didn't match prototype '%s' in lib '%s'. Not importing",
-                                 name, lib->soname);
+                       debug(DEBUG_FUNCTION,
+                             "Filter didn't match prototype '%s' in lib '%s'. "
+                             "Not importing",
+                             name, lib->soname);
 #endif
 
                if (lib->protolib == NULL)
@@ -233,8 +257,21 @@ library_get_prototype(struct library *lib, const char *name)
        if (lib->protolib == NULL)
                return NULL;
 
-       return protolib_lookup_prototype(lib->protolib, name,
-                                        lib->type != LT_LIBTYPE_SYSCALL);
+       struct prototype *result =
+               protolib_lookup_prototype(lib->protolib, name,
+                                         lib->type != LT_LIBTYPE_SYSCALL);
+       if (result != NULL)
+               return result;
+
+       // prototype not found. Is it aliased?
+       struct lookup_prototype_alias_context context = {.lib = lib,
+                                                        .result = NULL};
+       library_exported_names_each_alias(&lib->exported_names, name,
+                                         NULL, lookup_prototype_alias_cb,
+                                         &context);
+
+       // if found, the prototype is stored here, otherwise it's NULL
+       return context.result;
 }
 
 struct find_proto_data {