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