• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011-2013  ProFUSION embedded systems
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include <errno.h>
19 #include <inttypes.h>
20 #include <stddef.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <unistd.h>
25 
26 #include <shared/util.h>
27 
28 #include <libkmod/libkmod.h>
29 
30 /* good luck bulding a kmod_list outside of the library... makes this blacklist
31  * function rather pointless */
32 #include <libkmod/libkmod-internal.h>
33 
34 /* FIXME: hack, change name so we don't clash */
35 #undef ERR
36 #include "testsuite.h"
37 
blacklist_1(const struct test * t)38 static int blacklist_1(const struct test *t)
39 {
40 	struct kmod_ctx *ctx;
41 	struct kmod_list *list = NULL, *l, *filtered;
42 	struct kmod_module *mod;
43 	int err;
44 	size_t len = 0;
45 
46 	const char *names[] = { "pcspkr", "pcspkr2", "floppy", "ext4", NULL };
47 	const char **name;
48 
49 	ctx = kmod_new(NULL, NULL);
50 	if (ctx == NULL)
51 		exit(EXIT_FAILURE);
52 
53 	for(name = names; *name; name++) {
54 		err = kmod_module_new_from_name(ctx, *name, &mod);
55 		if (err < 0)
56 			goto fail_lookup;
57 		list = kmod_list_append(list, mod);
58 	}
59 
60 	err = kmod_module_apply_filter(ctx, KMOD_FILTER_BLACKLIST, list,
61 								&filtered);
62 	if (err < 0) {
63 		ERR("Could not filter: %s\n", strerror(-err));
64 		goto fail;
65 	}
66 	if (filtered == NULL) {
67 		ERR("All modules were filtered out!\n");
68 		goto fail;
69 	}
70 
71 	kmod_list_foreach(l, filtered) {
72 		const char *modname;
73 		mod = kmod_module_get_module(l);
74 		modname = kmod_module_get_name(mod);
75 		if (streq("pcspkr", modname) || streq("floppy", modname))
76 			goto fail;
77 		len++;
78 		kmod_module_unref(mod);
79 	}
80 
81 	if (len != 2)
82 		goto fail;
83 
84 	kmod_module_unref_list(filtered);
85 	kmod_module_unref_list(list);
86 	kmod_unref(ctx);
87 
88 	return EXIT_SUCCESS;
89 
90 fail:
91 	kmod_module_unref_list(list);
92 fail_lookup:
93 	kmod_unref(ctx);
94 	return EXIT_FAILURE;
95 }
96 
97 DEFINE_TEST(blacklist_1,
98 	.description = "check if modules are correctly blacklisted",
99 	.config = {
100 		[TC_ROOTFS] = TESTSUITE_ROOTFS "test-blacklist/",
101 	},
102 	.need_spawn = true,
103 );
104 
105 TESTSUITE_MAIN();
106