1*63d1fd59SEnji Cooper /* $NetBSD: t_fifos.c,v 1.6 2017/01/13 21:30:39 christos Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper #include <sys/types.h>
457718be8SEnji Cooper #include <sys/mount.h>
557718be8SEnji Cooper
657718be8SEnji Cooper #include <atf-c.h>
757718be8SEnji Cooper #include <errno.h>
857718be8SEnji Cooper #include <fcntl.h>
957718be8SEnji Cooper #include <pthread.h>
1057718be8SEnji Cooper #include <stdio.h>
1157718be8SEnji Cooper #include <stdlib.h>
1257718be8SEnji Cooper #include <unistd.h>
1357718be8SEnji Cooper #include <string.h>
1457718be8SEnji Cooper
1557718be8SEnji Cooper #include <rump/rump.h>
1657718be8SEnji Cooper #include <rump/rump_syscalls.h>
1757718be8SEnji Cooper
1857718be8SEnji Cooper #include <ufs/ufs/ufsmount.h>
1957718be8SEnji Cooper
20*63d1fd59SEnji Cooper #include "h_macros.h"
2157718be8SEnji Cooper
2257718be8SEnji Cooper ATF_TC_WITH_CLEANUP(fifos);
ATF_TC_HEAD(fifos,tc)2357718be8SEnji Cooper ATF_TC_HEAD(fifos, tc)
2457718be8SEnji Cooper {
2557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test fifo support in ffs");
2657718be8SEnji Cooper atf_tc_set_md_var(tc, "timeout", "5");
2757718be8SEnji Cooper }
2857718be8SEnji Cooper
2957718be8SEnji Cooper #define teststr1 "raving & drooling"
3057718be8SEnji Cooper #define teststr2 "haha, charade"
3157718be8SEnji Cooper
3257718be8SEnji Cooper static void *
w1(void * arg)3357718be8SEnji Cooper w1(void *arg)
3457718be8SEnji Cooper {
3557718be8SEnji Cooper int fd;
3657718be8SEnji Cooper
3757718be8SEnji Cooper fd = rump_sys_open("sheep", O_WRONLY);
3857718be8SEnji Cooper if (fd == -1)
3957718be8SEnji Cooper atf_tc_fail_errno("w1 open");
4057718be8SEnji Cooper if (rump_sys_write(fd, teststr1, sizeof(teststr1)) != sizeof(teststr1))
4157718be8SEnji Cooper atf_tc_fail_errno("w1 write");
4257718be8SEnji Cooper rump_sys_close(fd);
4357718be8SEnji Cooper
4457718be8SEnji Cooper return NULL;
4557718be8SEnji Cooper }
4657718be8SEnji Cooper
4757718be8SEnji Cooper static void *
w2(void * arg)4857718be8SEnji Cooper w2(void *arg)
4957718be8SEnji Cooper {
5057718be8SEnji Cooper int fd;
5157718be8SEnji Cooper
5257718be8SEnji Cooper fd = rump_sys_open("pigs", O_WRONLY);
5357718be8SEnji Cooper if (fd == -1)
5457718be8SEnji Cooper atf_tc_fail_errno("w2 open");
5557718be8SEnji Cooper if (rump_sys_write(fd, teststr2, sizeof(teststr2)) != sizeof(teststr2))
5657718be8SEnji Cooper atf_tc_fail_errno("w2 write");
5757718be8SEnji Cooper rump_sys_close(fd);
5857718be8SEnji Cooper
5957718be8SEnji Cooper return NULL;
6057718be8SEnji Cooper }
6157718be8SEnji Cooper
6257718be8SEnji Cooper static void *
r1(void * arg)6357718be8SEnji Cooper r1(void *arg)
6457718be8SEnji Cooper {
6557718be8SEnji Cooper char buf[32];
6657718be8SEnji Cooper int fd;
6757718be8SEnji Cooper
6857718be8SEnji Cooper fd = rump_sys_open("sheep", O_RDONLY);
6957718be8SEnji Cooper if (fd == -1)
7057718be8SEnji Cooper atf_tc_fail_errno("r1 open");
7157718be8SEnji Cooper if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr1))
7257718be8SEnji Cooper atf_tc_fail_errno("r1 read");
7357718be8SEnji Cooper rump_sys_close(fd);
7457718be8SEnji Cooper
7557718be8SEnji Cooper if (strcmp(teststr1, buf) != 0)
7657718be8SEnji Cooper atf_tc_fail("got invalid str, %s vs. %s", buf, teststr1);
7757718be8SEnji Cooper
7857718be8SEnji Cooper return NULL;
7957718be8SEnji Cooper }
8057718be8SEnji Cooper
8157718be8SEnji Cooper static void *
r2(void * arg)8257718be8SEnji Cooper r2(void *arg)
8357718be8SEnji Cooper {
8457718be8SEnji Cooper char buf[32];
8557718be8SEnji Cooper int fd;
8657718be8SEnji Cooper
8757718be8SEnji Cooper fd = rump_sys_open("pigs", O_RDONLY);
8857718be8SEnji Cooper if (fd == -1)
8957718be8SEnji Cooper atf_tc_fail_errno("r2 open");
9057718be8SEnji Cooper if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr2))
9157718be8SEnji Cooper atf_tc_fail_errno("r2 read");
9257718be8SEnji Cooper rump_sys_close(fd);
9357718be8SEnji Cooper
9457718be8SEnji Cooper if (strcmp(teststr2, buf) != 0)
9557718be8SEnji Cooper atf_tc_fail("got invalid str, %s vs. %s", buf, teststr2);
9657718be8SEnji Cooper
9757718be8SEnji Cooper return NULL;
9857718be8SEnji Cooper }
9957718be8SEnji Cooper
10057718be8SEnji Cooper #define IMGNAME "atf.img"
10157718be8SEnji Cooper
10257718be8SEnji Cooper const char *newfs = "newfs -F -s 10000 " IMGNAME;
10357718be8SEnji Cooper #define FAKEBLK "/dev/sp00ka"
10457718be8SEnji Cooper
ATF_TC_BODY(fifos,tc)10557718be8SEnji Cooper ATF_TC_BODY(fifos, tc)
10657718be8SEnji Cooper {
10757718be8SEnji Cooper struct ufs_args args;
10857718be8SEnji Cooper pthread_t ptw1, ptw2, ptr1, ptr2;
10957718be8SEnji Cooper
11057718be8SEnji Cooper if (system(newfs) == -1)
11157718be8SEnji Cooper atf_tc_fail_errno("newfs failed");
11257718be8SEnji Cooper
11357718be8SEnji Cooper memset(&args, 0, sizeof(args));
11457718be8SEnji Cooper args.fspec = __UNCONST(FAKEBLK);
11557718be8SEnji Cooper
11657718be8SEnji Cooper rump_init();
11757718be8SEnji Cooper if (rump_sys_mkdir("/animals", 0777) == -1)
11857718be8SEnji Cooper atf_tc_fail_errno("cannot create mountpoint");
11957718be8SEnji Cooper rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK);
12057718be8SEnji Cooper if (rump_sys_mount(MOUNT_FFS, "/animals", 0, &args, sizeof(args))==-1)
12157718be8SEnji Cooper atf_tc_fail_errno("rump_sys_mount failed");
12257718be8SEnji Cooper
12357718be8SEnji Cooper /* create fifos */
12457718be8SEnji Cooper if (rump_sys_chdir("/animals") == 1)
12557718be8SEnji Cooper atf_tc_fail_errno("chdir");
12657718be8SEnji Cooper if (rump_sys_mkfifo("pigs", S_IFIFO | 0777) == -1)
12757718be8SEnji Cooper atf_tc_fail_errno("mknod1");
12857718be8SEnji Cooper if (rump_sys_mkfifo("sheep", S_IFIFO | 0777) == -1)
12957718be8SEnji Cooper atf_tc_fail_errno("mknod2");
13057718be8SEnji Cooper
13157718be8SEnji Cooper pthread_create(&ptw1, NULL, w1, NULL);
13257718be8SEnji Cooper pthread_create(&ptw2, NULL, w2, NULL);
13357718be8SEnji Cooper pthread_create(&ptr1, NULL, r1, NULL);
13457718be8SEnji Cooper pthread_create(&ptr2, NULL, r2, NULL);
13557718be8SEnji Cooper
13657718be8SEnji Cooper pthread_join(ptw1, NULL);
13757718be8SEnji Cooper pthread_join(ptw2, NULL);
13857718be8SEnji Cooper pthread_join(ptr1, NULL);
13957718be8SEnji Cooper pthread_join(ptr2, NULL);
14057718be8SEnji Cooper
14157718be8SEnji Cooper if (rump_sys_chdir("/") == 1)
14257718be8SEnji Cooper atf_tc_fail_errno("chdir");
14357718be8SEnji Cooper
14457718be8SEnji Cooper if (rump_sys_unmount("/animals", 0) == -1)
14557718be8SEnji Cooper atf_tc_fail_errno("unmount failed");
14657718be8SEnji Cooper }
14757718be8SEnji Cooper
ATF_TC_CLEANUP(fifos,tc)14857718be8SEnji Cooper ATF_TC_CLEANUP(fifos, tc)
14957718be8SEnji Cooper {
15057718be8SEnji Cooper
15157718be8SEnji Cooper unlink(IMGNAME);
15257718be8SEnji Cooper }
15357718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)15457718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
15557718be8SEnji Cooper {
15657718be8SEnji Cooper ATF_TP_ADD_TC(tp, fifos);
15757718be8SEnji Cooper return 0;
15857718be8SEnji Cooper }
159