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 38static 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 90fail: 91 kmod_module_unref_list(list); 92fail_lookup: 93 kmod_unref(ctx); 94 return EXIT_FAILURE; 95} 96 97DEFINE_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 105TESTSUITE_MAIN(); 106