]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/pid/tst.provregex4.ksh
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / cddl / contrib / opensolaris / cmd / dtrace / test / tst / common / pid / tst.provregex4.ksh
1 #!/bin/ksh -p
2 #
3 # CDDL HEADER START
4 #
5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
8 #
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
13 #
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
19 #
20 # CDDL HEADER END
21 #
22
23 #
24 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
25 # Use is subject to license terms.
26 #
27 # ident "%Z%%M% %I%     %E% SMI"
28
29 #
30 # This test verifies that USDT probes will be picked up after a dlopen(3C)
31 # when a regex in the provider name matches both USDT probes and pid probes
32 # (e.g., p*d$target matches both pid$target and pyramid$target.)
33 #
34
35 if [ $# != 1 ]; then
36         echo expected one argument: '<'dtrace-path'>'
37         exit 2
38 fi
39
40 dtrace=$1
41 DIR=${TMPDIR:-/tmp}/dtest.$$
42
43 mkdir $DIR
44 cd $DIR
45
46 cat > Makefile <<EOF
47 all: main altlib.so
48
49 main: main.o provmain.o
50         cc -o main main.o provmain.o
51
52 main.o: main.c prov.h
53         cc -c main.c
54
55 prov.h: prov.d
56         $dtrace -h -s prov.d
57
58 provmain.o: prov.d main.o
59         $dtrace -G -32 -o provmain.o -s prov.d main.o
60
61 altlib.so: altlib.o provalt.o
62         cc -z defs -G -o altlib.so altlib.o provalt.o -lc
63
64 altlib.o: altlib.c prov.h
65         cc -c altlib.c
66
67 provalt.o: prov.d altlib.o
68         $dtrace -G -32 -o provalt.o -s prov.d altlib.o
69 EOF
70
71 cat > prov.d <<EOF
72 provider pyramid {
73         probe entry();
74 };
75 EOF
76
77 cat > altlib.c <<EOF
78 #include <sys/sdt.h>
79 #include "prov.h"
80
81 void
82 go(void)
83 {
84         PYRAMID_ENTRY();
85 }
86 EOF
87
88 cat > main.c <<EOF
89 #include <dlfcn.h>
90 #include <unistd.h>
91 #include <stdio.h>
92 #include <sys/sdt.h>
93 #include "prov.h"
94
95 void
96 go(void)
97 {
98         PYRAMID_ENTRY();
99 }
100
101 int
102 main(int argc, char **argv)
103 {
104         void *alt;
105         void *alt_go;
106
107         go();
108
109         if ((alt = dlopen("./altlib.so", RTLD_LAZY | RTLD_LOCAL)) 
110             == NULL) {
111                 printf("dlopen of altlib.so failed: %s\n", dlerror());
112                 return (1);
113         }
114
115         if ((alt_go = dlsym(alt, "go")) == NULL) {
116                 printf("failed to lookup 'go' in altlib.so\n");
117                 return (1);
118         }
119
120         ((void (*)(void))alt_go)();
121
122         return (0);
123 }
124 EOF
125
126 make > /dev/null
127 if [ $? -ne 0 ]; then
128         print -u2 "failed to build"
129         exit 1
130 fi
131
132 cat > main.d <<'EOF'
133 p*d$target::go:entry
134 {
135         @foo[probemod, probefunc, probename] = count();
136 }
137
138 END
139 {
140         printa("%s:%s:%s %@u\n",@foo);
141 }
142 EOF
143
144 script() {
145         $dtrace -q -s ./main.d -c ./main
146 }
147
148 script
149 status=$?
150
151 cd /tmp
152 /bin/rm -rf $DIR
153
154 exit $status