]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/privs/tst.providers.ksh
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / cddl / contrib / opensolaris / cmd / dtrace / test / tst / common / privs / tst.providers.ksh
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 #
29 if ! 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
32 fi
33
34 ppriv -s A=basic,dtrace_proc,dtrace_user $$
35
36 #
37 # Now make sure that we cannot enable the io provider with reduced privs
38 #
39 if ! 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
43 fi
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
52 int seen[string];
53 int err;
54
55 #define CANENABLE(provider) \
56 provider:::                                                             \
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                                                                         \
65 provider:::                                                             \
66 /progenyof(\$pid)/                                                      \
67 {                                                                       \
68         seen["provider"]++;                                             \
69 }                                                                       \
70                                                                         \
71 provider:::                                                             \
72 /progenyof(\$pid)/                                                      \
73 {                                                                       \
74         errstr = "provider";                                            \
75         this->ignore = stringof(curpsinfo->pr_psargs);                  \
76         errstr = "";                                                    \
77 }                                                                       \
78                                                                         \
79 END                                                                     \
80 /err == 0 && !seen["provider"]/                                         \
81 {                                                                       \
82         printf("no probes from provider\n");                            \
83         exit(++err);                                                    \
84 }                                                                       \
85                                                                         \
86 END                                                                     \
87 /err == 0/                                                              \
88 {                                                                       \
89         printf("saw %d probes from provider\n", seen["provider"]);      \
90 }
91
92 CANENABLE(proc)
93 CANENABLE(sched)
94 CANENABLE(vminfo)
95 CANENABLE(sysinfo)
96
97 BEGIN
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
106 ERROR
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
114 proc:::exit
115 /progenyof(\$pid)/
116 {
117         exit(0);
118 }
119
120 tick-10ms
121 /i++ > 500/
122 {
123         printf("exit probe did not seem to fire\n");
124         exit(++err);
125 }
126 EOF