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
28#
29# This test verifies that USDT probes will be picked up after a dlopen(3C)
30# when a regex in the provider name matches both USDT probes and pid probes
31# (e.g., p*d$target matches both pid$target and pyramid$target.)
32#
33
34if [ $# != 1 ]; then
35	echo expected one argument: '<'dtrace-path'>'
36	exit 2
37fi
38
39dtrace=$1
40DIR=${TMPDIR:-/tmp}/dtest.$$
41
42mkdir $DIR
43cd $DIR
44
45cat > Makefile <<EOF
46all: main altlib.so
47
48main: main.o provmain.o
49	gcc -m32 -o main main.o provmain.o
50
51main.o: main.c prov.h
52	gcc -m32 -c main.c
53
54prov.h: prov.d
55	$dtrace -h -s prov.d
56
57provmain.o: prov.d main.o
58	$dtrace -G -32 -o provmain.o -s prov.d main.o
59
60altlib.so: altlib.o provalt.o
61	gcc -m32 -shared -o altlib.so altlib.o provalt.o -lc
62
63altlib.o: altlib.c prov.h
64	gcc -m32 -c altlib.c
65
66provalt.o: prov.d altlib.o
67	$dtrace -G -32 -o provalt.o -s prov.d altlib.o
68EOF
69
70cat > prov.d <<EOF
71provider pyramid {
72	probe entry();
73};
74EOF
75
76cat > altlib.c <<EOF
77#include <sys/sdt.h>
78#include "prov.h"
79
80void
81go(void)
82{
83	PYRAMID_ENTRY();
84}
85EOF
86
87cat > main.c <<EOF
88#include <dlfcn.h>
89#include <unistd.h>
90#include <stdio.h>
91#include <sys/sdt.h>
92#include "prov.h"
93
94void
95go(void)
96{
97	PYRAMID_ENTRY();
98}
99
100int
101main(int argc, char **argv)
102{
103	void *alt;
104	void *alt_go;
105
106	go();
107
108	if ((alt = dlopen("./altlib.so", RTLD_LAZY | RTLD_LOCAL)) 
109	    == NULL) {
110		printf("dlopen of altlib.so failed: %s\n", dlerror());
111		return (1);
112	}
113
114	if ((alt_go = dlsym(alt, "go")) == NULL) {
115		printf("failed to lookup 'go' in altlib.so\n");
116		return (1);
117	}
118
119	((void (*)(void))alt_go)();
120
121	return (0);
122}
123EOF
124
125make > /dev/null
126if [ $? -ne 0 ]; then
127	print -u2 "failed to build"
128	exit 1
129fi
130
131cat > main.d <<'EOF'
132p*d$target::go:entry
133{
134	@foo[probemod, probefunc, probename] = count();
135}
136
137END
138{
139	printa("%s:%s:%s %@u\n",@foo);
140}
141EOF
142
143script() {
144	$dtrace -q -s ./main.d -c ./main
145}
146
147script
148status=$?
149
150cd /tmp
151/usr/bin/rm -rf $DIR
152
153exit $status
154