t_nullpts.c revision 1.3
11.3Spooka/* $NetBSD: t_nullpts.c,v 1.3 2010/06/16 15:57:11 pooka Exp $ */ 21.1Spooka 31.1Spooka#include <sys/types.h> 41.1Spooka#include <sys/mount.h> 51.1Spooka#include <sys/ioctl.h> 61.1Spooka 71.1Spooka#include <atf-c.h> 81.1Spooka#include <err.h> 91.1Spooka#include <errno.h> 101.1Spooka#include <fcntl.h> 111.1Spooka#include <stdio.h> 121.1Spooka#include <unistd.h> 131.1Spooka#include <string.h> 141.1Spooka#include <stdlib.h> 151.1Spooka 161.1Spooka#include <rump/rump.h> 171.1Spooka#include <rump/rump_syscalls.h> 181.1Spooka 191.1Spooka#include <fs/ptyfs/ptyfs.h> 201.1Spooka#include <miscfs/nullfs/null.h> 211.1Spooka 221.1Spooka#include "../../h_macros.h" 231.1Spooka 241.1Spookastatic void 251.1Spookamountptyfs(const char *mp, int flags) 261.1Spooka{ 271.1Spooka struct ptyfs_args args; 281.1Spooka 291.1Spooka if (rump_sys_mkdir(mp, 0777) == -1) { 301.1Spooka if (errno != EEXIST) 311.1Spooka atf_tc_fail_errno("null create %s", mp); 321.1Spooka } 331.1Spooka memset(&args, 0, sizeof(args)); 341.1Spooka args.version = PTYFS_ARGSVERSION; 351.1Spooka args.mode = 0777; 361.1Spooka if (rump_sys_mount(MOUNT_PTYFS, mp, flags, &args, sizeof(args)) == -1) 371.1Spooka atf_tc_fail_errno("could not mount ptyfs"); 381.1Spooka} 391.1Spooka 401.1Spookastatic void 411.1Spookamountnull(const char *what, const char *mp, int flags) 421.1Spooka{ 431.1Spooka struct null_args nargs; 441.1Spooka 451.1Spooka if (rump_sys_mkdir(what, 0777) == -1) { 461.1Spooka if (errno != EEXIST) 471.1Spooka atf_tc_fail_errno("null create %s", what); 481.1Spooka } 491.1Spooka if (rump_sys_mkdir(mp, 0777) == -1) { 501.1Spooka if (errno != EEXIST) 511.1Spooka atf_tc_fail_errno("null create %s", mp); 521.1Spooka } 531.1Spooka memset(&nargs, 0, sizeof(nargs)); 541.1Spooka nargs.nulla_target = __UNCONST(what); 551.1Spooka if (rump_sys_mount(MOUNT_NULL, mp, flags, &nargs, sizeof(nargs)) == -1) 561.1Spooka atf_tc_fail_errno("could not mount nullfs"); 571.1Spooka} 581.1Spooka 591.1SpookaATF_TC(nullrevoke); 601.1SpookaATF_TC_HEAD(nullrevoke, tc) 611.1Spooka{ 621.2Spooka atf_tc_set_md_var(tc, "descr", "null mount ptyfs and revoke"); 631.2Spooka atf_tc_set_md_var(tc, "xfail", "PR kern/43456"); 641.1Spooka} 651.1Spooka 661.1SpookaATF_TC_BODY(nullrevoke, tc) 671.1Spooka{ 681.1Spooka char path[MAXPATHLEN]; 691.1Spooka struct ptmget ptg; 701.1Spooka int ptm; 711.1Spooka 721.1Spooka rump_init(); 731.1Spooka 741.1Spooka /* 751.1Spooka * mount /dev/pts 761.1Spooka */ 771.1Spooka mountptyfs("/dev/pts", 0); 781.1Spooka 791.1Spooka /* 801.3Spooka * null mount /dev/pts to /null/dev/pts 811.1Spooka */ 821.1Spooka if (rump_sys_mkdir("/null", 0777) == -1) { 831.1Spooka if (errno != EEXIST) 841.1Spooka atf_tc_fail_errno("null create /null"); 851.1Spooka } 861.3Spooka if (rump_sys_mkdir("/null/dev", 0777) == -1) { 871.3Spooka if (errno != EEXIST) 881.3Spooka atf_tc_fail_errno("null create /null/dev"); 891.3Spooka } 901.3Spooka 911.3Spooka mountnull("/dev/pts", "/null/dev/pts", 0); 921.1Spooka 931.1Spooka /* 941.1Spooka * get slave/master pair. 951.1Spooka */ 961.1Spooka ptm = rump_sys_open("/dev/ptm", O_RDWR); 971.1Spooka if (rump_sys_ioctl(ptm, TIOCPTMGET, &ptg) == -1) 981.1Spooka atf_tc_fail_errno("get pty"); 991.1Spooka 1001.1Spooka /* 1011.1Spooka * Build nullfs path to slave. 1021.1Spooka */ 1031.3Spooka strcpy(path, "/null"); 1041.1Spooka strcat(path, ptg.sn); 1051.1Spooka 1061.1Spooka /* 1071.1Spooka * Open slave tty via nullfs. 1081.1Spooka */ 1091.1Spooka if (rump_sys_open(path, O_RDWR) == -1) 1101.1Spooka atf_tc_fail_errno("slave null open"); 1111.1Spooka 1121.1Spooka /* 1131.1Spooka * Close slave opened with /dev/ptm. Need purely non-null refs to it. 1141.1Spooka */ 1151.1Spooka rump_sys_close(ptg.sfd); 1161.1Spooka 1171.1Spooka /* revoke slave tty. boom */ 1181.1Spooka rump_sys_revoke(path); 1191.1Spooka 1201.1Spooka /* done? */ 1211.1Spooka} 1221.1Spooka 1231.1SpookaATF_TP_ADD_TCS(tp) 1241.1Spooka{ 1251.1Spooka 1261.1Spooka ATF_TP_ADD_TC(tp, nullrevoke); 1271.1Spooka 1281.1Spooka return atf_no_error(); 1291.1Spooka} 130