1314818Sngie/* $NetBSD: t_fifos.c,v 1.6 2017/01/13 21:30:39 christos Exp $ */ 2272343Sngie 3272343Sngie#include <sys/types.h> 4272343Sngie#include <sys/mount.h> 5272343Sngie 6272343Sngie#include <atf-c.h> 7272343Sngie#include <errno.h> 8272343Sngie#include <fcntl.h> 9272343Sngie#include <pthread.h> 10272343Sngie#include <stdio.h> 11272343Sngie#include <stdlib.h> 12272343Sngie#include <unistd.h> 13272343Sngie#include <string.h> 14272343Sngie 15272343Sngie#include <rump/rump.h> 16272343Sngie#include <rump/rump_syscalls.h> 17272343Sngie 18272343Sngie#include <ufs/ufs/ufsmount.h> 19272343Sngie 20314818Sngie#include "h_macros.h" 21272343Sngie 22272343SngieATF_TC_WITH_CLEANUP(fifos); 23272343SngieATF_TC_HEAD(fifos, tc) 24272343Sngie{ 25272343Sngie atf_tc_set_md_var(tc, "descr", "test fifo support in ffs"); 26272343Sngie atf_tc_set_md_var(tc, "timeout", "5"); 27272343Sngie} 28272343Sngie 29272343Sngie#define teststr1 "raving & drooling" 30272343Sngie#define teststr2 "haha, charade" 31272343Sngie 32272343Sngiestatic void * 33272343Sngiew1(void *arg) 34272343Sngie{ 35272343Sngie int fd; 36272343Sngie 37272343Sngie fd = rump_sys_open("sheep", O_WRONLY); 38272343Sngie if (fd == -1) 39272343Sngie atf_tc_fail_errno("w1 open"); 40272343Sngie if (rump_sys_write(fd, teststr1, sizeof(teststr1)) != sizeof(teststr1)) 41272343Sngie atf_tc_fail_errno("w1 write"); 42272343Sngie rump_sys_close(fd); 43272343Sngie 44272343Sngie return NULL; 45272343Sngie} 46272343Sngie 47272343Sngiestatic void * 48272343Sngiew2(void *arg) 49272343Sngie{ 50272343Sngie int fd; 51272343Sngie 52272343Sngie fd = rump_sys_open("pigs", O_WRONLY); 53272343Sngie if (fd == -1) 54272343Sngie atf_tc_fail_errno("w2 open"); 55272343Sngie if (rump_sys_write(fd, teststr2, sizeof(teststr2)) != sizeof(teststr2)) 56272343Sngie atf_tc_fail_errno("w2 write"); 57272343Sngie rump_sys_close(fd); 58272343Sngie 59272343Sngie return NULL; 60272343Sngie} 61272343Sngie 62272343Sngiestatic void * 63272343Sngier1(void *arg) 64272343Sngie{ 65272343Sngie char buf[32]; 66272343Sngie int fd; 67272343Sngie 68272343Sngie fd = rump_sys_open("sheep", O_RDONLY); 69272343Sngie if (fd == -1) 70272343Sngie atf_tc_fail_errno("r1 open"); 71272343Sngie if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr1)) 72272343Sngie atf_tc_fail_errno("r1 read"); 73272343Sngie rump_sys_close(fd); 74272343Sngie 75272343Sngie if (strcmp(teststr1, buf) != 0) 76272343Sngie atf_tc_fail("got invalid str, %s vs. %s", buf, teststr1); 77272343Sngie 78272343Sngie return NULL; 79272343Sngie} 80272343Sngie 81272343Sngiestatic void * 82272343Sngier2(void *arg) 83272343Sngie{ 84272343Sngie char buf[32]; 85272343Sngie int fd; 86272343Sngie 87272343Sngie fd = rump_sys_open("pigs", O_RDONLY); 88272343Sngie if (fd == -1) 89272343Sngie atf_tc_fail_errno("r2 open"); 90272343Sngie if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr2)) 91272343Sngie atf_tc_fail_errno("r2 read"); 92272343Sngie rump_sys_close(fd); 93272343Sngie 94272343Sngie if (strcmp(teststr2, buf) != 0) 95272343Sngie atf_tc_fail("got invalid str, %s vs. %s", buf, teststr2); 96272343Sngie 97272343Sngie return NULL; 98272343Sngie} 99272343Sngie 100272343Sngie#define IMGNAME "atf.img" 101272343Sngie 102272343Sngieconst char *newfs = "newfs -F -s 10000 " IMGNAME; 103272343Sngie#define FAKEBLK "/dev/sp00ka" 104272343Sngie 105272343SngieATF_TC_BODY(fifos, tc) 106272343Sngie{ 107272343Sngie struct ufs_args args; 108272343Sngie pthread_t ptw1, ptw2, ptr1, ptr2; 109272343Sngie 110272343Sngie if (system(newfs) == -1) 111272343Sngie atf_tc_fail_errno("newfs failed"); 112272343Sngie 113272343Sngie memset(&args, 0, sizeof(args)); 114272343Sngie args.fspec = __UNCONST(FAKEBLK); 115272343Sngie 116272343Sngie rump_init(); 117272343Sngie if (rump_sys_mkdir("/animals", 0777) == -1) 118272343Sngie atf_tc_fail_errno("cannot create mountpoint"); 119272343Sngie rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK); 120272343Sngie if (rump_sys_mount(MOUNT_FFS, "/animals", 0, &args, sizeof(args))==-1) 121272343Sngie atf_tc_fail_errno("rump_sys_mount failed"); 122272343Sngie 123272343Sngie /* create fifos */ 124272343Sngie if (rump_sys_chdir("/animals") == 1) 125272343Sngie atf_tc_fail_errno("chdir"); 126272343Sngie if (rump_sys_mkfifo("pigs", S_IFIFO | 0777) == -1) 127272343Sngie atf_tc_fail_errno("mknod1"); 128272343Sngie if (rump_sys_mkfifo("sheep", S_IFIFO | 0777) == -1) 129272343Sngie atf_tc_fail_errno("mknod2"); 130272343Sngie 131272343Sngie pthread_create(&ptw1, NULL, w1, NULL); 132272343Sngie pthread_create(&ptw2, NULL, w2, NULL); 133272343Sngie pthread_create(&ptr1, NULL, r1, NULL); 134272343Sngie pthread_create(&ptr2, NULL, r2, NULL); 135272343Sngie 136272343Sngie pthread_join(ptw1, NULL); 137272343Sngie pthread_join(ptw2, NULL); 138272343Sngie pthread_join(ptr1, NULL); 139272343Sngie pthread_join(ptr2, NULL); 140272343Sngie 141272343Sngie if (rump_sys_chdir("/") == 1) 142272343Sngie atf_tc_fail_errno("chdir"); 143272343Sngie 144272343Sngie if (rump_sys_unmount("/animals", 0) == -1) 145272343Sngie atf_tc_fail_errno("unmount failed"); 146272343Sngie} 147272343Sngie 148272343SngieATF_TC_CLEANUP(fifos, tc) 149272343Sngie{ 150272343Sngie 151272343Sngie unlink(IMGNAME); 152272343Sngie} 153272343Sngie 154272343SngieATF_TP_ADD_TCS(tp) 155272343Sngie{ 156272343Sngie ATF_TP_ADD_TC(tp, fifos); 157272343Sngie return 0; 158272343Sngie} 159