1038dc6b3Sahl#!/bin/ksh -p
2038dc6b3Sahl#
3038dc6b3Sahl# CDDL HEADER START
4038dc6b3Sahl#
5038dc6b3Sahl# The contents of this file are subject to the terms of the
6038dc6b3Sahl# Common Development and Distribution License (the "License").
7038dc6b3Sahl# You may not use this file except in compliance with the License.
8038dc6b3Sahl#
9038dc6b3Sahl# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10038dc6b3Sahl# or http://www.opensolaris.org/os/licensing.
11038dc6b3Sahl# See the License for the specific language governing permissions
12038dc6b3Sahl# and limitations under the License.
13038dc6b3Sahl#
14038dc6b3Sahl# When distributing Covered Code, include this CDDL HEADER in each
15038dc6b3Sahl# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16038dc6b3Sahl# If applicable, add the following below this CDDL HEADER, with the
17038dc6b3Sahl# fields enclosed by brackets "[]" replaced with your own identifying
18038dc6b3Sahl# information: Portions Copyright [yyyy] [name of copyright owner]
19038dc6b3Sahl#
20038dc6b3Sahl# CDDL HEADER END
21038dc6b3Sahl#
22038dc6b3Sahl
23038dc6b3Sahl#
24038dc6b3Sahl# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
25038dc6b3Sahl# Use is subject to license terms.
26038dc6b3Sahl#
27038dc6b3Sahl
28038dc6b3Sahl#
29038dc6b3Sahl# This test verifies that performing a dlclose(3dl) on a library doesn't
30038dc6b3Sahl# cause existing pid provider probes to become invalid.
31038dc6b3Sahl#
32038dc6b3Sahl
33038dc6b3Sahlif [ $# != 1 ]; then
34038dc6b3Sahl	echo expected one argument: '<'dtrace-path'>'
35038dc6b3Sahl	exit 2
36038dc6b3Sahlfi
37038dc6b3Sahl
38038dc6b3Sahldtrace=$1
39038dc6b3SahlDIR=/var/tmp/dtest.$$
40038dc6b3Sahl
41038dc6b3Sahlmkdir $DIR
42038dc6b3Sahlcd $DIR
43038dc6b3Sahl
44038dc6b3Sahlcat > Makefile <<EOF
45038dc6b3Sahlall: main livelib.so deadlib.so
46038dc6b3Sahl
47038dc6b3Sahlmain: main.o prov.o
48*a386cc11SRobert Mustacchi	gcc -m32 -o main main.o
49038dc6b3Sahl
50038dc6b3Sahlmain.o: main.c
51*a386cc11SRobert Mustacchi	gcc -m32 -c main.c
52038dc6b3Sahl
53038dc6b3Sahl
54038dc6b3Sahllivelib.so: livelib.o prov.o
55*a386cc11SRobert Mustacchi	gcc -m32 -shared -o livelib.so livelib.o prov.o -lc
56038dc6b3Sahl
57038dc6b3Sahllivelib.o: livelib.c prov.h
58*a386cc11SRobert Mustacchi	gcc -m32 -fPIC -c livelib.c
59038dc6b3Sahl
60038dc6b3Sahlprov.o: livelib.o prov.d
61038dc6b3Sahl	$dtrace -G -s prov.d livelib.o
62038dc6b3Sahl
63038dc6b3Sahlprov.h: prov.d
64038dc6b3Sahl	$dtrace -h -s prov.d
65038dc6b3Sahl
66038dc6b3Sahl
67038dc6b3Sahldeadlib.so: deadlib.o
68*a386cc11SRobert Mustacchi	gcc -m32 -shared -o deadlib.so deadlib.o -lc
69038dc6b3Sahl
70038dc6b3Sahldeadlib.o: deadlib.c
71*a386cc11SRobert Mustacchi	gcc -m32 -fPIC -c deadlib.c
72038dc6b3Sahl
73038dc6b3Sahlclean:
74038dc6b3Sahl	rm -f main.o livelib.o prov.o prov.h deadlib.o
75038dc6b3Sahl
76038dc6b3Sahlclobber: clean
77038dc6b3Sahl	rm -f main livelib.so deadlib.so
78038dc6b3SahlEOF
79038dc6b3Sahl
80038dc6b3Sahlcat > prov.d <<EOF
81038dc6b3Sahlprovider test_prov {
82038dc6b3Sahl	probe go();
83038dc6b3Sahl};
84038dc6b3SahlEOF
85038dc6b3Sahl
86038dc6b3Sahlcat > livelib.c <<EOF
87038dc6b3Sahl#include "prov.h"
88038dc6b3Sahl
89038dc6b3Sahlvoid
90038dc6b3Sahlgo(void)
91038dc6b3Sahl{
92038dc6b3Sahl	TEST_PROV_GO();
93038dc6b3Sahl}
94038dc6b3SahlEOF
95038dc6b3Sahl
96038dc6b3Sahlcat > deadlib.c <<EOF
97038dc6b3Sahlvoid
98038dc6b3Sahlgo(void)
99038dc6b3Sahl{
100038dc6b3Sahl}
101038dc6b3SahlEOF
102038dc6b3Sahl
103038dc6b3Sahl
104038dc6b3Sahlcat > main.c <<EOF
105038dc6b3Sahl#include <dlfcn.h>
106038dc6b3Sahl#include <unistd.h>
107038dc6b3Sahl#include <stdio.h>
108038dc6b3Sahl
109038dc6b3Sahlstatic void
110038dc6b3Sahlfoo(void)
111038dc6b3Sahl{
112038dc6b3Sahl	(void) close(-1);
113038dc6b3Sahl}
114038dc6b3Sahl
115038dc6b3Sahlint
116038dc6b3Sahlmain(int argc, char **argv)
117038dc6b3Sahl{
118038dc6b3Sahl	void *live;
119038dc6b3Sahl
120038dc6b3Sahl	if ((live = dlopen("./livelib.so", RTLD_LAZY | RTLD_LOCAL)) == NULL) {
121038dc6b3Sahl		printf("dlopen of livelib.so failed: %s\n", dlerror());
122038dc6b3Sahl		return (1);
123038dc6b3Sahl	}
124038dc6b3Sahl
125038dc6b3Sahl	(void) dlclose(live);
126038dc6b3Sahl
127038dc6b3Sahl	foo();
128038dc6b3Sahl
129038dc6b3Sahl	return (0);
130038dc6b3Sahl}
131038dc6b3SahlEOF
132038dc6b3Sahl
133c090e5dfSBryan Cantrillmake > /dev/null
134038dc6b3Sahlif [ $? -ne 0 ]; then
135038dc6b3Sahl	print -u2 "failed to build"
136038dc6b3Sahl	exit 1
137038dc6b3Sahlfi
138038dc6b3Sahl
139038dc6b3Sahlscript() {
140038dc6b3Sahl	$dtrace -c ./main -s /dev/stdin <<EOF
141038dc6b3Sahl	pid\$target:a.out:foo:entry
142038dc6b3Sahl	{
143038dc6b3Sahl		gotit = 1;
144038dc6b3Sahl		exit(0);
145038dc6b3Sahl	}
146038dc6b3Sahl
147038dc6b3Sahl	tick-1s
148038dc6b3Sahl	/i++ == 5/
149038dc6b3Sahl	{
150038dc6b3Sahl		printf("test timed out");
151038dc6b3Sahl		exit(1);
152038dc6b3Sahl	}
153038dc6b3Sahl
154038dc6b3Sahl	END
155038dc6b3Sahl	/!gotit/
156038dc6b3Sahl	{
157038dc6b3Sahl		printf("program ended without hitting probe");
158038dc6b3Sahl		exit(1);
159038dc6b3Sahl	}
160038dc6b3SahlEOF
161038dc6b3Sahl}
162038dc6b3Sahl
163038dc6b3Sahlscript
164038dc6b3Sahlstatus=$?
165038dc6b3Sahl
166038dc6b3Sahlcd /
167038dc6b3Sahl/usr/bin/rm -rf $DIR
168038dc6b3Sahl
169038dc6b3Sahlexit $status
170