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