t_modcmd.c revision 1.2.2.2 1 1.2.2.2 jym /* $NetBSD: t_modcmd.c,v 1.2.2.2 2009/05/13 19:19:34 jym Exp $ */
2 1.2.2.2 jym
3 1.2.2.2 jym /*
4 1.2.2.2 jym * Copyright (c) 2009 The NetBSD Foundation, Inc.
5 1.2.2.2 jym * All rights reserved.
6 1.2.2.2 jym *
7 1.2.2.2 jym * Redistribution and use in source and binary forms, with or without
8 1.2.2.2 jym * modification, are permitted provided that the following conditions
9 1.2.2.2 jym * are met:
10 1.2.2.2 jym * 1. Redistributions of source code must retain the above copyright
11 1.2.2.2 jym * notice, this list of conditions and the following disclaimer.
12 1.2.2.2 jym * 2. Redistributions in binary form must reproduce the above copyright
13 1.2.2.2 jym * notice, this list of conditions and the following disclaimer in the
14 1.2.2.2 jym * documentation and/or other materials provided with the distribution.
15 1.2.2.2 jym *
16 1.2.2.2 jym * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17 1.2.2.2 jym * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 1.2.2.2 jym * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 1.2.2.2 jym * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 1.2.2.2 jym * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21 1.2.2.2 jym * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 1.2.2.2 jym * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23 1.2.2.2 jym * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 1.2.2.2 jym * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 1.2.2.2 jym * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26 1.2.2.2 jym * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 1.2.2.2 jym * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 1.2.2.2 jym */
29 1.2.2.2 jym
30 1.2.2.2 jym #include <sys/types.h>
31 1.2.2.2 jym #include <sys/mount.h>
32 1.2.2.2 jym
33 1.2.2.2 jym #include <rump/rump.h>
34 1.2.2.2 jym #include <rump/rump_syscalls.h>
35 1.2.2.2 jym
36 1.2.2.2 jym #include <fs/tmpfs/tmpfs_args.h>
37 1.2.2.2 jym
38 1.2.2.2 jym #include <atf-c.h>
39 1.2.2.2 jym #include <dlfcn.h>
40 1.2.2.2 jym #include <err.h>
41 1.2.2.2 jym #include <errno.h>
42 1.2.2.2 jym #include <stdio.h>
43 1.2.2.2 jym #include <stdlib.h>
44 1.2.2.2 jym #include <string.h>
45 1.2.2.2 jym #include <unistd.h>
46 1.2.2.2 jym #include <util.h>
47 1.2.2.2 jym
48 1.2.2.2 jym #include "../../h_macros.h"
49 1.2.2.2 jym
50 1.2.2.2 jym /*
51 1.2.2.2 jym * We verify that modules can be loaded and unloaded.
52 1.2.2.2 jym * tmpfs was chosen because it does not depend on an image.
53 1.2.2.2 jym */
54 1.2.2.2 jym
55 1.2.2.2 jym ATF_TC(cmsg_modcmd);
56 1.2.2.2 jym ATF_TC_HEAD(cmsg_modcmd, tc)
57 1.2.2.2 jym {
58 1.2.2.2 jym atf_tc_set_md_var(tc, "descr", "Checks that loading and unloading "
59 1.2.2.2 jym "a module (vfs/tmpfs) is possible");
60 1.2.2.2 jym }
61 1.2.2.2 jym
62 1.2.2.2 jym #define TMPFSMODULE "librumpfs_tmpfs.so"
63 1.2.2.2 jym ATF_TC_BODY(cmsg_modcmd, tc)
64 1.2.2.2 jym {
65 1.2.2.2 jym struct tmpfs_args args;
66 1.2.2.2 jym struct modinfo **mi;
67 1.2.2.2 jym void *handle;
68 1.2.2.2 jym int rv;
69 1.2.2.2 jym
70 1.2.2.2 jym rump_init();
71 1.2.2.2 jym memset(&args, 0, sizeof(args));
72 1.2.2.2 jym args.ta_version = TMPFS_ARGS_VERSION;
73 1.2.2.2 jym args.ta_root_mode = 0777;
74 1.2.2.2 jym
75 1.2.2.2 jym if (rump_sys_mkdir("/mp", 0777) == -1)
76 1.2.2.2 jym atf_tc_fail_errno("mkdir mountpoint");
77 1.2.2.2 jym if (rump_sys_mount(MOUNT_TMPFS, "/mp", 0, &args, sizeof(args)) != -1)
78 1.2.2.2 jym atf_tc_fail("mount unexpectedly succeeded");
79 1.2.2.2 jym
80 1.2.2.2 jym handle = dlopen(TMPFSMODULE, RTLD_GLOBAL);
81 1.2.2.2 jym if (handle == NULL) {
82 1.2.2.2 jym const char *dlmsg = dlerror();
83 1.2.2.2 jym atf_tc_fail("cannot open %s: %s", TMPFSMODULE, dlmsg);
84 1.2.2.2 jym }
85 1.2.2.2 jym mi = dlsym(handle, "__start_link_set_modules");
86 1.2.2.2 jym if (mi == NULL)
87 1.2.2.2 jym atf_tc_fail("cannot find module info");
88 1.2.2.2 jym if ((rv = rump_module_init(*mi, NULL)) != 0)
89 1.2.2.2 jym atf_tc_fail("module init failed: %d (%s)", rv, strerror(rv));
90 1.2.2.2 jym
91 1.2.2.2 jym if (rump_sys_mount(MOUNT_TMPFS, "/mp", 0, &args, sizeof(args)) == -1)
92 1.2.2.2 jym atf_tc_fail_errno("still cannot mount");
93 1.2.2.2 jym if (rump_sys_unmount("/mp", 0) == -1)
94 1.2.2.2 jym atf_tc_fail("cannot unmount");
95 1.2.2.2 jym if ((rv = rump_module_fini(*mi)) != 0)
96 1.2.2.2 jym atf_tc_fail("module fini failed: %d (%s)", rv, strerror(rv));
97 1.2.2.2 jym if (dlclose(handle)) {
98 1.2.2.2 jym const char *dlmsg = dlerror();
99 1.2.2.2 jym atf_tc_fail("cannot close %s: %s", TMPFSMODULE, dlmsg);
100 1.2.2.2 jym }
101 1.2.2.2 jym
102 1.2.2.2 jym if (rump_sys_mount(MOUNT_TMPFS, "/mp", 0, &args, sizeof(args)) != -1)
103 1.2.2.2 jym atf_tc_fail("mount unexpectedly succeeded");
104 1.2.2.2 jym }
105 1.2.2.2 jym
106 1.2.2.2 jym ATF_TP_ADD_TCS(tp)
107 1.2.2.2 jym {
108 1.2.2.2 jym ATF_TP_ADD_TC(tp, cmsg_modcmd);
109 1.2.2.2 jym }
110