t_nullpts.c revision 1.6
11.6Schristos/* $NetBSD: t_nullpts.c,v 1.6 2017/01/13 21:30:40 christos 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.6Schristos#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.1Spooka} 641.1Spooka 651.1SpookaATF_TC_BODY(nullrevoke, tc) 661.1Spooka{ 671.1Spooka char path[MAXPATHLEN]; 681.1Spooka struct ptmget ptg; 691.1Spooka int ptm; 701.1Spooka 711.1Spooka rump_init(); 721.1Spooka 731.1Spooka /* 741.1Spooka * mount /dev/pts 751.1Spooka */ 761.1Spooka mountptyfs("/dev/pts", 0); 771.1Spooka 781.1Spooka /* 791.3Spooka * null mount /dev/pts to /null/dev/pts 801.1Spooka */ 811.1Spooka if (rump_sys_mkdir("/null", 0777) == -1) { 821.1Spooka if (errno != EEXIST) 831.1Spooka atf_tc_fail_errno("null create /null"); 841.1Spooka } 851.3Spooka if (rump_sys_mkdir("/null/dev", 0777) == -1) { 861.3Spooka if (errno != EEXIST) 871.3Spooka atf_tc_fail_errno("null create /null/dev"); 881.3Spooka } 891.3Spooka 901.3Spooka mountnull("/dev/pts", "/null/dev/pts", 0); 911.1Spooka 921.1Spooka /* 931.1Spooka * get slave/master pair. 941.1Spooka */ 951.1Spooka ptm = rump_sys_open("/dev/ptm", O_RDWR); 961.1Spooka if (rump_sys_ioctl(ptm, TIOCPTMGET, &ptg) == -1) 971.1Spooka atf_tc_fail_errno("get pty"); 981.1Spooka 991.1Spooka /* 1001.1Spooka * Build nullfs path to slave. 1011.1Spooka */ 1021.3Spooka strcpy(path, "/null"); 1031.1Spooka strcat(path, ptg.sn); 1041.1Spooka 1051.1Spooka /* 1061.1Spooka * Open slave tty via nullfs. 1071.1Spooka */ 1081.1Spooka if (rump_sys_open(path, O_RDWR) == -1) 1091.1Spooka atf_tc_fail_errno("slave null open"); 1101.1Spooka 1111.1Spooka /* 1121.1Spooka * Close slave opened with /dev/ptm. Need purely non-null refs to it. 1131.1Spooka */ 1141.1Spooka rump_sys_close(ptg.sfd); 1151.1Spooka 1161.5Shannken /* revoke slave tty. */ 1171.1Spooka rump_sys_revoke(path); 1181.1Spooka 1191.5Shannken /* done */ 1201.1Spooka} 1211.1Spooka 1221.1SpookaATF_TP_ADD_TCS(tp) 1231.1Spooka{ 1241.1Spooka 1251.1Spooka ATF_TP_ADD_TC(tp, nullrevoke); 1261.1Spooka 1271.1Spooka return atf_no_error(); 1281.1Spooka} 129