xref: /titanic_50/usr/src/cmd/tnf/prex/prbk.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright (c) 1994, by Sun Microsytems, Inc.
24*7c478bd9Sstevel@tonic-gate  */
25*7c478bd9Sstevel@tonic-gate 
26*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*7c478bd9Sstevel@tonic-gate 
28*7c478bd9Sstevel@tonic-gate #include <stdio.h>
29*7c478bd9Sstevel@tonic-gate #include <stdlib.h>
30*7c478bd9Sstevel@tonic-gate #include <unistd.h>
31*7c478bd9Sstevel@tonic-gate #include <string.h>	/* for strerror() */
32*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
33*7c478bd9Sstevel@tonic-gate #include <sys/stat.h>
34*7c478bd9Sstevel@tonic-gate #include <sys/tnf.h>
35*7c478bd9Sstevel@tonic-gate #include <fcntl.h>
36*7c478bd9Sstevel@tonic-gate #include <errno.h>
37*7c478bd9Sstevel@tonic-gate #include <locale.h>
38*7c478bd9Sstevel@tonic-gate 
39*7c478bd9Sstevel@tonic-gate #include "prbk.h"
40*7c478bd9Sstevel@tonic-gate 
41*7c478bd9Sstevel@tonic-gate #include <tnf/tnfctl.h>
42*7c478bd9Sstevel@tonic-gate 
43*7c478bd9Sstevel@tonic-gate extern tnfctl_handle_t *g_hndl;
44*7c478bd9Sstevel@tonic-gate 
45*7c478bd9Sstevel@tonic-gate typedef struct _pidlist {
46*7c478bd9Sstevel@tonic-gate 	pid_t pid;
47*7c478bd9Sstevel@tonic-gate 	struct _pidlist *next;
48*7c478bd9Sstevel@tonic-gate } pidlist_t;
49*7c478bd9Sstevel@tonic-gate 
50*7c478bd9Sstevel@tonic-gate static boolean_t check_kernelmode(tnfctl_trace_attrs_t *attrs_p);
51*7c478bd9Sstevel@tonic-gate 
52*7c478bd9Sstevel@tonic-gate static boolean_t
check_kernelmode(tnfctl_trace_attrs_t * attrs_p)53*7c478bd9Sstevel@tonic-gate check_kernelmode(tnfctl_trace_attrs_t *attrs_p)
54*7c478bd9Sstevel@tonic-gate {
55*7c478bd9Sstevel@tonic-gate 	extern int g_kernelmode;
56*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t err;
57*7c478bd9Sstevel@tonic-gate 
58*7c478bd9Sstevel@tonic-gate 	if (!g_kernelmode) {
59*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, gettext(
60*7c478bd9Sstevel@tonic-gate 			"This command is only available "
61*7c478bd9Sstevel@tonic-gate 			"in kernel mode (prex invoked with the -k flag)\n"));
62*7c478bd9Sstevel@tonic-gate 		return (B_TRUE);
63*7c478bd9Sstevel@tonic-gate 	}
64*7c478bd9Sstevel@tonic-gate 	if (attrs_p) {
65*7c478bd9Sstevel@tonic-gate 		err = tnfctl_trace_attrs_get(g_hndl, attrs_p);
66*7c478bd9Sstevel@tonic-gate 		if (err) {
67*7c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr, gettext(
68*7c478bd9Sstevel@tonic-gate 				"error on checking trace attributes : %s\n"),
69*7c478bd9Sstevel@tonic-gate 				tnfctl_strerror(err));
70*7c478bd9Sstevel@tonic-gate 			return (B_TRUE);
71*7c478bd9Sstevel@tonic-gate 		}
72*7c478bd9Sstevel@tonic-gate 	}
73*7c478bd9Sstevel@tonic-gate 	return (B_FALSE);
74*7c478bd9Sstevel@tonic-gate }
75*7c478bd9Sstevel@tonic-gate 
76*7c478bd9Sstevel@tonic-gate /*
77*7c478bd9Sstevel@tonic-gate  * Print trace buffer status (is one allocated, and if so, how big is it.
78*7c478bd9Sstevel@tonic-gate  */
79*7c478bd9Sstevel@tonic-gate void
prbk_buffer_list()80*7c478bd9Sstevel@tonic-gate prbk_buffer_list()
81*7c478bd9Sstevel@tonic-gate {
82*7c478bd9Sstevel@tonic-gate 	tnfctl_trace_attrs_t	attrs;
83*7c478bd9Sstevel@tonic-gate 
84*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(&attrs))
85*7c478bd9Sstevel@tonic-gate 		return;
86*7c478bd9Sstevel@tonic-gate 	if (attrs.trace_buf_state == TNFCTL_BUF_NONE) {
87*7c478bd9Sstevel@tonic-gate 		(void) printf(gettext("No trace buffer allocated\n"));
88*7c478bd9Sstevel@tonic-gate 	} else {
89*7c478bd9Sstevel@tonic-gate 		(void) printf(gettext("Trace buffer size is %d bytes\n"),
90*7c478bd9Sstevel@tonic-gate 			attrs.trace_buf_size);
91*7c478bd9Sstevel@tonic-gate 		if (attrs.trace_buf_state == TNFCTL_BUF_BROKEN) {
92*7c478bd9Sstevel@tonic-gate 			(void) printf(gettext("Tracing system has failed -- "
93*7c478bd9Sstevel@tonic-gate 				"tracing suspended\n"));
94*7c478bd9Sstevel@tonic-gate 		}
95*7c478bd9Sstevel@tonic-gate 	}
96*7c478bd9Sstevel@tonic-gate }
97*7c478bd9Sstevel@tonic-gate 
98*7c478bd9Sstevel@tonic-gate 
99*7c478bd9Sstevel@tonic-gate /*
100*7c478bd9Sstevel@tonic-gate  * Allocate a trace buffer.  Check for reasonable size; reject if there's
101*7c478bd9Sstevel@tonic-gate  * already a buffer.
102*7c478bd9Sstevel@tonic-gate  */
103*7c478bd9Sstevel@tonic-gate void
prbk_buffer_alloc(int size)104*7c478bd9Sstevel@tonic-gate prbk_buffer_alloc(int size)
105*7c478bd9Sstevel@tonic-gate {
106*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t	err;
107*7c478bd9Sstevel@tonic-gate 	tnfctl_trace_attrs_t	attrs;
108*7c478bd9Sstevel@tonic-gate 
109*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(&attrs))
110*7c478bd9Sstevel@tonic-gate 		return;
111*7c478bd9Sstevel@tonic-gate 
112*7c478bd9Sstevel@tonic-gate 	if (attrs.trace_buf_state != TNFCTL_BUF_NONE) {
113*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
114*7c478bd9Sstevel@tonic-gate 			gettext("There is already a buffer allocated\n"));
115*7c478bd9Sstevel@tonic-gate 		return;
116*7c478bd9Sstevel@tonic-gate 	}
117*7c478bd9Sstevel@tonic-gate 	if (size < attrs.trace_min_size) {
118*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, gettext(
119*7c478bd9Sstevel@tonic-gate 			"Size %d is less than the minimum buffer size of %d -- "
120*7c478bd9Sstevel@tonic-gate 			"buffer size set to %d bytes\n"),
121*7c478bd9Sstevel@tonic-gate 			size, attrs.trace_min_size, attrs.trace_min_size);
122*7c478bd9Sstevel@tonic-gate 		size = attrs.trace_min_size;
123*7c478bd9Sstevel@tonic-gate 	}
124*7c478bd9Sstevel@tonic-gate 
125*7c478bd9Sstevel@tonic-gate 	err = tnfctl_buffer_alloc(g_hndl, NULL, size);
126*7c478bd9Sstevel@tonic-gate 	if (err) {
127*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
128*7c478bd9Sstevel@tonic-gate 			gettext("error in allocating buffer: %s\n"),
129*7c478bd9Sstevel@tonic-gate 			tnfctl_strerror(err));
130*7c478bd9Sstevel@tonic-gate 		return;
131*7c478bd9Sstevel@tonic-gate 	}
132*7c478bd9Sstevel@tonic-gate 
133*7c478bd9Sstevel@tonic-gate 	/* get the trace attributes again */
134*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(&attrs))
135*7c478bd9Sstevel@tonic-gate 		return;
136*7c478bd9Sstevel@tonic-gate 	(void) printf(gettext("Buffer of size %d bytes allocated\n"),
137*7c478bd9Sstevel@tonic-gate 			attrs.trace_buf_size);
138*7c478bd9Sstevel@tonic-gate }
139*7c478bd9Sstevel@tonic-gate 
140*7c478bd9Sstevel@tonic-gate 
141*7c478bd9Sstevel@tonic-gate /*
142*7c478bd9Sstevel@tonic-gate  * Deallocate the kernel's trace buffer.
143*7c478bd9Sstevel@tonic-gate  */
144*7c478bd9Sstevel@tonic-gate void
prbk_buffer_dealloc()145*7c478bd9Sstevel@tonic-gate prbk_buffer_dealloc()
146*7c478bd9Sstevel@tonic-gate {
147*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t	err;
148*7c478bd9Sstevel@tonic-gate 
149*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(NULL))
150*7c478bd9Sstevel@tonic-gate 		return;
151*7c478bd9Sstevel@tonic-gate 
152*7c478bd9Sstevel@tonic-gate 	err = tnfctl_buffer_dealloc(g_hndl);
153*7c478bd9Sstevel@tonic-gate 	switch (err) {
154*7c478bd9Sstevel@tonic-gate 	case (TNFCTL_ERR_NONE):
155*7c478bd9Sstevel@tonic-gate 		(void) printf(gettext("buffer deallocated\n"));
156*7c478bd9Sstevel@tonic-gate 		break;
157*7c478bd9Sstevel@tonic-gate 	case (TNFCTL_ERR_NOBUF):
158*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
159*7c478bd9Sstevel@tonic-gate 			gettext("There is no buffer to deallocate\n"));
160*7c478bd9Sstevel@tonic-gate 		break;
161*7c478bd9Sstevel@tonic-gate 	case (TNFCTL_ERR_BADDEALLOC):
162*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
163*7c478bd9Sstevel@tonic-gate 			gettext("Can't deallocate the buffer when "
164*7c478bd9Sstevel@tonic-gate 			"tracing is active\n"));
165*7c478bd9Sstevel@tonic-gate 		break;
166*7c478bd9Sstevel@tonic-gate 	default:
167*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
168*7c478bd9Sstevel@tonic-gate 			gettext("error in deleting buffer: %s\n"),
169*7c478bd9Sstevel@tonic-gate 			tnfctl_strerror(err));
170*7c478bd9Sstevel@tonic-gate 		break;
171*7c478bd9Sstevel@tonic-gate 	}
172*7c478bd9Sstevel@tonic-gate }
173*7c478bd9Sstevel@tonic-gate 
174*7c478bd9Sstevel@tonic-gate 
175*7c478bd9Sstevel@tonic-gate /*
176*7c478bd9Sstevel@tonic-gate  * Process filter routines.
177*7c478bd9Sstevel@tonic-gate  *
178*7c478bd9Sstevel@tonic-gate  * Process id sets are encoded as "pidlists":  a linked list of pids.
179*7c478bd9Sstevel@tonic-gate  * In a feeble attempt at encapsulation, the pidlist_t type is private
180*7c478bd9Sstevel@tonic-gate  * to this file; prexgram.y manipulates pidlists only as opaque handles.
181*7c478bd9Sstevel@tonic-gate  */
182*7c478bd9Sstevel@tonic-gate 
183*7c478bd9Sstevel@tonic-gate /*
184*7c478bd9Sstevel@tonic-gate  * Add the given pid (new) to the pidlist (pl).
185*7c478bd9Sstevel@tonic-gate  */
186*7c478bd9Sstevel@tonic-gate void *
prbk_pidlist_add(void * pl,int new)187*7c478bd9Sstevel@tonic-gate prbk_pidlist_add(void *pl, int new)
188*7c478bd9Sstevel@tonic-gate 
189*7c478bd9Sstevel@tonic-gate {
190*7c478bd9Sstevel@tonic-gate 	pidlist_t *npl = (pidlist_t *) malloc(sizeof (*npl));
191*7c478bd9Sstevel@tonic-gate 
192*7c478bd9Sstevel@tonic-gate 	if (npl == NULL) {
193*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
194*7c478bd9Sstevel@tonic-gate 			gettext("Out of memory -- can't process pid %d\n"),
195*7c478bd9Sstevel@tonic-gate 			new);
196*7c478bd9Sstevel@tonic-gate 		return (pl);
197*7c478bd9Sstevel@tonic-gate 	}
198*7c478bd9Sstevel@tonic-gate 	npl->next = pl;
199*7c478bd9Sstevel@tonic-gate 	npl->pid = new;
200*7c478bd9Sstevel@tonic-gate 	return (npl);
201*7c478bd9Sstevel@tonic-gate }
202*7c478bd9Sstevel@tonic-gate 
203*7c478bd9Sstevel@tonic-gate /*
204*7c478bd9Sstevel@tonic-gate  * Add the pids in the given pidlist to the process filter list.
205*7c478bd9Sstevel@tonic-gate  * For each pid, check whether it's already in the filter list,
206*7c478bd9Sstevel@tonic-gate  * and whether the process exists.
207*7c478bd9Sstevel@tonic-gate  */
208*7c478bd9Sstevel@tonic-gate void
prbk_pfilter_add(void * pl)209*7c478bd9Sstevel@tonic-gate prbk_pfilter_add(void *pl)
210*7c478bd9Sstevel@tonic-gate {
211*7c478bd9Sstevel@tonic-gate 	pidlist_t *ppl = (pidlist_t *) pl;
212*7c478bd9Sstevel@tonic-gate 	pidlist_t *tmp;
213*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t err;
214*7c478bd9Sstevel@tonic-gate 
215*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(NULL))
216*7c478bd9Sstevel@tonic-gate 		return;
217*7c478bd9Sstevel@tonic-gate 	while (ppl != NULL) {
218*7c478bd9Sstevel@tonic-gate 		err = tnfctl_filter_list_add(g_hndl, ppl->pid);
219*7c478bd9Sstevel@tonic-gate 		if (err) {
220*7c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr, gettext("Process %ld: %s\n"),
221*7c478bd9Sstevel@tonic-gate 				ppl->pid, tnfctl_strerror(err));
222*7c478bd9Sstevel@tonic-gate 		}
223*7c478bd9Sstevel@tonic-gate 		tmp = ppl;
224*7c478bd9Sstevel@tonic-gate 		ppl = ppl->next;
225*7c478bd9Sstevel@tonic-gate 		free(tmp);
226*7c478bd9Sstevel@tonic-gate 	}
227*7c478bd9Sstevel@tonic-gate }
228*7c478bd9Sstevel@tonic-gate 
229*7c478bd9Sstevel@tonic-gate /*
230*7c478bd9Sstevel@tonic-gate  * Drop the pids in the given pidlist from the process filter list.
231*7c478bd9Sstevel@tonic-gate  * For each pid, complain if it's not in the process filter list;
232*7c478bd9Sstevel@tonic-gate  * and if the process no longer exists (and hence has already implicitly
233*7c478bd9Sstevel@tonic-gate  * been dropped from the process filter list), say so.
234*7c478bd9Sstevel@tonic-gate  */
235*7c478bd9Sstevel@tonic-gate void
prbk_pfilter_drop(void * pl)236*7c478bd9Sstevel@tonic-gate prbk_pfilter_drop(void *pl)
237*7c478bd9Sstevel@tonic-gate {
238*7c478bd9Sstevel@tonic-gate 	pidlist_t *ppl = (pidlist_t *) pl;
239*7c478bd9Sstevel@tonic-gate 	pidlist_t *tmp;
240*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t err;
241*7c478bd9Sstevel@tonic-gate 
242*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(NULL))
243*7c478bd9Sstevel@tonic-gate 		return;
244*7c478bd9Sstevel@tonic-gate 
245*7c478bd9Sstevel@tonic-gate 	while (ppl != NULL) {
246*7c478bd9Sstevel@tonic-gate 		tmp = ppl;
247*7c478bd9Sstevel@tonic-gate 		err = tnfctl_filter_list_delete(g_hndl, tmp->pid);
248*7c478bd9Sstevel@tonic-gate 		switch (err) {
249*7c478bd9Sstevel@tonic-gate 		case (TNFCTL_ERR_NONE):
250*7c478bd9Sstevel@tonic-gate 			break;
251*7c478bd9Sstevel@tonic-gate 		case (TNFCTL_ERR_BADARG):
252*7c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr,
253*7c478bd9Sstevel@tonic-gate 				gettext("Process %ld is not being traced\n"),
254*7c478bd9Sstevel@tonic-gate 				tmp->pid);
255*7c478bd9Sstevel@tonic-gate 			break;
256*7c478bd9Sstevel@tonic-gate 		case (TNFCTL_ERR_NOPROCESS):
257*7c478bd9Sstevel@tonic-gate 			(void) printf(gettext("Process %ld has exited\n"),
258*7c478bd9Sstevel@tonic-gate 					tmp->pid);
259*7c478bd9Sstevel@tonic-gate 			break;
260*7c478bd9Sstevel@tonic-gate 		default:
261*7c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr, gettext("Process %ld: %s\n"),
262*7c478bd9Sstevel@tonic-gate 				tmp->pid, tnfctl_strerror(err));
263*7c478bd9Sstevel@tonic-gate 			break;
264*7c478bd9Sstevel@tonic-gate 		}
265*7c478bd9Sstevel@tonic-gate 		ppl = ppl->next;
266*7c478bd9Sstevel@tonic-gate 		free(tmp);
267*7c478bd9Sstevel@tonic-gate 	}
268*7c478bd9Sstevel@tonic-gate }
269*7c478bd9Sstevel@tonic-gate 
270*7c478bd9Sstevel@tonic-gate /*
271*7c478bd9Sstevel@tonic-gate  * Turn process filter mode on or off.  The process filter is maintained
272*7c478bd9Sstevel@tonic-gate  * even when process filtering is off, but has no effect:  all processes
273*7c478bd9Sstevel@tonic-gate  * are traced.
274*7c478bd9Sstevel@tonic-gate  */
275*7c478bd9Sstevel@tonic-gate void
prbk_set_pfilter_mode(boolean_t onoff)276*7c478bd9Sstevel@tonic-gate prbk_set_pfilter_mode(boolean_t onoff)
277*7c478bd9Sstevel@tonic-gate {
278*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t	err;
279*7c478bd9Sstevel@tonic-gate 
280*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(NULL))
281*7c478bd9Sstevel@tonic-gate 		return;
282*7c478bd9Sstevel@tonic-gate 	err = tnfctl_filter_state_set(g_hndl, onoff);
283*7c478bd9Sstevel@tonic-gate 	if (err) {
284*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, gettext("pfilter: %s\n"),
285*7c478bd9Sstevel@tonic-gate 			tnfctl_strerror(err));
286*7c478bd9Sstevel@tonic-gate 	}
287*7c478bd9Sstevel@tonic-gate }
288*7c478bd9Sstevel@tonic-gate 
289*7c478bd9Sstevel@tonic-gate 
290*7c478bd9Sstevel@tonic-gate /*
291*7c478bd9Sstevel@tonic-gate  * Report whether process filter mode is currently on or off, and
292*7c478bd9Sstevel@tonic-gate  * dump the current process filter set.
293*7c478bd9Sstevel@tonic-gate  */
294*7c478bd9Sstevel@tonic-gate void
prbk_show_pfilter_mode()295*7c478bd9Sstevel@tonic-gate prbk_show_pfilter_mode()
296*7c478bd9Sstevel@tonic-gate {
297*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t	err;
298*7c478bd9Sstevel@tonic-gate 	tnfctl_trace_attrs_t	attrs;
299*7c478bd9Sstevel@tonic-gate 	pid_t			*pids_p;
300*7c478bd9Sstevel@tonic-gate 	int			i, pid_count;
301*7c478bd9Sstevel@tonic-gate 	pid_t			*cur_pid;
302*7c478bd9Sstevel@tonic-gate 
303*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(&attrs))
304*7c478bd9Sstevel@tonic-gate 		return;
305*7c478bd9Sstevel@tonic-gate 	(void) printf(gettext("Process filtering is %s\n"),
306*7c478bd9Sstevel@tonic-gate 		attrs.filter_state ? "on" : "off");
307*7c478bd9Sstevel@tonic-gate 	err = tnfctl_filter_list_get(g_hndl, &pids_p, &pid_count);
308*7c478bd9Sstevel@tonic-gate 	if (err) {
309*7c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
310*7c478bd9Sstevel@tonic-gate 			gettext("error in getting process filter list: %s\n"),
311*7c478bd9Sstevel@tonic-gate 			tnfctl_strerror(err));
312*7c478bd9Sstevel@tonic-gate 		return;
313*7c478bd9Sstevel@tonic-gate 	}
314*7c478bd9Sstevel@tonic-gate 	(void) printf(gettext("Process filter set is "));
315*7c478bd9Sstevel@tonic-gate 	if (pid_count == 0)
316*7c478bd9Sstevel@tonic-gate 		(void) printf("empty.\n");
317*7c478bd9Sstevel@tonic-gate 	else {
318*7c478bd9Sstevel@tonic-gate 		(void) printf("{");
319*7c478bd9Sstevel@tonic-gate 		cur_pid = pids_p;
320*7c478bd9Sstevel@tonic-gate 		for (i = 0; i < pid_count; i++, cur_pid++) {
321*7c478bd9Sstevel@tonic-gate 			(void) printf("%ld%s", *cur_pid,
322*7c478bd9Sstevel@tonic-gate 			    (i != (pid_count - 1)) ? ", " : "}\n");
323*7c478bd9Sstevel@tonic-gate 		}
324*7c478bd9Sstevel@tonic-gate 	}
325*7c478bd9Sstevel@tonic-gate }
326*7c478bd9Sstevel@tonic-gate 
327*7c478bd9Sstevel@tonic-gate /*
328*7c478bd9Sstevel@tonic-gate  * Check for process filtering on with empty pid filter.
329*7c478bd9Sstevel@tonic-gate  */
330*7c478bd9Sstevel@tonic-gate void
prbk_warn_pfilter_empty(void)331*7c478bd9Sstevel@tonic-gate prbk_warn_pfilter_empty(void)
332*7c478bd9Sstevel@tonic-gate {
333*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t	err;
334*7c478bd9Sstevel@tonic-gate 	pid_t		*pids_p;
335*7c478bd9Sstevel@tonic-gate 	int			pid_count;
336*7c478bd9Sstevel@tonic-gate 	tnfctl_trace_attrs_t	attrs;
337*7c478bd9Sstevel@tonic-gate 
338*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(&attrs))
339*7c478bd9Sstevel@tonic-gate 		return;
340*7c478bd9Sstevel@tonic-gate 	if (attrs.filter_state) {
341*7c478bd9Sstevel@tonic-gate 		err = tnfctl_filter_list_get(g_hndl, &pids_p, &pid_count);
342*7c478bd9Sstevel@tonic-gate 		if (err) {
343*7c478bd9Sstevel@tonic-gate 		    (void) fprintf(stderr,
344*7c478bd9Sstevel@tonic-gate 			gettext("error in getting process filter list: %s\n"),
345*7c478bd9Sstevel@tonic-gate 			tnfctl_strerror(err));
346*7c478bd9Sstevel@tonic-gate 		    return;
347*7c478bd9Sstevel@tonic-gate 		}
348*7c478bd9Sstevel@tonic-gate 		if (!pid_count)
349*7c478bd9Sstevel@tonic-gate 		    (void) fprintf(stderr,
350*7c478bd9Sstevel@tonic-gate 			gettext("Warning: Process filtering on, \
351*7c478bd9Sstevel@tonic-gate but pid filter list is empty\n"));
352*7c478bd9Sstevel@tonic-gate 	}
353*7c478bd9Sstevel@tonic-gate }
354*7c478bd9Sstevel@tonic-gate 
355*7c478bd9Sstevel@tonic-gate 
356*7c478bd9Sstevel@tonic-gate /*
357*7c478bd9Sstevel@tonic-gate  * Turn kernel tracing on or off.
358*7c478bd9Sstevel@tonic-gate  */
359*7c478bd9Sstevel@tonic-gate void
prbk_set_tracing(boolean_t onoff)360*7c478bd9Sstevel@tonic-gate prbk_set_tracing(boolean_t onoff)
361*7c478bd9Sstevel@tonic-gate {
362*7c478bd9Sstevel@tonic-gate 	tnfctl_errcode_t	err;
363*7c478bd9Sstevel@tonic-gate 
364*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(NULL))
365*7c478bd9Sstevel@tonic-gate 	    return;
366*7c478bd9Sstevel@tonic-gate 
367*7c478bd9Sstevel@tonic-gate 	err = tnfctl_trace_state_set(g_hndl, onoff);
368*7c478bd9Sstevel@tonic-gate 	if (err) {
369*7c478bd9Sstevel@tonic-gate 	    (void) fprintf(stderr,
370*7c478bd9Sstevel@tonic-gate 		gettext("error in setting tracing state: %s\n"),
371*7c478bd9Sstevel@tonic-gate 		tnfctl_strerror(err));
372*7c478bd9Sstevel@tonic-gate 	}
373*7c478bd9Sstevel@tonic-gate }
374*7c478bd9Sstevel@tonic-gate 
375*7c478bd9Sstevel@tonic-gate /*
376*7c478bd9Sstevel@tonic-gate  * Show whether kernel tracing is currently on or off.
377*7c478bd9Sstevel@tonic-gate  */
378*7c478bd9Sstevel@tonic-gate void
prbk_show_tracing()379*7c478bd9Sstevel@tonic-gate prbk_show_tracing()
380*7c478bd9Sstevel@tonic-gate {
381*7c478bd9Sstevel@tonic-gate 	tnfctl_trace_attrs_t	attrs;
382*7c478bd9Sstevel@tonic-gate 
383*7c478bd9Sstevel@tonic-gate 	if (check_kernelmode(&attrs))
384*7c478bd9Sstevel@tonic-gate 		return;
385*7c478bd9Sstevel@tonic-gate 	(void) printf(gettext("Tracing is %s\n"),
386*7c478bd9Sstevel@tonic-gate 		attrs.trace_state ? "on" : "off");
387*7c478bd9Sstevel@tonic-gate }
388