blob: 23dd1fd4db60122fe07f69d07eb5e00983123b5b [file] [log] [blame]
Gustavo Sverzut Barbierif85ae0d2011-12-19 21:23:45 -02001#include <stdio.h>
2#include <stdlib.h>
3#include <stddef.h>
4#include <errno.h>
5#include <unistd.h>
6#include <inttypes.h>
7#include <string.h>
8#include <libkmod.h>
9#include <getopt.h>
10
11int main(int argc, char *argv[])
12{
13 struct kmod_ctx *ctx;
14 struct kmod_module *mod;
15 struct kmod_list *list, *l;
16 int err;
17
18 printf("libkmod version %s\n", VERSION);
19
20 if (argc != 2) {
21 fprintf(stderr, "Usage:\n\t%s <module-path.ko>\n", argv[0]);
22 return EXIT_FAILURE;
23 }
24
25 ctx = kmod_new(NULL, NULL);
26 if (ctx == NULL)
27 return EXIT_FAILURE;
28
29 err = kmod_module_new_from_path(ctx, argv[1], &mod);
30 if (err < 0) {
31 fprintf(stderr, "ERROR: could not load %s: %s\n",
32 argv[1], strerror(-errno));
33 goto module_error;
34 }
35
36 list = NULL;
37 err = kmod_module_get_info(mod, &list);
38 if (err <= 0)
39 printf("no information! (%s)\n", strerror(-err));
40 else {
41 puts("info:");
42 kmod_list_foreach(l, list) {
43 const char *key, *val;
44 key = kmod_module_info_get_key(l);
45 val = kmod_module_info_get_value(l);
46 printf("\t%s: %s\n", key, val ? val : "");
47 }
48 kmod_module_info_free_list(list);
49 }
50
51 list = NULL;
52 err = kmod_module_get_versions(mod, &list);
53 if (err <= 0)
54 printf("no modversions! (%s)\n", strerror(-err));
55 else {
56 puts("modversions:");
57 kmod_list_foreach(l, list) {
58 const char *symbol;
59 uint64_t crc;
60 symbol = kmod_module_version_get_symbol(l);
61 crc = kmod_module_version_get_crc(l);
62 printf("\t%s: %#"PRIx64"\n", symbol, crc);
63 }
64 kmod_module_versions_free_list(list);
65 }
66
67 list = NULL;
68 err = kmod_module_get_symbols(mod, &list);
69 if (err <= 0)
70 printf("no symbols! (%s)\n", strerror(-err));
71 else {
72 puts("symbols:");
73 kmod_list_foreach(l, list) {
74 const char *symbol;
75 uint64_t crc;
76 symbol = kmod_module_symbol_get_symbol(l);
77 crc = kmod_module_symbol_get_crc(l);
78 printf("\t%s: %#"PRIx64"\n", symbol, crc);
79 }
80 kmod_module_symbols_free_list(list);
81 }
82
Gustavo Sverzut Barbieri674f8592011-12-20 11:54:53 -020083 list = NULL;
84 err = kmod_module_get_dependency_symbols(mod, &list);
85 if (err <= 0)
86 printf("no dependency symbols! (%s)\n", strerror(-err));
87 else {
88 puts("dependency symbols:");
89 kmod_list_foreach(l, list) {
90 const char *symbol;
91 uint8_t bind;
92 uint64_t crc;
93 symbol = kmod_module_dependency_symbol_get_symbol(l);
94 bind = kmod_module_dependency_symbol_get_bind(l);
95 crc = kmod_module_dependency_symbol_get_crc(l);
96 printf("\t%s %c: %#"PRIx64"\n", symbol, bind, crc);
97 }
98 kmod_module_dependency_symbols_free_list(list);
99 }
100
Gustavo Sverzut Barbierif85ae0d2011-12-19 21:23:45 -0200101 kmod_module_unref(mod);
102module_error:
103 kmod_unref(ctx);
104
105 return (err < 0) ? EXIT_FAILURE : EXIT_SUCCESS;
106}