Home | History | Annotate | Download | only in testsuite
      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 
     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