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