Skip to content
Snippets Groups Projects

Add inspect-library helper

Merged Ludovico de Nittis requested to merge wip/denittis/inspect-library into master
Compare and Show latest version
5 files
+ 381
38
Compare changes
  • Side-by-side
  • Inline
Files
5
+ 90
28
@@ -44,6 +44,7 @@
static void print_json_string_content (const char *s);
static void clean_exit (void *handle);
static void free_pointer_array (char *to_clean[]);
int
main (int argc,
@@ -60,6 +61,8 @@ main (int argc,
char *r = NULL;
size_t len = 0;
ssize_t chars;
int lines = 0;
int ch;
bool first;
if (argc < 2 || argc > 3)
@@ -90,9 +93,8 @@ main (int argc,
}
printf ("\n \"path\": \"");
print_json_string_content (the_library->l_name);
printf ("\",\n");
printf ("\"");
printf (" \"missing_symbols\": [");
if (argc == 3)
{
fp = fopen(argv[2], "r");
@@ -101,12 +103,24 @@ main (int argc,
int saved_errno = errno;
fprintf (stderr, "Error reading \"%s\": %s\n", argv[2], strerror (saved_errno));
printf ("\n ]");
clean_exit (handle);
return 1;
}
first = true;
while ((ch = fgetc(fp)) != EOF)
{
if (ch == '\n')
lines++;
}
// Otherwise we miss the last one before EOF.
lines++;
rewind (fp);
char *missing_symbols[lines+1];
char *unexpected_version[lines+1];
int missing_n = 0;
int unexpected_n = 0;
while ((chars = getline(&line, &len, fp)) != -1)
{
if (line[chars - 1] == '\n')
@@ -121,8 +135,11 @@ main (int argc,
if (symbol == NULL)
{
fprintf (stderr, "Probably the symbol@version pair is mispelled.");
printf ("\n ]");
free(r);
missing_symbols[missing_n] = NULL;
unexpected_version[unexpected_n] = NULL;
free (r);
free_pointer_array (missing_symbols);
free_pointer_array (unexpected_version);
clean_exit (handle);
return 1;
}
@@ -131,34 +148,44 @@ main (int argc,
{
if (dlsym (handle, symbol) == NULL)
{
if (first)
{
printf ("\n \"");
first = false;
}
else
printf (",\n \"");
print_json_string_content (symbol);
printf ("\"");
missing_symbols[missing_n] = strdup (symbol);
missing_n++;
}
}
else
{
if (dlvsym (handle, symbol, version) == NULL)
{
if (first)
if (dlsym (handle, symbol) != NULL)
{
printf ("\n \"");
first = false;
if (asprintf(&unexpected_version[unexpected_n], "%s@%s", symbol, version) == -1)
{
fprintf (stderr, "asprintf() failed for insufficient memory.\n");
missing_symbols[missing_n] = NULL;
unexpected_version[unexpected_n] = NULL;
free (r);
free_pointer_array (missing_symbols);
free_pointer_array (unexpected_version);
clean_exit (handle);
return 1;
}
unexpected_n++;
}
else
printf (",\n \"");
print_json_string_content (symbol);
printf ("@");
print_json_string_content (version);
printf ("\"");
{
if (asprintf(&missing_symbols[missing_n], "%s@%s", symbol, version) == -1)
{
fprintf (stderr, "asprintf() failed for insufficient memory.\n");
missing_symbols[missing_n] = NULL;
unexpected_version[unexpected_n] = NULL;
free (r);
free_pointer_array (missing_symbols);
free_pointer_array (unexpected_version);
clean_exit (handle);
return 1;
}
missing_n++;
}
}
}
free (r);
@@ -166,9 +193,37 @@ main (int argc,
}
free (line);
fclose (fp);
}
printf ("\n ]");
missing_symbols[missing_n] = NULL;
unexpected_version[unexpected_n] = NULL;
printf (",\n \"missing_symbols\": [");
for (int i = 0; i < missing_n; i++)
{
if (i > 0)
printf (",");
printf ("\n \"");
print_json_string_content (missing_symbols[i]);
printf ("\"");
}
printf ("\n ]");
printf (",\n \"unexpected_symbols_version\": [");
for (int i = 0; i < unexpected_n; i++)
{
if (i > 0)
printf (",");
printf ("\n \"");
print_json_string_content (unexpected_version[i]);
printf ("\"");
}
printf ("\n ],");
free_pointer_array (missing_symbols);
free_pointer_array (unexpected_version);
}
dep_map = the_library;
/* Some loaded libraries may be before our handle.
@@ -176,7 +231,7 @@ main (int argc,
while (dep_map != NULL && dep_map->l_prev != NULL)
dep_map = dep_map->l_prev;
printf (",\n \"dependencies\": [");
printf ("\n \"dependencies\": [");
first = true;
for (; dep_map != NULL; dep_map = dep_map->l_next)
{
@@ -215,6 +270,13 @@ print_json_string_content (const char *s)
}
}
void
free_pointer_array (char *to_clean[])
{
for (int i = 0; to_clean[i] != NULL; i++)
free (to_clean[i]);
}
void
clean_exit (void *handle)
{
Loading