1e701e381faac8977f472b881d426335b869998dcLucas De Marchi/* 2e6b0e49b4ea7937a98b16f23d621244ee1a3e588Lucas De Marchi * Copyright (C) 2012-2013 ProFUSION embedded systems 3e701e381faac8977f472b881d426335b869998dcLucas De Marchi * 4e1b1ab24ab7b690343dbddd8087b17f6d722327cLucas De Marchi * This program is free software; you can redistribute it and/or 5e1b1ab24ab7b690343dbddd8087b17f6d722327cLucas De Marchi * modify it under the terms of the GNU Lesser General Public 6e1b1ab24ab7b690343dbddd8087b17f6d722327cLucas De Marchi * License as published by the Free Software Foundation; either 7e1b1ab24ab7b690343dbddd8087b17f6d722327cLucas De Marchi * version 2.1 of the License, or (at your option) any later version. 8e701e381faac8977f472b881d426335b869998dcLucas De Marchi * 9e701e381faac8977f472b881d426335b869998dcLucas De Marchi * This program is distributed in the hope that it will be useful, 10e701e381faac8977f472b881d426335b869998dcLucas De Marchi * but WITHOUT ANY WARRANTY; without even the implied warranty of 11e1b1ab24ab7b690343dbddd8087b17f6d722327cLucas De Marchi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12e1b1ab24ab7b690343dbddd8087b17f6d722327cLucas De Marchi * Lesser General Public License for more details. 13e701e381faac8977f472b881d426335b869998dcLucas De Marchi * 14e1b1ab24ab7b690343dbddd8087b17f6d722327cLucas De Marchi * You should have received a copy of the GNU Lesser General Public 15dea2dfee9b301da84dbb09cf510b8ebf2ef28fffLucas De Marchi * License along with this library; if not, see <http://www.gnu.org/licenses/>. 16e701e381faac8977f472b881d426335b869998dcLucas De Marchi */ 17e701e381faac8977f472b881d426335b869998dcLucas De Marchi 1861e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi#include <errno.h> 1961e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi#include <inttypes.h> 20c2e4286bb98c6bec77575ac0c6f862e7ddf6394fLucas De Marchi#include <stddef.h> 21c2e4286bb98c6bec77575ac0c6f862e7ddf6394fLucas De Marchi#include <stdio.h> 22c2e4286bb98c6bec77575ac0c6f862e7ddf6394fLucas De Marchi#include <stdlib.h> 2361e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi#include <string.h> 24c2e4286bb98c6bec77575ac0c6f862e7ddf6394fLucas De Marchi#include <unistd.h> 25c2e4286bb98c6bec77575ac0c6f862e7ddf6394fLucas De Marchi 26f357866d97995e30c0ad623880d28dc527ff6890Lucas De Marchi#include <libkmod/libkmod.h> 2761e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 2861e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi#include "testsuite.h" 2961e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 3061e9433f7c0349486385a084651decc34c52dae4Lucas De Marchistatic int loaded_1(const struct test *t) 3161e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi{ 3261e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi struct kmod_ctx *ctx; 3361e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi const char *null_config = NULL; 3461e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi struct kmod_list *list, *itr; 3561e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi int err; 3661e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 3761e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi ctx = kmod_new(NULL, &null_config); 3861e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi if (ctx == NULL) 3961e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi exit(EXIT_FAILURE); 4061e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 4161e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi err = kmod_module_new_from_loaded(ctx, &list); 4261e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi if (err < 0) { 4361e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi fprintf(stderr, "%s\n", strerror(-err)); 4461e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_unref(ctx); 4561e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi exit(EXIT_FAILURE); 4661e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi } 4761e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 4861e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi printf("Module Size Used by\n"); 4961e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 5061e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_list_foreach(itr, list) { 5161e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi struct kmod_module *mod = kmod_module_get_module(itr); 5261e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi const char *name = kmod_module_get_name(mod); 5361e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi int use_count = kmod_module_get_refcnt(mod); 5461e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi long size = kmod_module_get_size(mod); 5561e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi struct kmod_list *holders, *hitr; 5661e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi int first = 1; 5761e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 5861e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi printf("%-19s %8ld %d ", name, size, use_count); 5961e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi holders = kmod_module_get_holders(mod); 6061e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_list_foreach(hitr, holders) { 6161e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi struct kmod_module *hm = kmod_module_get_module(hitr); 6261e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 6361e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi if (!first) 6461e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi putchar(','); 6561e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi else 6661e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi first = 0; 6761e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 6861e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi fputs(kmod_module_get_name(hm), stdout); 6961e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_module_unref(hm); 7061e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi } 7161e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi putchar('\n'); 7261e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_module_unref_list(holders); 7361e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_module_unref(mod); 7461e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi } 7561e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_module_unref_list(list); 7661e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 7761e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi kmod_unref(ctx); 7861e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 7961e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi return EXIT_SUCCESS; 8061e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi} 81f1155c1574b07c1e63cc6a06d51b32bc44bebcc3Lucas De MarchiDEFINE_TEST(loaded_1, 8261e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi .description = "check if list of module is created", 8361e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi .config = { 8461e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi [TC_ROOTFS] = TESTSUITE_ROOTFS "test-loaded/", 8561e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi }, 8661e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi .need_spawn = true, 8761e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi .output = { 88bd4e7340bcd9f95e04a6309667ffe1a5427edcaaJohn Spencer .out = TESTSUITE_ROOTFS "test-loaded/correct.txt", 89c5d81989bc09cf735e3d7bd4e74381b4fe65ffadLucas De Marchi }); 9061e9433f7c0349486385a084651decc34c52dae4Lucas De Marchi 914328982058bd6840518ff552a0405bf8f9d73909Lucas De MarchiTESTSUITE_MAIN(); 92