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