xref: /netbsd-src/tests/fs/vfs/t_ro.c (revision f77bb6aeedb7722c882f2cb4bf9147556836cd38)
1*f77bb6aeSkre /*	$NetBSD: t_ro.c,v 1.8 2019/09/21 14:25:42 kre Exp $	*/
265748000Spooka 
365748000Spooka /*-
465748000Spooka  * Copyright (c) 2010 The NetBSD Foundation, Inc.
565748000Spooka  * All rights reserved.
665748000Spooka  *
765748000Spooka  * Redistribution and use in source and binary forms, with or without
865748000Spooka  * modification, are permitted provided that the following conditions
965748000Spooka  * are met:
1065748000Spooka  * 1. Redistributions of source code must retain the above copyright
1165748000Spooka  *    notice, this list of conditions and the following disclaimer.
1265748000Spooka  * 2. Redistributions in binary form must reproduce the above copyright
1365748000Spooka  *    notice, this list of conditions and the following disclaimer in the
1465748000Spooka  *    documentation and/or other materials provided with the distribution.
1565748000Spooka  *
1665748000Spooka  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1765748000Spooka  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1865748000Spooka  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1965748000Spooka  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2065748000Spooka  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2165748000Spooka  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2265748000Spooka  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2365748000Spooka  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2465748000Spooka  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2565748000Spooka  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2665748000Spooka  * POSSIBILITY OF SUCH DAMAGE.
2765748000Spooka  */
2865748000Spooka 
2965748000Spooka #include <sys/stat.h>
3065748000Spooka #include <sys/statvfs.h>
3165748000Spooka 
3265748000Spooka #include <atf-c.h>
3365748000Spooka #include <fcntl.h>
3465748000Spooka #include <libgen.h>
3565748000Spooka #include <stdlib.h>
3665748000Spooka #include <unistd.h>
3765748000Spooka 
3865748000Spooka #include <rump/rump_syscalls.h>
3965748000Spooka #include <rump/rump.h>
4065748000Spooka 
4165748000Spooka #include "../common/h_fsmacros.h"
42c54cb811Schristos #include "h_macros.h"
4365748000Spooka 
4465748000Spooka #define AFILE "testfile"
450aabb924Syamt #define ADIR "testdir"
460aabb924Syamt #define AFIFO "testfifo"
470aabb924Syamt #define ASYMLINK "testsymlink"
480aabb924Syamt #define ALINK "testlink"
4965748000Spooka #define FUNTEXT "this is some non-humppa text"
5065748000Spooka #define FUNSIZE (sizeof(FUNTEXT)-1)
5165748000Spooka 
5265748000Spooka static void
nullgen(const atf_tc_t * tc,const char * mp)5365748000Spooka nullgen(const atf_tc_t *tc, const char *mp)
5465748000Spooka {
5565748000Spooka 
5665748000Spooka 	return;
5765748000Spooka }
5865748000Spooka 
5965748000Spooka static void
filegen(const atf_tc_t * tc,const char * mp)6065748000Spooka filegen(const atf_tc_t *tc, const char *mp)
6165748000Spooka {
6265748000Spooka 	int fd;
6365748000Spooka 
6465748000Spooka 	FSTEST_ENTER();
6565748000Spooka 	RL(fd = rump_sys_open(AFILE, O_CREAT | O_RDWR, 0777));
6665748000Spooka 	ATF_REQUIRE_EQ(rump_sys_write(fd, FUNTEXT, FUNSIZE), FUNSIZE);
6765748000Spooka 	RL(rump_sys_close(fd));
6865748000Spooka 	FSTEST_EXIT();
6965748000Spooka }
7065748000Spooka 
7165748000Spooka /*
7265748000Spooka  *
7365748000Spooka  * BEGIN tests
7465748000Spooka  *
7565748000Spooka  */
7665748000Spooka 
7765748000Spooka static void
create(const atf_tc_t * tc,const char * mp)7865748000Spooka create(const atf_tc_t *tc, const char *mp)
7965748000Spooka {
8065748000Spooka 
8165748000Spooka 	FSTEST_ENTER();
82653f037eSmartin 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_open(AFILE, O_CREAT|O_RDONLY,
83653f037eSmartin 	    0600) == -1);
8465748000Spooka 	FSTEST_EXIT();
8565748000Spooka }
8665748000Spooka 
8765748000Spooka static void
rmfile(const atf_tc_t * tc,const char * mp)8865748000Spooka rmfile(const atf_tc_t *tc, const char *mp)
8965748000Spooka {
9065748000Spooka 
9165748000Spooka 	FSTEST_ENTER();
9265748000Spooka 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_unlink(AFILE) == -1);
9365748000Spooka 	FSTEST_EXIT();
9465748000Spooka }
9565748000Spooka 
9665748000Spooka static void
fileio(const atf_tc_t * tc,const char * mp)9765748000Spooka fileio(const atf_tc_t *tc, const char *mp)
9865748000Spooka {
9965748000Spooka 	int fd;
10065748000Spooka 	char buf[FUNSIZE+1];
1016869f180Spooka 	int expected;
1026869f180Spooka 
1036869f180Spooka 	if (FSTYPE_NFSRO(tc))
1046869f180Spooka 		expected = EACCES;
1056869f180Spooka 	else
1066869f180Spooka 		expected = EROFS;
10765748000Spooka 
10865748000Spooka 	FSTEST_ENTER();
10965748000Spooka 	RL(fd = rump_sys_open(AFILE, O_RDONLY));
11065748000Spooka 	ATF_REQUIRE_EQ(rump_sys_read(fd, buf, FUNSIZE), FUNSIZE);
11165748000Spooka 	buf[FUNSIZE] = '\0';
11265748000Spooka 	ATF_REQUIRE_STREQ(buf, FUNTEXT);
11365748000Spooka 	RL(rump_sys_close(fd));
11465748000Spooka 
1156869f180Spooka 	ATF_REQUIRE_ERRNO(expected, rump_sys_open(AFILE, O_WRONLY) == -1);
1166869f180Spooka 	ATF_REQUIRE_ERRNO(expected, rump_sys_open(AFILE, O_RDWR) == -1);
11765748000Spooka 	FSTEST_EXIT();
11865748000Spooka }
11965748000Spooka 
12065748000Spooka static void
attrs(const atf_tc_t * tc,const char * mp)12165748000Spooka attrs(const atf_tc_t *tc, const char *mp)
12265748000Spooka {
123*f77bb6aeSkre 	struct timeval sometvs[2] = { {0,0}, {0,0} };
12465748000Spooka 	struct stat sb;
12565748000Spooka 	int fd;
12665748000Spooka 
12765748000Spooka 	FSTEST_ENTER();
12865748000Spooka 
12965748000Spooka 	RL(rump_sys_stat(AFILE, &sb));
13065748000Spooka 
13165748000Spooka 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_chmod(AFILE, 0775) == -1);
13265748000Spooka 	if (!FSTYPE_MSDOS(tc))
13365748000Spooka 		ATF_REQUIRE_ERRNO(EROFS, rump_sys_chown(AFILE, 1, 1) == -1);
13465748000Spooka 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_utimes(AFILE, sometvs) == -1);
13565748000Spooka 
13665748000Spooka 	RL(fd = rump_sys_open(AFILE, O_RDONLY));
13765748000Spooka 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_fchmod(fd, 0775) == -1);
13865748000Spooka 	if (!FSTYPE_MSDOS(tc))
13965748000Spooka 		ATF_REQUIRE_ERRNO(EROFS, rump_sys_fchown(fd, 1, 1) == -1);
14065748000Spooka 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_futimes(fd, sometvs) == -1);
14165748000Spooka 	RL(rump_sys_close(fd));
14265748000Spooka 
14365748000Spooka 	FSTEST_EXIT();
14465748000Spooka }
14565748000Spooka 
1460aabb924Syamt static void
createdir(const atf_tc_t * tc,const char * mp)1470aabb924Syamt createdir(const atf_tc_t *tc, const char *mp)
1480aabb924Syamt {
1490aabb924Syamt 
1500aabb924Syamt 	FSTEST_ENTER();
1510aabb924Syamt 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_mkdir(ADIR, 0775) == -1);
1520aabb924Syamt 	FSTEST_EXIT();
1530aabb924Syamt }
1540aabb924Syamt 
1550aabb924Syamt static void
createfifo(const atf_tc_t * tc,const char * mp)1560aabb924Syamt createfifo(const atf_tc_t *tc, const char *mp)
1570aabb924Syamt {
1580aabb924Syamt 
1590aabb924Syamt 	FSTEST_ENTER();
1600aabb924Syamt 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_mkfifo(AFIFO, 0775) == -1);
1610aabb924Syamt 	FSTEST_EXIT();
1620aabb924Syamt }
1630aabb924Syamt 
1640aabb924Syamt static void
createsymlink(const atf_tc_t * tc,const char * mp)1650aabb924Syamt createsymlink(const atf_tc_t *tc, const char *mp)
1660aabb924Syamt {
1670aabb924Syamt 
1680aabb924Syamt 	FSTEST_ENTER();
1690aabb924Syamt 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_symlink("hoge", ASYMLINK) == -1);
1700aabb924Syamt 	FSTEST_EXIT();
1710aabb924Syamt }
1720aabb924Syamt 
1730aabb924Syamt static void
createlink(const atf_tc_t * tc,const char * mp)1740aabb924Syamt createlink(const atf_tc_t *tc, const char *mp)
1750aabb924Syamt {
1760aabb924Syamt 
1770aabb924Syamt 	FSTEST_ENTER();
1780aabb924Syamt 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_link(AFILE, ALINK) == -1);
1790aabb924Syamt 	FSTEST_EXIT();
1800aabb924Syamt }
1810aabb924Syamt 
18265748000Spooka ATF_TC_FSAPPLY_RO(create, "create file on r/o mount", nullgen);
18365748000Spooka ATF_TC_FSAPPLY_RO(rmfile, "remove file from r/o mount", filegen);
18465748000Spooka ATF_TC_FSAPPLY_RO(fileio, "can read a file but not write it", filegen);
18565748000Spooka ATF_TC_FSAPPLY_RO(attrs, "can query but not change attributes", filegen);
1860aabb924Syamt ATF_TC_FSAPPLY_RO(createdir, "create directory on r/o mount", nullgen);
1870aabb924Syamt ATF_TC_FSAPPLY_RO(createfifo, "create fifo on r/o mount", nullgen);
1880aabb924Syamt ATF_TC_FSAPPLY_RO(createsymlink, "create symlink on r/o mount", nullgen);
1890aabb924Syamt ATF_TC_FSAPPLY_RO(createlink, "create hardlink on r/o mount", filegen);
19065748000Spooka 
ATF_TP_ADD_TCS(tp)19165748000Spooka ATF_TP_ADD_TCS(tp)
19265748000Spooka {
19365748000Spooka 
19465748000Spooka 	ATF_TP_FSAPPLY_RO(create);
19565748000Spooka 	ATF_TP_FSAPPLY_RO(rmfile);
19665748000Spooka 	ATF_TP_FSAPPLY_RO(fileio);
19765748000Spooka 	ATF_TP_FSAPPLY_RO(attrs);
1980aabb924Syamt 	ATF_TP_FSAPPLY_RO(createdir);
1990aabb924Syamt 	ATF_TP_FSAPPLY_RO(createfifo);
2000aabb924Syamt 	ATF_TP_FSAPPLY_RO(createsymlink);
2010aabb924Syamt 	ATF_TP_FSAPPLY_RO(createlink);
20265748000Spooka 
20365748000Spooka 	return atf_no_error();
20465748000Spooka }
205