xref: /freebsd/contrib/netbsd-tests/fs/vfs/t_ro.c (revision 63d1fd59)
1*63d1fd59SEnji Cooper /*	$NetBSD: t_ro.c,v 1.6 2017/01/13 21:30:40 christos Exp $	*/
257718be8SEnji Cooper 
357718be8SEnji Cooper /*-
457718be8SEnji Cooper  * Copyright (c) 2010 The NetBSD Foundation, Inc.
557718be8SEnji Cooper  * All rights reserved.
657718be8SEnji Cooper  *
757718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
857718be8SEnji Cooper  * modification, are permitted provided that the following conditions
957718be8SEnji Cooper  * are met:
1057718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
1157718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
1257718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
1357718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
1457718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
1557718be8SEnji Cooper  *
1657718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1757718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1857718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1957718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2057718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2157718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2257718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2357718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2457718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2557718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2657718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
2757718be8SEnji Cooper  */
2857718be8SEnji Cooper 
2957718be8SEnji Cooper #include <sys/stat.h>
3057718be8SEnji Cooper #include <sys/statvfs.h>
3157718be8SEnji Cooper 
3257718be8SEnji Cooper #include <atf-c.h>
3357718be8SEnji Cooper #include <fcntl.h>
3457718be8SEnji Cooper #include <libgen.h>
3557718be8SEnji Cooper #include <stdlib.h>
3657718be8SEnji Cooper #include <unistd.h>
3757718be8SEnji Cooper 
3857718be8SEnji Cooper #include <rump/rump_syscalls.h>
3957718be8SEnji Cooper #include <rump/rump.h>
4057718be8SEnji Cooper 
4157718be8SEnji Cooper #include "../common/h_fsmacros.h"
42*63d1fd59SEnji Cooper #include "h_macros.h"
4357718be8SEnji Cooper 
4457718be8SEnji Cooper #define AFILE "testfile"
4557718be8SEnji Cooper #define ADIR "testdir"
4657718be8SEnji Cooper #define AFIFO "testfifo"
4757718be8SEnji Cooper #define ASYMLINK "testsymlink"
4857718be8SEnji Cooper #define ALINK "testlink"
4957718be8SEnji Cooper #define FUNTEXT "this is some non-humppa text"
5057718be8SEnji Cooper #define FUNSIZE (sizeof(FUNTEXT)-1)
5157718be8SEnji Cooper 
5257718be8SEnji Cooper static void
nullgen(const atf_tc_t * tc,const char * mp)5357718be8SEnji Cooper nullgen(const atf_tc_t *tc, const char *mp)
5457718be8SEnji Cooper {
5557718be8SEnji Cooper 
5657718be8SEnji Cooper 	return;
5757718be8SEnji Cooper }
5857718be8SEnji Cooper 
5957718be8SEnji Cooper static void
filegen(const atf_tc_t * tc,const char * mp)6057718be8SEnji Cooper filegen(const atf_tc_t *tc, const char *mp)
6157718be8SEnji Cooper {
6257718be8SEnji Cooper 	int fd;
6357718be8SEnji Cooper 
6457718be8SEnji Cooper 	FSTEST_ENTER();
6557718be8SEnji Cooper 	RL(fd = rump_sys_open(AFILE, O_CREAT | O_RDWR, 0777));
6657718be8SEnji Cooper 	ATF_REQUIRE_EQ(rump_sys_write(fd, FUNTEXT, FUNSIZE), FUNSIZE);
6757718be8SEnji Cooper 	RL(rump_sys_close(fd));
6857718be8SEnji Cooper 	FSTEST_EXIT();
6957718be8SEnji Cooper }
7057718be8SEnji Cooper 
7157718be8SEnji Cooper /*
7257718be8SEnji Cooper  *
7357718be8SEnji Cooper  * BEGIN tests
7457718be8SEnji Cooper  *
7557718be8SEnji Cooper  */
7657718be8SEnji Cooper 
7757718be8SEnji Cooper static void
create(const atf_tc_t * tc,const char * mp)7857718be8SEnji Cooper create(const atf_tc_t *tc, const char *mp)
7957718be8SEnji Cooper {
8057718be8SEnji Cooper 
8157718be8SEnji Cooper 	FSTEST_ENTER();
8257718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_open(AFILE, O_CREAT|O_RDONLY) == -1);
8357718be8SEnji Cooper 	FSTEST_EXIT();
8457718be8SEnji Cooper }
8557718be8SEnji Cooper 
8657718be8SEnji Cooper static void
rmfile(const atf_tc_t * tc,const char * mp)8757718be8SEnji Cooper rmfile(const atf_tc_t *tc, const char *mp)
8857718be8SEnji Cooper {
8957718be8SEnji Cooper 
9057718be8SEnji Cooper 	FSTEST_ENTER();
9157718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_unlink(AFILE) == -1);
9257718be8SEnji Cooper 	FSTEST_EXIT();
9357718be8SEnji Cooper }
9457718be8SEnji Cooper 
9557718be8SEnji Cooper static void
fileio(const atf_tc_t * tc,const char * mp)9657718be8SEnji Cooper fileio(const atf_tc_t *tc, const char *mp)
9757718be8SEnji Cooper {
9857718be8SEnji Cooper 	int fd;
9957718be8SEnji Cooper 	char buf[FUNSIZE+1];
10057718be8SEnji Cooper 	int expected;
10157718be8SEnji Cooper 
10257718be8SEnji Cooper 	if (FSTYPE_NFSRO(tc))
10357718be8SEnji Cooper 		expected = EACCES;
10457718be8SEnji Cooper 	else
10557718be8SEnji Cooper 		expected = EROFS;
10657718be8SEnji Cooper 
10757718be8SEnji Cooper 	FSTEST_ENTER();
10857718be8SEnji Cooper 	RL(fd = rump_sys_open(AFILE, O_RDONLY));
10957718be8SEnji Cooper 	ATF_REQUIRE_EQ(rump_sys_read(fd, buf, FUNSIZE), FUNSIZE);
11057718be8SEnji Cooper 	buf[FUNSIZE] = '\0';
11157718be8SEnji Cooper 	ATF_REQUIRE_STREQ(buf, FUNTEXT);
11257718be8SEnji Cooper 	RL(rump_sys_close(fd));
11357718be8SEnji Cooper 
11457718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(expected, rump_sys_open(AFILE, O_WRONLY) == -1);
11557718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(expected, rump_sys_open(AFILE, O_RDWR) == -1);
11657718be8SEnji Cooper 	FSTEST_EXIT();
11757718be8SEnji Cooper }
11857718be8SEnji Cooper 
11957718be8SEnji Cooper static void
attrs(const atf_tc_t * tc,const char * mp)12057718be8SEnji Cooper attrs(const atf_tc_t *tc, const char *mp)
12157718be8SEnji Cooper {
12257718be8SEnji Cooper 	struct timeval sometvs[2];
12357718be8SEnji Cooper 	struct stat sb;
12457718be8SEnji Cooper 	int fd;
12557718be8SEnji Cooper 
12657718be8SEnji Cooper 	FSTEST_ENTER();
12757718be8SEnji Cooper 
12857718be8SEnji Cooper 	RL(rump_sys_stat(AFILE, &sb));
12957718be8SEnji Cooper 
13057718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_chmod(AFILE, 0775) == -1);
13157718be8SEnji Cooper 	if (!FSTYPE_MSDOS(tc))
13257718be8SEnji Cooper 		ATF_REQUIRE_ERRNO(EROFS, rump_sys_chown(AFILE, 1, 1) == -1);
13357718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_utimes(AFILE, sometvs) == -1);
13457718be8SEnji Cooper 
13557718be8SEnji Cooper 	RL(fd = rump_sys_open(AFILE, O_RDONLY));
13657718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_fchmod(fd, 0775) == -1);
13757718be8SEnji Cooper 	if (!FSTYPE_MSDOS(tc))
13857718be8SEnji Cooper 		ATF_REQUIRE_ERRNO(EROFS, rump_sys_fchown(fd, 1, 1) == -1);
13957718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_futimes(fd, sometvs) == -1);
14057718be8SEnji Cooper 	RL(rump_sys_close(fd));
14157718be8SEnji Cooper 
14257718be8SEnji Cooper 	FSTEST_EXIT();
14357718be8SEnji Cooper }
14457718be8SEnji Cooper 
14557718be8SEnji Cooper static void
createdir(const atf_tc_t * tc,const char * mp)14657718be8SEnji Cooper createdir(const atf_tc_t *tc, const char *mp)
14757718be8SEnji Cooper {
14857718be8SEnji Cooper 
14957718be8SEnji Cooper 	FSTEST_ENTER();
15057718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_mkdir(ADIR, 0775) == -1);
15157718be8SEnji Cooper 	FSTEST_EXIT();
15257718be8SEnji Cooper }
15357718be8SEnji Cooper 
15457718be8SEnji Cooper static void
createfifo(const atf_tc_t * tc,const char * mp)15557718be8SEnji Cooper createfifo(const atf_tc_t *tc, const char *mp)
15657718be8SEnji Cooper {
15757718be8SEnji Cooper 
15857718be8SEnji Cooper 	FSTEST_ENTER();
15957718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_mkfifo(AFIFO, 0775) == -1);
16057718be8SEnji Cooper 	FSTEST_EXIT();
16157718be8SEnji Cooper }
16257718be8SEnji Cooper 
16357718be8SEnji Cooper static void
createsymlink(const atf_tc_t * tc,const char * mp)16457718be8SEnji Cooper createsymlink(const atf_tc_t *tc, const char *mp)
16557718be8SEnji Cooper {
16657718be8SEnji Cooper 
16757718be8SEnji Cooper 	FSTEST_ENTER();
16857718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_symlink("hoge", ASYMLINK) == -1);
16957718be8SEnji Cooper 	FSTEST_EXIT();
17057718be8SEnji Cooper }
17157718be8SEnji Cooper 
17257718be8SEnji Cooper static void
createlink(const atf_tc_t * tc,const char * mp)17357718be8SEnji Cooper createlink(const atf_tc_t *tc, const char *mp)
17457718be8SEnji Cooper {
17557718be8SEnji Cooper 
17657718be8SEnji Cooper 	FSTEST_ENTER();
17757718be8SEnji Cooper 	ATF_REQUIRE_ERRNO(EROFS, rump_sys_link(AFILE, ALINK) == -1);
17857718be8SEnji Cooper 	FSTEST_EXIT();
17957718be8SEnji Cooper }
18057718be8SEnji Cooper 
18157718be8SEnji Cooper ATF_TC_FSAPPLY_RO(create, "create file on r/o mount", nullgen);
18257718be8SEnji Cooper ATF_TC_FSAPPLY_RO(rmfile, "remove file from r/o mount", filegen);
18357718be8SEnji Cooper ATF_TC_FSAPPLY_RO(fileio, "can read a file but not write it", filegen);
18457718be8SEnji Cooper ATF_TC_FSAPPLY_RO(attrs, "can query but not change attributes", filegen);
18557718be8SEnji Cooper ATF_TC_FSAPPLY_RO(createdir, "create directory on r/o mount", nullgen);
18657718be8SEnji Cooper ATF_TC_FSAPPLY_RO(createfifo, "create fifo on r/o mount", nullgen);
18757718be8SEnji Cooper ATF_TC_FSAPPLY_RO(createsymlink, "create symlink on r/o mount", nullgen);
18857718be8SEnji Cooper ATF_TC_FSAPPLY_RO(createlink, "create hardlink on r/o mount", filegen);
18957718be8SEnji Cooper 
ATF_TP_ADD_TCS(tp)19057718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
19157718be8SEnji Cooper {
19257718be8SEnji Cooper 
19357718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(create);
19457718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(rmfile);
19557718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(fileio);
19657718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(attrs);
19757718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(createdir);
19857718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(createfifo);
19957718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(createsymlink);
20057718be8SEnji Cooper 	ATF_TP_FSAPPLY_RO(createlink);
20157718be8SEnji Cooper 
20257718be8SEnji Cooper 	return atf_no_error();
20357718be8SEnji Cooper }
204