tst.providers.ksh revision 268578
1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License (the "License").
6# You may not use this file except in compliance with the License.
7#
8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9# or http://www.opensolaris.org/os/licensing.
10# See the License for the specific language governing permissions
11# and limitations under the License.
12#
13# When distributing Covered Code, include this CDDL HEADER in each
14# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15# If applicable, add the following below this CDDL HEADER, with the
16# fields enclosed by brackets "[]" replaced with your own identifying
17# information: Portions Copyright [yyyy] [name of copyright owner]
18#
19# CDDL HEADER END
20#
21
22#
23# Copyright (c) 2012, Joyent, Inc. All rights reserved.
24#
25
26#
27# First, make sure that we can successfully enable the io provider
28#
29if ! dtrace -P io -n BEGIN'{exit(0)}' > /dev/null 2>&1 ; then
30	echo failed to enable io provider with full privs
31	exit 1
32fi
33
34ppriv -s A=basic,dtrace_proc,dtrace_user $$
35
36#
37# Now make sure that we cannot enable the io provider with reduced privs
38#
39if ! dtrace -x errtags -P io -n BEGIN'{exit(1)}' 2>&1 | \
40    grep D_PDESC_ZERO > /dev/null 2>&1 ; then
41	echo successfully enabled the io provider with reduced privs
42	exit 1
43fi
44
45#
46# Keeping our reduced privs, we want to assure that we can see every provider
47# that we think we should be able to see -- and that we can see curpsinfo
48# state but can't otherwise see arguments.
49#
50/usr/sbin/dtrace -wq -Cs /dev/stdin <<EOF
51
52int seen[string];
53int err;
54
55#define CANENABLE(provider) \
56provider:::								\
57/err == 0 && progenyof(\$pid) && !seen["provider"]/			\
58{									\
59	trace(arg0);							\
60	printf("\nsuccessful trace of arg0 in %s:%s:%s:%s\n",		\
61	    probeprov, probemod, probefunc, probename);			\
62	exit(++err);							\
63}									\
64									\
65provider:::								\
66/progenyof(\$pid)/							\
67{									\
68	seen["provider"]++;						\
69}									\
70									\
71provider:::								\
72/progenyof(\$pid)/							\
73{									\
74	errstr = "provider";						\
75	this->ignore = stringof(curpsinfo->pr_psargs);			\
76	errstr = "";							\
77}									\
78									\
79END									\
80/err == 0 && !seen["provider"]/						\
81{									\
82	printf("no probes from provider\n");				\
83	exit(++err);							\
84}									\
85									\
86END									\
87/err == 0/								\
88{									\
89	printf("saw %d probes from provider\n", seen["provider"]);	\
90}
91
92CANENABLE(proc)
93CANENABLE(sched)
94CANENABLE(vminfo)
95CANENABLE(sysinfo)
96
97BEGIN
98{
99	/*
100	 * We'll kick off a system of a do-nothing command -- which should be
101	 * enough to kick proc, sched, vminfo and sysinfo probes.
102	 */
103	system("echo > /dev/null");
104}
105
106ERROR
107/err == 0 && errstr != ""/
108{
109	printf("fatal error: couldn't read curpsinfo->pr_psargs in ");
110	printf("%s-provided probe\n", errstr);
111	exit(++err);
112}
113
114proc:::exit
115/progenyof(\$pid)/
116{
117	exit(0);
118}
119
120tick-10ms
121/i++ > 500/
122{
123	printf("exit probe did not seem to fire\n");
124	exit(++err);
125}
126EOF
127