1 1.8 kre /* $NetBSD: t_ro.c,v 1.8 2019/09/21 14:25:42 kre Exp $ */ 2 1.1 pooka 3 1.1 pooka /*- 4 1.1 pooka * Copyright (c) 2010 The NetBSD Foundation, Inc. 5 1.1 pooka * All rights reserved. 6 1.1 pooka * 7 1.1 pooka * Redistribution and use in source and binary forms, with or without 8 1.1 pooka * modification, are permitted provided that the following conditions 9 1.1 pooka * are met: 10 1.1 pooka * 1. Redistributions of source code must retain the above copyright 11 1.1 pooka * notice, this list of conditions and the following disclaimer. 12 1.1 pooka * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 pooka * notice, this list of conditions and the following disclaimer in the 14 1.1 pooka * documentation and/or other materials provided with the distribution. 15 1.1 pooka * 16 1.1 pooka * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 pooka * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 pooka * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 pooka * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 pooka * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 pooka * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 pooka * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 pooka * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 pooka * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 pooka * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 pooka * POSSIBILITY OF SUCH DAMAGE. 27 1.1 pooka */ 28 1.1 pooka 29 1.1 pooka #include <sys/stat.h> 30 1.1 pooka #include <sys/statvfs.h> 31 1.1 pooka 32 1.1 pooka #include <atf-c.h> 33 1.1 pooka #include <fcntl.h> 34 1.1 pooka #include <libgen.h> 35 1.1 pooka #include <stdlib.h> 36 1.1 pooka #include <unistd.h> 37 1.1 pooka 38 1.1 pooka #include <rump/rump_syscalls.h> 39 1.1 pooka #include <rump/rump.h> 40 1.1 pooka 41 1.1 pooka #include "../common/h_fsmacros.h" 42 1.6 christos #include "h_macros.h" 43 1.1 pooka 44 1.1 pooka #define AFILE "testfile" 45 1.5 yamt #define ADIR "testdir" 46 1.5 yamt #define AFIFO "testfifo" 47 1.5 yamt #define ASYMLINK "testsymlink" 48 1.5 yamt #define ALINK "testlink" 49 1.1 pooka #define FUNTEXT "this is some non-humppa text" 50 1.1 pooka #define FUNSIZE (sizeof(FUNTEXT)-1) 51 1.1 pooka 52 1.1 pooka static void 53 1.1 pooka nullgen(const atf_tc_t *tc, const char *mp) 54 1.1 pooka { 55 1.1 pooka 56 1.1 pooka return; 57 1.1 pooka } 58 1.1 pooka 59 1.1 pooka static void 60 1.1 pooka filegen(const atf_tc_t *tc, const char *mp) 61 1.1 pooka { 62 1.1 pooka int fd; 63 1.1 pooka 64 1.1 pooka FSTEST_ENTER(); 65 1.1 pooka RL(fd = rump_sys_open(AFILE, O_CREAT | O_RDWR, 0777)); 66 1.1 pooka ATF_REQUIRE_EQ(rump_sys_write(fd, FUNTEXT, FUNSIZE), FUNSIZE); 67 1.1 pooka RL(rump_sys_close(fd)); 68 1.1 pooka FSTEST_EXIT(); 69 1.1 pooka } 70 1.1 pooka 71 1.1 pooka /* 72 1.1 pooka * 73 1.1 pooka * BEGIN tests 74 1.1 pooka * 75 1.1 pooka */ 76 1.1 pooka 77 1.1 pooka static void 78 1.1 pooka create(const atf_tc_t *tc, const char *mp) 79 1.1 pooka { 80 1.1 pooka 81 1.1 pooka FSTEST_ENTER(); 82 1.7 martin ATF_REQUIRE_ERRNO(EROFS, rump_sys_open(AFILE, O_CREAT|O_RDONLY, 83 1.7 martin 0600) == -1); 84 1.1 pooka FSTEST_EXIT(); 85 1.1 pooka } 86 1.1 pooka 87 1.1 pooka static void 88 1.1 pooka rmfile(const atf_tc_t *tc, const char *mp) 89 1.1 pooka { 90 1.1 pooka 91 1.1 pooka FSTEST_ENTER(); 92 1.1 pooka ATF_REQUIRE_ERRNO(EROFS, rump_sys_unlink(AFILE) == -1); 93 1.1 pooka FSTEST_EXIT(); 94 1.1 pooka } 95 1.1 pooka 96 1.1 pooka static void 97 1.1 pooka fileio(const atf_tc_t *tc, const char *mp) 98 1.1 pooka { 99 1.1 pooka int fd; 100 1.1 pooka char buf[FUNSIZE+1]; 101 1.3 pooka int expected; 102 1.3 pooka 103 1.3 pooka if (FSTYPE_NFSRO(tc)) 104 1.3 pooka expected = EACCES; 105 1.3 pooka else 106 1.3 pooka expected = EROFS; 107 1.1 pooka 108 1.1 pooka FSTEST_ENTER(); 109 1.1 pooka RL(fd = rump_sys_open(AFILE, O_RDONLY)); 110 1.1 pooka ATF_REQUIRE_EQ(rump_sys_read(fd, buf, FUNSIZE), FUNSIZE); 111 1.1 pooka buf[FUNSIZE] = '\0'; 112 1.1 pooka ATF_REQUIRE_STREQ(buf, FUNTEXT); 113 1.1 pooka RL(rump_sys_close(fd)); 114 1.1 pooka 115 1.3 pooka ATF_REQUIRE_ERRNO(expected, rump_sys_open(AFILE, O_WRONLY) == -1); 116 1.3 pooka ATF_REQUIRE_ERRNO(expected, rump_sys_open(AFILE, O_RDWR) == -1); 117 1.1 pooka FSTEST_EXIT(); 118 1.1 pooka } 119 1.1 pooka 120 1.1 pooka static void 121 1.1 pooka attrs(const atf_tc_t *tc, const char *mp) 122 1.1 pooka { 123 1.8 kre struct timeval sometvs[2] = { {0,0}, {0,0} }; 124 1.1 pooka struct stat sb; 125 1.1 pooka int fd; 126 1.1 pooka 127 1.1 pooka FSTEST_ENTER(); 128 1.1 pooka 129 1.1 pooka RL(rump_sys_stat(AFILE, &sb)); 130 1.1 pooka 131 1.1 pooka ATF_REQUIRE_ERRNO(EROFS, rump_sys_chmod(AFILE, 0775) == -1); 132 1.1 pooka if (!FSTYPE_MSDOS(tc)) 133 1.1 pooka ATF_REQUIRE_ERRNO(EROFS, rump_sys_chown(AFILE, 1, 1) == -1); 134 1.1 pooka ATF_REQUIRE_ERRNO(EROFS, rump_sys_utimes(AFILE, sometvs) == -1); 135 1.1 pooka 136 1.1 pooka RL(fd = rump_sys_open(AFILE, O_RDONLY)); 137 1.1 pooka ATF_REQUIRE_ERRNO(EROFS, rump_sys_fchmod(fd, 0775) == -1); 138 1.1 pooka if (!FSTYPE_MSDOS(tc)) 139 1.1 pooka ATF_REQUIRE_ERRNO(EROFS, rump_sys_fchown(fd, 1, 1) == -1); 140 1.1 pooka ATF_REQUIRE_ERRNO(EROFS, rump_sys_futimes(fd, sometvs) == -1); 141 1.1 pooka RL(rump_sys_close(fd)); 142 1.1 pooka 143 1.1 pooka FSTEST_EXIT(); 144 1.1 pooka } 145 1.1 pooka 146 1.5 yamt static void 147 1.5 yamt createdir(const atf_tc_t *tc, const char *mp) 148 1.5 yamt { 149 1.5 yamt 150 1.5 yamt FSTEST_ENTER(); 151 1.5 yamt ATF_REQUIRE_ERRNO(EROFS, rump_sys_mkdir(ADIR, 0775) == -1); 152 1.5 yamt FSTEST_EXIT(); 153 1.5 yamt } 154 1.5 yamt 155 1.5 yamt static void 156 1.5 yamt createfifo(const atf_tc_t *tc, const char *mp) 157 1.5 yamt { 158 1.5 yamt 159 1.5 yamt FSTEST_ENTER(); 160 1.5 yamt ATF_REQUIRE_ERRNO(EROFS, rump_sys_mkfifo(AFIFO, 0775) == -1); 161 1.5 yamt FSTEST_EXIT(); 162 1.5 yamt } 163 1.5 yamt 164 1.5 yamt static void 165 1.5 yamt createsymlink(const atf_tc_t *tc, const char *mp) 166 1.5 yamt { 167 1.5 yamt 168 1.5 yamt FSTEST_ENTER(); 169 1.5 yamt ATF_REQUIRE_ERRNO(EROFS, rump_sys_symlink("hoge", ASYMLINK) == -1); 170 1.5 yamt FSTEST_EXIT(); 171 1.5 yamt } 172 1.5 yamt 173 1.5 yamt static void 174 1.5 yamt createlink(const atf_tc_t *tc, const char *mp) 175 1.5 yamt { 176 1.5 yamt 177 1.5 yamt FSTEST_ENTER(); 178 1.5 yamt ATF_REQUIRE_ERRNO(EROFS, rump_sys_link(AFILE, ALINK) == -1); 179 1.5 yamt FSTEST_EXIT(); 180 1.5 yamt } 181 1.5 yamt 182 1.1 pooka ATF_TC_FSAPPLY_RO(create, "create file on r/o mount", nullgen); 183 1.1 pooka ATF_TC_FSAPPLY_RO(rmfile, "remove file from r/o mount", filegen); 184 1.1 pooka ATF_TC_FSAPPLY_RO(fileio, "can read a file but not write it", filegen); 185 1.1 pooka ATF_TC_FSAPPLY_RO(attrs, "can query but not change attributes", filegen); 186 1.5 yamt ATF_TC_FSAPPLY_RO(createdir, "create directory on r/o mount", nullgen); 187 1.5 yamt ATF_TC_FSAPPLY_RO(createfifo, "create fifo on r/o mount", nullgen); 188 1.5 yamt ATF_TC_FSAPPLY_RO(createsymlink, "create symlink on r/o mount", nullgen); 189 1.5 yamt ATF_TC_FSAPPLY_RO(createlink, "create hardlink on r/o mount", filegen); 190 1.1 pooka 191 1.1 pooka ATF_TP_ADD_TCS(tp) 192 1.1 pooka { 193 1.1 pooka 194 1.1 pooka ATF_TP_FSAPPLY_RO(create); 195 1.1 pooka ATF_TP_FSAPPLY_RO(rmfile); 196 1.1 pooka ATF_TP_FSAPPLY_RO(fileio); 197 1.1 pooka ATF_TP_FSAPPLY_RO(attrs); 198 1.5 yamt ATF_TP_FSAPPLY_RO(createdir); 199 1.5 yamt ATF_TP_FSAPPLY_RO(createfifo); 200 1.5 yamt ATF_TP_FSAPPLY_RO(createsymlink); 201 1.5 yamt ATF_TP_FSAPPLY_RO(createlink); 202 1.1 pooka 203 1.1 pooka return atf_no_error(); 204 1.1 pooka } 205