Gustavo Sverzut Barbieri | f85ae0d | 2011-12-19 21:23:45 -0200 | [diff] [blame] | 1 | #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 | |
| 11 | int 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 Barbieri | 674f859 | 2011-12-20 11:54:53 -0200 | [diff] [blame] | 83 | 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 Barbieri | f85ae0d | 2011-12-19 21:23:45 -0200 | [diff] [blame] | 101 | kmod_module_unref(mod); |
| 102 | module_error: |
| 103 | kmod_unref(ctx); |
| 104 | |
| 105 | return (err < 0) ? EXIT_FAILURE : EXIT_SUCCESS; |
| 106 | } |