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