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