xref: /titanic_52/usr/src/cmd/tnf/prex/help.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 <strings.h>
30*7c478bd9Sstevel@tonic-gate #include "expr.h"
31*7c478bd9Sstevel@tonic-gate #include "y.tab.h"
32*7c478bd9Sstevel@tonic-gate 
33*7c478bd9Sstevel@tonic-gate #define	NUMHELPTOPICS	6
34*7c478bd9Sstevel@tonic-gate static char *helptopics[NUMHELPTOPICS] = {
35*7c478bd9Sstevel@tonic-gate 	"intro", "functions", "kernel_mode", "probe_spec", "processes",
36*7c478bd9Sstevel@tonic-gate 	"set_spec" };
37*7c478bd9Sstevel@tonic-gate static char *helptopicstrings[NUMHELPTOPICS] = {
38*7c478bd9Sstevel@tonic-gate /* help intro */
39*7c478bd9Sstevel@tonic-gate "Introduction to prex\n"
40*7c478bd9Sstevel@tonic-gate "\n"
41*7c478bd9Sstevel@tonic-gate "prex is used to control probes in a target process, or in the kernel.\n"
42*7c478bd9Sstevel@tonic-gate "If you are reading this help text, you have sucessfully invoked prex,\n"
43*7c478bd9Sstevel@tonic-gate "by either connecting to an existing process (prex -p), a new\n"
44*7c478bd9Sstevel@tonic-gate "process (prex myprogram), or to the kernel (prex -k).\n"
45*7c478bd9Sstevel@tonic-gate "\n"
46*7c478bd9Sstevel@tonic-gate "Most often, the user will want to enable some probes in the target,\n"
47*7c478bd9Sstevel@tonic-gate "continue the target - either to completion, or until the target is\n"
48*7c478bd9Sstevel@tonic-gate "interrupted - and then exit from prex to perform analysis on the resulting\n"
49*7c478bd9Sstevel@tonic-gate "tracefile.  An ascii dump of the tracefile can be obtained using the\n"
50*7c478bd9Sstevel@tonic-gate "tnfdump(1) command.\n"
51*7c478bd9Sstevel@tonic-gate "\n"
52*7c478bd9Sstevel@tonic-gate "The tracefile can be found in /tmp/trace-<pid> by default, or in a location\n"
53*7c478bd9Sstevel@tonic-gate "of your choice, if you specify the -o option when you invoke prex.\n"
54*7c478bd9Sstevel@tonic-gate "You can query the name of the current trace file by using the command.\n"
55*7c478bd9Sstevel@tonic-gate "list tracefile.\n"
56*7c478bd9Sstevel@tonic-gate "\n"
57*7c478bd9Sstevel@tonic-gate "Upon invocation, prex reads commands from the files ~/.prexrc and\n"
58*7c478bd9Sstevel@tonic-gate "./.prexrc (in that order).  The \"source\" command may be used to take\n"
59*7c478bd9Sstevel@tonic-gate "commands from an arbitrary file or set of files.\n"
60*7c478bd9Sstevel@tonic-gate "\n"
61*7c478bd9Sstevel@tonic-gate "Help is available for a variety of topics, and for each prex command.\n"
62*7c478bd9Sstevel@tonic-gate "Type help with no arguments for a list of available help topics.\n"
63*7c478bd9Sstevel@tonic-gate "\n"
64*7c478bd9Sstevel@tonic-gate "end of help for topic intro\n",
65*7c478bd9Sstevel@tonic-gate /* help functions */
66*7c478bd9Sstevel@tonic-gate "Probe Functions\n"
67*7c478bd9Sstevel@tonic-gate "\n"
68*7c478bd9Sstevel@tonic-gate "Note - probe functions are not available from kernel mode\n"
69*7c478bd9Sstevel@tonic-gate "\n"
70*7c478bd9Sstevel@tonic-gate "It is possible to use prex to connect functions to probe points, such that\n"
71*7c478bd9Sstevel@tonic-gate "the function is invoked each time a given probe point is hit.  Currently,\n"
72*7c478bd9Sstevel@tonic-gate "the only function available from prex is the &debug function, which prints\n"
73*7c478bd9Sstevel@tonic-gate "out the arguments sent in to the probe, as well as the value (if any)\n"
74*7c478bd9Sstevel@tonic-gate "associated with the sunw%debug attribute in the detail field.\n"
75*7c478bd9Sstevel@tonic-gate "\n"
76*7c478bd9Sstevel@tonic-gate "Relevant commands:\n"
77*7c478bd9Sstevel@tonic-gate "    list fcns                    # list the defined probe functions\n"
78*7c478bd9Sstevel@tonic-gate "    connect &debug name=myprobe  # attach probe &debug to probe myprobe\n"
79*7c478bd9Sstevel@tonic-gate "    connect &debug $myset        # attach probe &debug to probes in $myset\n"
80*7c478bd9Sstevel@tonic-gate "    clear name=myprobe           # disconnect probe functions from myprobe\n"
81*7c478bd9Sstevel@tonic-gate "    clear $myset                 # disconnect probe functions from $myset\n"
82*7c478bd9Sstevel@tonic-gate "\n"
83*7c478bd9Sstevel@tonic-gate "end of help for topic functions\n",
84*7c478bd9Sstevel@tonic-gate /* help kernel_mode */
85*7c478bd9Sstevel@tonic-gate "Controlling Kernel Probes\n"
86*7c478bd9Sstevel@tonic-gate "\n"
87*7c478bd9Sstevel@tonic-gate "The Solaris kernel is instrumented with a small number of strategically\n"
88*7c478bd9Sstevel@tonic-gate "placed probes, documented in tnf_kernel_probes(4).  The superuser can\n"
89*7c478bd9Sstevel@tonic-gate "control these probes by running prex with the \"-k\" option.\n"
90*7c478bd9Sstevel@tonic-gate "\n"
91*7c478bd9Sstevel@tonic-gate "In kernel mode, trace output is written to an in-core buffer, rather\n"
92*7c478bd9Sstevel@tonic-gate "than to a file on disk.  This buffer can be extracted with the tnfxtract(1)\n"
93*7c478bd9Sstevel@tonic-gate "commmand.  This buffer must be set up before tracing can begin, through the\n"
94*7c478bd9Sstevel@tonic-gate "use of the \"buffer alloc\" command.  After kernel tracing is complete (and\n"
95*7c478bd9Sstevel@tonic-gate "after the buffer has been extracted), the buffer can be deallocated from\n"
96*7c478bd9Sstevel@tonic-gate "prex using the \"buffer dealloc\" command.\n"
97*7c478bd9Sstevel@tonic-gate "\n"
98*7c478bd9Sstevel@tonic-gate "As in user mode, kernel probe control is accomplished using the commands\n"
99*7c478bd9Sstevel@tonic-gate "\"trace\", \"untrace\", \"enable\", and \"disable\".  Additionally, in\n"
100*7c478bd9Sstevel@tonic-gate "kernel mode, a \"master switch\" is provided to turn all tracing activity\n"
101*7c478bd9Sstevel@tonic-gate "on or off.  This switch is toggled using the commands \"ktrace on\" and\n"
102*7c478bd9Sstevel@tonic-gate "\"ktrace off\".  Unlike user mode, where the target is stopped while\n"
103*7c478bd9Sstevel@tonic-gate "tracing paramaters are manipulated from prex, the kernel does not stop\n"
104*7c478bd9Sstevel@tonic-gate "running during a tracing session.  Using the \"ktrace\" command, one can\n"
105*7c478bd9Sstevel@tonic-gate "set up all tracing parameters in advance of a session, without actually\n"
106*7c478bd9Sstevel@tonic-gate "writing trace records until a \"ktrace on\" command is given.\n"
107*7c478bd9Sstevel@tonic-gate "\n"
108*7c478bd9Sstevel@tonic-gate "Kernel mode also provides the ability to limit tracing to those kernel\n"
109*7c478bd9Sstevel@tonic-gate "probes hit on behalf of a specific user process.  The pfilter command\n"
110*7c478bd9Sstevel@tonic-gate "is provided to toggle process filtering on or off, and to specify the\n"
111*7c478bd9Sstevel@tonic-gate "set of processes that comprise the filter.  If pid 0 is a member of the\n"
112*7c478bd9Sstevel@tonic-gate "filter list, then any threads not associated with a process are included.\n"
113*7c478bd9Sstevel@tonic-gate "\n"
114*7c478bd9Sstevel@tonic-gate "Note that after a kernel tracing session, all tracing parameters are left\n"
115*7c478bd9Sstevel@tonic-gate "as-is.  One should re-enter prex to disable and untrace probes, turn off\n"
116*7c478bd9Sstevel@tonic-gate "process filtering, and deallocate the in-core trace buffer.\n"
117*7c478bd9Sstevel@tonic-gate "\n"
118*7c478bd9Sstevel@tonic-gate "Relevant Commands:\n"
119*7c478bd9Sstevel@tonic-gate "    buffer alloc 2m    # allocate a 2M in-core buffer\n"
120*7c478bd9Sstevel@tonic-gate "    enable $all        # enable all kernel probes\n"
121*7c478bd9Sstevel@tonic-gate "    trace $all         # trace all kernel probes\n"
122*7c478bd9Sstevel@tonic-gate "    ktrace on          # turn on kernel tracing\n"
123*7c478bd9Sstevel@tonic-gate "    pfilter add 1234   # add pid 1234 to the filter list\n"
124*7c478bd9Sstevel@tonic-gate "    pfilter on         # turn on process filtering\n"
125*7c478bd9Sstevel@tonic-gate "    ktrace off         # turn off kernel tracing\n"
126*7c478bd9Sstevel@tonic-gate "Also see tnfxtract(1), which is used to extract the in-core trace buffer\n"
127*7c478bd9Sstevel@tonic-gate "to an on-disk tracefile.\n"
128*7c478bd9Sstevel@tonic-gate "\n"
129*7c478bd9Sstevel@tonic-gate "end of help for topic kernel_mode\n",
130*7c478bd9Sstevel@tonic-gate /* help probe_spec */
131*7c478bd9Sstevel@tonic-gate "Probe Specification\n"
132*7c478bd9Sstevel@tonic-gate "\n"
133*7c478bd9Sstevel@tonic-gate "Many prex commands operate on probes or sets of probes.  Probes are\n"
134*7c478bd9Sstevel@tonic-gate "specified by a list of space-separated selectors of the form:\n"
135*7c478bd9Sstevel@tonic-gate "      <attribute>=<value>\n"
136*7c478bd9Sstevel@tonic-gate "If the \""
137*7c478bd9Sstevel@tonic-gate "<attribute>=\" is omitted, the attribute defaults to \"keys=\".\n"
138*7c478bd9Sstevel@tonic-gate "The \""
139*7c478bd9Sstevel@tonic-gate "<value>\" can be either a string or an ed(1) regular expression\n"
140*7c478bd9Sstevel@tonic-gate "enclosed in slashes.  Regular expressions in prex are unanchored, meaning\n"
141*7c478bd9Sstevel@tonic-gate "that any value that contains the given regex as a substring is a valid\n"
142*7c478bd9Sstevel@tonic-gate "match, regardless of position.  To anchor a regular expression, use \"^\"\n"
143*7c478bd9Sstevel@tonic-gate "to match the beginning of a line, or \"$\" to match the end of a line.\n"
144*7c478bd9Sstevel@tonic-gate 
145*7c478bd9Sstevel@tonic-gate "If a list of selectors is specified, an OR operation is applied - the\n"
146*7c478bd9Sstevel@tonic-gate "resulting probe_spec includes probes that match any of the selectors.\n"
147*7c478bd9Sstevel@tonic-gate "See the prex(1) man page for a complete specification of the accepted\n"
148*7c478bd9Sstevel@tonic-gate "grammar.\n"
149*7c478bd9Sstevel@tonic-gate "\n"
150*7c478bd9Sstevel@tonic-gate "The \"list\" command is used to view available probes in the target,\n"
151*7c478bd9Sstevel@tonic-gate "and to display their attributes. The \"trace\" and \"untrace\" commands\n"
152*7c478bd9Sstevel@tonic-gate "determine whether a probe will write a trace record when hit.  The\n"
153*7c478bd9Sstevel@tonic-gate "\"enable\" and \"disable\" commands indicate whether a probe will perform\n"
154*7c478bd9Sstevel@tonic-gate "any action (such as a calling a connected function or creating a trace\n"
155*7c478bd9Sstevel@tonic-gate "record) when hit.   Normally, a probe is enabled and traced for tracing,\n"
156*7c478bd9Sstevel@tonic-gate "and disabled and untraced otherwise.  It is possible to enable a probe\n"
157*7c478bd9Sstevel@tonic-gate "with tracing off to get debug output without writing trace records.\n"
158*7c478bd9Sstevel@tonic-gate "\n"
159*7c478bd9Sstevel@tonic-gate "Relevant Commands:\n"
160*7c478bd9Sstevel@tonic-gate "   list probes $all         # list probes in set $all (all probes)\n"
161*7c478bd9Sstevel@tonic-gate "   list probes file=test.c  # list probes with a specific attribute\n"
162*7c478bd9Sstevel@tonic-gate "   list 'file' probes $all  # list the file attribute in all probes\n"
163*7c478bd9Sstevel@tonic-gate "   list probes name=/^thr/  # list probes whose name attribute matches\n"
164*7c478bd9Sstevel@tonic-gate "                            # the given regular expression\n"
165*7c478bd9Sstevel@tonic-gate "   list probes name=/^thr/ keys=vm  # list probes matching either selector\n"
166*7c478bd9Sstevel@tonic-gate "   enable name=/^thr/       # enable probes whose name matches this regex\n"
167*7c478bd9Sstevel@tonic-gate "   trace $all               # trace all probes\n"
168*7c478bd9Sstevel@tonic-gate "   untrace $myset           # untrace probes in set $myset\n"
169*7c478bd9Sstevel@tonic-gate "\n"
170*7c478bd9Sstevel@tonic-gate "end of help for topic probe_spec\n",
171*7c478bd9Sstevel@tonic-gate /* help processes */
172*7c478bd9Sstevel@tonic-gate "Controlling Processes with prex\n"
173*7c478bd9Sstevel@tonic-gate "\n"
174*7c478bd9Sstevel@tonic-gate "Prex is used to control probes in a given process, or in the kernel.\n"
175*7c478bd9Sstevel@tonic-gate "The process which prex is to control is identified as an argument when\n"
176*7c478bd9Sstevel@tonic-gate "prex is invoked.  If the \"-p"
177*7c478bd9Sstevel@tonic-gate " <pid>\" switch is used, prex connects to the\n"
178*7c478bd9Sstevel@tonic-gate "specified process.  Otherwise prex exec's the command supplied at the\n"
179*7c478bd9Sstevel@tonic-gate "end of its argument list.  In either case, prex stops the target process\n"
180*7c478bd9Sstevel@tonic-gate "immediately so that the user may set up probe control.\n"
181*7c478bd9Sstevel@tonic-gate "\n"
182*7c478bd9Sstevel@tonic-gate "Once probe control is set up (typically using the \"enable\" and \"trace\"\n"
183*7c478bd9Sstevel@tonic-gate "commands), the process is continued using the \"continue\" command.  Prex\n"
184*7c478bd9Sstevel@tonic-gate "remains attached to the target, and the user can force the target to\n"
185*7c478bd9Sstevel@tonic-gate "stop again by typing control-C, at which time additional probe control\n"
186*7c478bd9Sstevel@tonic-gate "directives may be given.\n"
187*7c478bd9Sstevel@tonic-gate "\n"
188*7c478bd9Sstevel@tonic-gate "Upon quitting from prex, the target process is normally resumed if prex\n"
189*7c478bd9Sstevel@tonic-gate "attached to it, or killed if prex invoked it.  An optional argument may\n"
190*7c478bd9Sstevel@tonic-gate "be given with the \"quit\" command to explicitly specify whether to kill\n"
191*7c478bd9Sstevel@tonic-gate "the target, continue it, or leave it suspended.\n"
192*7c478bd9Sstevel@tonic-gate "\n"
193*7c478bd9Sstevel@tonic-gate "If the target forks, any probe that the child encounters will be logged to\n"
194*7c478bd9Sstevel@tonic-gate "the same trace file as the parent.  If the child calls exec, it will no\n"
195*7c478bd9Sstevel@tonic-gate "longer be traced.\n"
196*7c478bd9Sstevel@tonic-gate "\n"
197*7c478bd9Sstevel@tonic-gate "In kernel mode (prex -k), process filtering may be enabled, to limit\n"
198*7c478bd9Sstevel@tonic-gate "tracing to those kernel probes hit on behalf of a specific process or\n"
199*7c478bd9Sstevel@tonic-gate "set of processes.  Kernel-mode process filtering is controlled using\n"
200*7c478bd9Sstevel@tonic-gate "the \"pfilter\" command.\n"
201*7c478bd9Sstevel@tonic-gate "\n"
202*7c478bd9Sstevel@tonic-gate "\n"
203*7c478bd9Sstevel@tonic-gate "Relevant Commands:\n"
204*7c478bd9Sstevel@tonic-gate "    continue               # continue target (user mode only)\n"
205*7c478bd9Sstevel@tonic-gate "    Control-C              # stop target (user mode only)\n"
206*7c478bd9Sstevel@tonic-gate "    quit resume            # quit prex, continue target\n"
207*7c478bd9Sstevel@tonic-gate "    quit suspend           # quit prex, suspend target\n"
208*7c478bd9Sstevel@tonic-gate "    quit kill              # quit prex, kill target\n"
209*7c478bd9Sstevel@tonic-gate "    quit                   # quit prex, default action\n"
210*7c478bd9Sstevel@tonic-gate "# Note: pfilter commands apply only to kernel mode\n"
211*7c478bd9Sstevel@tonic-gate "    pfilter                # show pfilter status\n"
212*7c478bd9Sstevel@tonic-gate "    pfilter on             # turn on process filter mode\n"
213*7c478bd9Sstevel@tonic-gate "    pfilter off            # turn off process filter mode\n"
214*7c478bd9Sstevel@tonic-gate "    pfilter add 1234       # add to process filter pid list\n"
215*7c478bd9Sstevel@tonic-gate "    pfilter delete 1234    # delete from process filter pid list\n"
216*7c478bd9Sstevel@tonic-gate "\n"
217*7c478bd9Sstevel@tonic-gate "end of help for topic processes\n",
218*7c478bd9Sstevel@tonic-gate /* help set_spec */
219*7c478bd9Sstevel@tonic-gate "Specifying Probe Sets\n"
220*7c478bd9Sstevel@tonic-gate "\n"
221*7c478bd9Sstevel@tonic-gate "Prex provides the ability to define named sets of probes to simplify\n"
222*7c478bd9Sstevel@tonic-gate "commands operating on multiple probes.  The set \"$all\" is predefined,\n"
223*7c478bd9Sstevel@tonic-gate "as the set of all probes in the target.  A set is defined using the\n"
224*7c478bd9Sstevel@tonic-gate "\"create\" command, and can be used as an argument to the \"list\",\n"
225*7c478bd9Sstevel@tonic-gate "\"enable\", \"disable\", \"trace\", \"untrace\", \"connect\" and\n"
226*7c478bd9Sstevel@tonic-gate "\"clear\" commands.\n"
227*7c478bd9Sstevel@tonic-gate "\n"
228*7c478bd9Sstevel@tonic-gate "Relevant Commands:\n"
229*7c478bd9Sstevel@tonic-gate "    create $myset name=/^thr/        # create a set\n"
230*7c478bd9Sstevel@tonic-gate "    list probes $myset               # list probes in a set\n"
231*7c478bd9Sstevel@tonic-gate "    list sets                        # list defined sets\n"
232*7c478bd9Sstevel@tonic-gate "    enable $myset                    # enable a set of probes\n"
233*7c478bd9Sstevel@tonic-gate "    trace $myset                     # trace a set of probes\n"
234*7c478bd9Sstevel@tonic-gate "\n"
235*7c478bd9Sstevel@tonic-gate "end of help for topic set_spec\n"
236*7c478bd9Sstevel@tonic-gate };
237*7c478bd9Sstevel@tonic-gate 
238*7c478bd9Sstevel@tonic-gate static char *helpstr_continue =
239*7c478bd9Sstevel@tonic-gate "\n"
240*7c478bd9Sstevel@tonic-gate "Usage:  continue\n"
241*7c478bd9Sstevel@tonic-gate "\n"
242*7c478bd9Sstevel@tonic-gate "\"continue\" is used to resume execution of the target process.  This\n"
243*7c478bd9Sstevel@tonic-gate "command is not available in kernel mode, since the kernel is never stopped.\n"
244*7c478bd9Sstevel@tonic-gate "\n"
245*7c478bd9Sstevel@tonic-gate "end of help for cmd continue\n";
246*7c478bd9Sstevel@tonic-gate static char *helpstr_disable =
247*7c478bd9Sstevel@tonic-gate "\n"
248*7c478bd9Sstevel@tonic-gate "Usage: disable <probe_spec>|<set_spec>\n"
249*7c478bd9Sstevel@tonic-gate "\n"
250*7c478bd9Sstevel@tonic-gate "\"disable\" is used to to turn off all tracing activity associated with a\n"
251*7c478bd9Sstevel@tonic-gate "probe or a set of probes.\n"
252*7c478bd9Sstevel@tonic-gate "\n"
253*7c478bd9Sstevel@tonic-gate "End of help for cmd disable\n";
254*7c478bd9Sstevel@tonic-gate static char *helpstr_enable=
255*7c478bd9Sstevel@tonic-gate "\n"
256*7c478bd9Sstevel@tonic-gate "Usage: enable <probe_spec>|<set_spec>\n"
257*7c478bd9Sstevel@tonic-gate "\n"
258*7c478bd9Sstevel@tonic-gate "\"enable\" is used to specify that any activity associated with the probe\n"
259*7c478bd9Sstevel@tonic-gate "or probes will be performed when the probe is hit.  This includes connected\n"
260*7c478bd9Sstevel@tonic-gate "probe functions as well as the generation of trace records.  Note that in\n"
261*7c478bd9Sstevel@tonic-gate "order for a probe to generate a trace record, it must be \"traced\" as well\n"
262*7c478bd9Sstevel@tonic-gate "as enabled.\n"
263*7c478bd9Sstevel@tonic-gate "\n"
264*7c478bd9Sstevel@tonic-gate "End of help for cmd enable\n";
265*7c478bd9Sstevel@tonic-gate static char *helpstr_help =
266*7c478bd9Sstevel@tonic-gate "\n"
267*7c478bd9Sstevel@tonic-gate "Usage: help [<cmd>|<topic>]\n"
268*7c478bd9Sstevel@tonic-gate "\n"
269*7c478bd9Sstevel@tonic-gate "\"help\" lists all available help topics when run without any arguments.\n"
270*7c478bd9Sstevel@tonic-gate "If a valid topic or command-name is supplied as an argument, help text for\n"
271*7c478bd9Sstevel@tonic-gate "the topic or command is displayed.\n"
272*7c478bd9Sstevel@tonic-gate "\n"
273*7c478bd9Sstevel@tonic-gate "End of help for cmd help\n";
274*7c478bd9Sstevel@tonic-gate static char *helpstr_list =
275*7c478bd9Sstevel@tonic-gate "\n"
276*7c478bd9Sstevel@tonic-gate "Usage: list probes <probe_spec>|<set_spec> \n"
277*7c478bd9Sstevel@tonic-gate "       list <attrs> probes <probe_spec>|<set_spec>\n"
278*7c478bd9Sstevel@tonic-gate "       list sets\n"
279*7c478bd9Sstevel@tonic-gate "       list fcns\n"
280*7c478bd9Sstevel@tonic-gate "       list history\n"
281*7c478bd9Sstevel@tonic-gate "       list tracefile\n"
282*7c478bd9Sstevel@tonic-gate "\n"
283*7c478bd9Sstevel@tonic-gate "\"list\" displays information about currently defined probes, sets, and\n"
284*7c478bd9Sstevel@tonic-gate "probe functions.  When listing probes, one can limit the output to a\n"
285*7c478bd9Sstevel@tonic-gate "desired set of attributes by specifying an attribute list as a set of\n"
286*7c478bd9Sstevel@tonic-gate "strings.  If an attribute is also a reserved word (such as \"trace\", it\n"
287*7c478bd9Sstevel@tonic-gate "must be enclosed in single quotes.  For example:\n"
288*7c478bd9Sstevel@tonic-gate "\n"
289*7c478bd9Sstevel@tonic-gate "       list file 'trace' probes $all\n"
290*7c478bd9Sstevel@tonic-gate "\n"
291*7c478bd9Sstevel@tonic-gate "\"list\" history lists the probe control commands history, and\n"
292*7c478bd9Sstevel@tonic-gate "\"list\" tracefile displays the current trace file name.\n"
293*7c478bd9Sstevel@tonic-gate "\n"
294*7c478bd9Sstevel@tonic-gate "End of help for cmd list\n";
295*7c478bd9Sstevel@tonic-gate static char *helpstr_quit =
296*7c478bd9Sstevel@tonic-gate "\n"
297*7c478bd9Sstevel@tonic-gate "Usage: quit\n"
298*7c478bd9Sstevel@tonic-gate "       quit kill\n"
299*7c478bd9Sstevel@tonic-gate "       quit resume\n"
300*7c478bd9Sstevel@tonic-gate "       quit suspend\n"
301*7c478bd9Sstevel@tonic-gate "\n"
302*7c478bd9Sstevel@tonic-gate "The \"quit\" command exits prex, leaving the target in a state specified\n"
303*7c478bd9Sstevel@tonic-gate "by the user, or taking a default action if no instructions are specified.\n"
304*7c478bd9Sstevel@tonic-gate "An optional argument may be used to indicated that the target should be\n"
305*7c478bd9Sstevel@tonic-gate "killed, resumed, or left suspended.  If no argument is supplied, then\n"
306*7c478bd9Sstevel@tonic-gate "prex's default behavior is to resume a process to which it had attached,\n"
307*7c478bd9Sstevel@tonic-gate "and to kill a process which it had invoked.\n"
308*7c478bd9Sstevel@tonic-gate "\n"
309*7c478bd9Sstevel@tonic-gate "End of help for cmd quit\n";
310*7c478bd9Sstevel@tonic-gate static char *helpstr_source =
311*7c478bd9Sstevel@tonic-gate "\n"
312*7c478bd9Sstevel@tonic-gate "Usage: source <filename>\n"
313*7c478bd9Sstevel@tonic-gate "\n"
314*7c478bd9Sstevel@tonic-gate "The \"source\" command is used to invoke a set of prex commands stored in\n"
315*7c478bd9Sstevel@tonic-gate "a file.  A sourced file may in turn source other files.  The files\n"
316*7c478bd9Sstevel@tonic-gate "~/.prexrc and ./.prexrc are sourced automatically (in that order) when prex\n"
317*7c478bd9Sstevel@tonic-gate "is invoked, and may be used to store commonly used probe and set\n"
318*7c478bd9Sstevel@tonic-gate "specifications, or probe control directives.  Commands in sourced files\n"
319*7c478bd9Sstevel@tonic-gate "may override the effects of commands in previously sourced files.\n"
320*7c478bd9Sstevel@tonic-gate "\n"
321*7c478bd9Sstevel@tonic-gate "End of help for cmd source\n";
322*7c478bd9Sstevel@tonic-gate static char *helpstr_trace =
323*7c478bd9Sstevel@tonic-gate "\n"
324*7c478bd9Sstevel@tonic-gate "Usage: trace <probe_spec>|<set_spec>\n"
325*7c478bd9Sstevel@tonic-gate "\n"
326*7c478bd9Sstevel@tonic-gate "\"trace\" is used to turn on tracing for the specified probe or probes.\n"
327*7c478bd9Sstevel@tonic-gate "A \"traced\" probe that is also \"enabled\" will generate a trace record\n"
328*7c478bd9Sstevel@tonic-gate "when it is hit.\n"
329*7c478bd9Sstevel@tonic-gate "\n"
330*7c478bd9Sstevel@tonic-gate "End of help for cmd trace\n";
331*7c478bd9Sstevel@tonic-gate static char *helpstr_untrace =
332*7c478bd9Sstevel@tonic-gate "\n"
333*7c478bd9Sstevel@tonic-gate "Usage: untrace <probe_spec>|<set_spec>\n"
334*7c478bd9Sstevel@tonic-gate "\n"
335*7c478bd9Sstevel@tonic-gate "\"untrace\" turns tracing off for the specified probe or probes.  A probe\n"
336*7c478bd9Sstevel@tonic-gate "will not generate a trace record when it is not traced, although connected\n"
337*7c478bd9Sstevel@tonic-gate "probe functions will still be invoked as long as a probe is \"enabled\".\n"
338*7c478bd9Sstevel@tonic-gate "\n"
339*7c478bd9Sstevel@tonic-gate "End of help for cmd untrace\n";
340*7c478bd9Sstevel@tonic-gate static char *helpstr_buffer =
341*7c478bd9Sstevel@tonic-gate "\n"
342*7c478bd9Sstevel@tonic-gate "Usage: buffer alloc <size>\n"
343*7c478bd9Sstevel@tonic-gate "       buffer dealloc\n"
344*7c478bd9Sstevel@tonic-gate "\n"
345*7c478bd9Sstevel@tonic-gate "Note:  Kernel Mode Only\n"
346*7c478bd9Sstevel@tonic-gate "\n"
347*7c478bd9Sstevel@tonic-gate "\"buffer\" allocates or deallocates the in-core buffer used to hold\n"
348*7c478bd9Sstevel@tonic-gate "kernel trace records.  Size can be specified in kilobytes or megabytes,\n"
349*7c478bd9Sstevel@tonic-gate "by appending the character 'k' or 'm' to a numeric value (e.g. \"2m\").\n"
350*7c478bd9Sstevel@tonic-gate "A buffer must be allocated prior to a kernel tracing session.  Once\n"
351*7c478bd9Sstevel@tonic-gate "allocated, the buffer remains usable until deallocated, even through\n"
352*7c478bd9Sstevel@tonic-gate "multiple invocations of prex.\n"
353*7c478bd9Sstevel@tonic-gate "\n"
354*7c478bd9Sstevel@tonic-gate "Before the buffer is deallocated, data may be extracted to an on-disk\n"
355*7c478bd9Sstevel@tonic-gate "tracefile using tnfxtract(1).\n"
356*7c478bd9Sstevel@tonic-gate "\n"
357*7c478bd9Sstevel@tonic-gate "End of help for cmd buffer\n";
358*7c478bd9Sstevel@tonic-gate static char *helpstr_ktrace =
359*7c478bd9Sstevel@tonic-gate "\n"
360*7c478bd9Sstevel@tonic-gate "Usage: ktrace on\n"
361*7c478bd9Sstevel@tonic-gate "       ktrace off\n"
362*7c478bd9Sstevel@tonic-gate "\n"
363*7c478bd9Sstevel@tonic-gate "Note:  Kernel Mode Only\n"
364*7c478bd9Sstevel@tonic-gate "\n"
365*7c478bd9Sstevel@tonic-gate "\"ktrace\" toggles the master switch that indicates whether kernel\n"
366*7c478bd9Sstevel@tonic-gate "tracing is active or inactive.  Since the kernel cannot be stopped while\n"
367*7c478bd9Sstevel@tonic-gate "a tracing experiment is set up, \"ktrace\" is provided so that tracing\n"
368*7c478bd9Sstevel@tonic-gate "can be set up as desired before any trace records are generated\n"
369*7c478bd9Sstevel@tonic-gate "\n"
370*7c478bd9Sstevel@tonic-gate "End of help for cmd ktrace\n";
371*7c478bd9Sstevel@tonic-gate static char *helpstr_pfilter =
372*7c478bd9Sstevel@tonic-gate "\n"
373*7c478bd9Sstevel@tonic-gate "Usage: pfilter\n"
374*7c478bd9Sstevel@tonic-gate "       pfilter on\n"
375*7c478bd9Sstevel@tonic-gate "       pfilter off\n"
376*7c478bd9Sstevel@tonic-gate "       pfilter add <pidlist>\n"
377*7c478bd9Sstevel@tonic-gate "       pfilter delete <pidlist>\n"
378*7c478bd9Sstevel@tonic-gate "\n"
379*7c478bd9Sstevel@tonic-gate "Note:  Kernel Mode Only\n"
380*7c478bd9Sstevel@tonic-gate "\n"
381*7c478bd9Sstevel@tonic-gate "\"pfilter\" controls process filtering by toggling process-filter mode,\n"
382*7c478bd9Sstevel@tonic-gate "and maintaining a list of process id's on which to filter.  When process\n"
383*7c478bd9Sstevel@tonic-gate "filtering mode is on, tracing is limited to the kernel events hit on behalf\n"
384*7c478bd9Sstevel@tonic-gate "of the processes in the pid list.  Process id 0 is used to represent all\n"
385*7c478bd9Sstevel@tonic-gate "threads not associated with a process.\n"
386*7c478bd9Sstevel@tonic-gate 
387*7c478bd9Sstevel@tonic-gate "When run without arguments, \"pfilter\" displays the current process-filter\n"
388*7c478bd9Sstevel@tonic-gate "mode and pid list.  A process filter pid list can be maintained whether\n"
389*7c478bd9Sstevel@tonic-gate "or not process filter mode is currently active.\n"
390*7c478bd9Sstevel@tonic-gate "\n"
391*7c478bd9Sstevel@tonic-gate "A process must exist in order to be added to the pid list, and the pid list\n"
392*7c478bd9Sstevel@tonic-gate "is automatically updated to delete any processes that no longer exist.  If\n"
393*7c478bd9Sstevel@tonic-gate "the pid list becomes empty while process filtering is on, prex issues a\n"
394*7c478bd9Sstevel@tonic-gate "warning.  Process filtering mode is persistent between invocations of prex\n"
395*7c478bd9Sstevel@tonic-gate "so it should be turned off manually when a tracing experiment is complete.\n"
396*7c478bd9Sstevel@tonic-gate "\n"
397*7c478bd9Sstevel@tonic-gate "End of help for cmd pfilter\n";
398*7c478bd9Sstevel@tonic-gate static char *helpstr_clear =
399*7c478bd9Sstevel@tonic-gate "\n"
400*7c478bd9Sstevel@tonic-gate "Usage: clear <probe_spec>|<set_spec>\n"
401*7c478bd9Sstevel@tonic-gate "\n"
402*7c478bd9Sstevel@tonic-gate "Note:  Not available in Kernel Mode\n"
403*7c478bd9Sstevel@tonic-gate "\n"
404*7c478bd9Sstevel@tonic-gate "\"clear\" disconnects any probe functions that have previously been\n"
405*7c478bd9Sstevel@tonic-gate "connected to a probe or group of probes using the \"connect\" command.\n"
406*7c478bd9Sstevel@tonic-gate "The \"clear\" command cannot be used in kernel mode, since probe functions\n"
407*7c478bd9Sstevel@tonic-gate "are not available for kernel probes.\n"
408*7c478bd9Sstevel@tonic-gate "\n"
409*7c478bd9Sstevel@tonic-gate "End of help for cmd clear\n";
410*7c478bd9Sstevel@tonic-gate static char *helpstr_connect =
411*7c478bd9Sstevel@tonic-gate "\n"
412*7c478bd9Sstevel@tonic-gate "Usage: connect <function> <probe_spec>|<set_spec>\n"
413*7c478bd9Sstevel@tonic-gate "\n"
414*7c478bd9Sstevel@tonic-gate "Note:  Not available in Kernel Mode\n"
415*7c478bd9Sstevel@tonic-gate "\n"
416*7c478bd9Sstevel@tonic-gate "\"connect\" connects a probe function to a probe or group of probes.\n"
417*7c478bd9Sstevel@tonic-gate "Currently, the only probe function available from prex is \"&debug\", which\n"
418*7c478bd9Sstevel@tonic-gate "prints out the arguments sent in to the probe, as well as the value (if\n"
419*7c478bd9Sstevel@tonic-gate "any) associated with the sunw%debug attribute in the detail field.\n"
420*7c478bd9Sstevel@tonic-gate "In order for a probe function to be invoked, the probe to which the\n"
421*7c478bd9Sstevel@tonic-gate "function is attached must be \"enabled\", but need not be \"traced\".\n"
422*7c478bd9Sstevel@tonic-gate "\n"
423*7c478bd9Sstevel@tonic-gate "The \"clear\" command is available to disconnect a probe function from\n"
424*7c478bd9Sstevel@tonic-gate "a probe or group of probes.\n"
425*7c478bd9Sstevel@tonic-gate "\n"
426*7c478bd9Sstevel@tonic-gate "End of help for cmd connect\n";
427*7c478bd9Sstevel@tonic-gate 
428*7c478bd9Sstevel@tonic-gate static char *helpstr =
429*7c478bd9Sstevel@tonic-gate "\n"
430*7c478bd9Sstevel@tonic-gate "Usage: help [topic|command]\n"
431*7c478bd9Sstevel@tonic-gate "\n"
432*7c478bd9Sstevel@tonic-gate "Topics\n"
433*7c478bd9Sstevel@tonic-gate "\tintro         functions    kernel_mode\n"
434*7c478bd9Sstevel@tonic-gate "\tprobe_spec    processes    set_spec\n"
435*7c478bd9Sstevel@tonic-gate "\n"
436*7c478bd9Sstevel@tonic-gate "User and Kernel Mode Commands\n"
437*7c478bd9Sstevel@tonic-gate "\tdisable       enable       help       list\n"
438*7c478bd9Sstevel@tonic-gate "\tquit          source       trace      untrace\n"
439*7c478bd9Sstevel@tonic-gate "\n"
440*7c478bd9Sstevel@tonic-gate "Additional user-mode-only commands\n"
441*7c478bd9Sstevel@tonic-gate "\tclear         connect      continue\n"
442*7c478bd9Sstevel@tonic-gate "\n"
443*7c478bd9Sstevel@tonic-gate "Additional kernel-mode-only (prex -k) commands\n"
444*7c478bd9Sstevel@tonic-gate "\tbuffer        ktrace       pfilter\n"
445*7c478bd9Sstevel@tonic-gate ;
446*7c478bd9Sstevel@tonic-gate 
447*7c478bd9Sstevel@tonic-gate 
448*7c478bd9Sstevel@tonic-gate static char	*oldhelpstr =
449*7c478bd9Sstevel@tonic-gate "grammar for non-terminals:\n"
450*7c478bd9Sstevel@tonic-gate "__________________________\n"
451*7c478bd9Sstevel@tonic-gate "\n"
452*7c478bd9Sstevel@tonic-gate "filename ::=	QUOTED_STR\n"
453*7c478bd9Sstevel@tonic-gate "\n"
454*7c478bd9Sstevel@tonic-gate "selector_list ::= 	/* empty */ |\n"
455*7c478bd9Sstevel@tonic-gate "		<selector_list> <selector>\n"
456*7c478bd9Sstevel@tonic-gate "\n"
457*7c478bd9Sstevel@tonic-gate "spec_list ::=	/*empty */ |\n"
458*7c478bd9Sstevel@tonic-gate "		<spec_list> <spec>\n"
459*7c478bd9Sstevel@tonic-gate "\n"
460*7c478bd9Sstevel@tonic-gate "selector ::=	<spec>=<spec> |		/* whitespace around '=' optional */\n"
461*7c478bd9Sstevel@tonic-gate "		<spec>			/* keys attribute is default */\n"
462*7c478bd9Sstevel@tonic-gate "\n"
463*7c478bd9Sstevel@tonic-gate "spec ::= 	IDENT |\n"
464*7c478bd9Sstevel@tonic-gate "		QUOTED_STR |\n"
465*7c478bd9Sstevel@tonic-gate "		REGEXP\n"
466*7c478bd9Sstevel@tonic-gate "\n"
467*7c478bd9Sstevel@tonic-gate "pidlist ::=	<pid> |\n"
468*7c478bd9Sstevel@tonic-gate "		<pid> ',' <pidlist>\n"
469*7c478bd9Sstevel@tonic-gate "pid ::=		INT\n"
470*7c478bd9Sstevel@tonic-gate "\n"
471*7c478bd9Sstevel@tonic-gate "Reg-exps to match terminals:\n"
472*7c478bd9Sstevel@tonic-gate "____________________________\n"
473*7c478bd9Sstevel@tonic-gate "\n"
474*7c478bd9Sstevel@tonic-gate "IDENT 		= [a-zA-Z_\\.%]{[a-zA-Z0-9_\\.%]}+ \n"
475*7c478bd9Sstevel@tonic-gate "QUOTED_STR	= '[^\\n']*'		/* any string in single quotes	*/\n"
476*7c478bd9Sstevel@tonic-gate "REGEXP		= /[^\\n/]/		/* reg-exp's have to be in / /	*/\n"
477*7c478bd9Sstevel@tonic-gate "INT		= [0-9]+\n"
478*7c478bd9Sstevel@tonic-gate "\n"
479*7c478bd9Sstevel@tonic-gate "Commands:\n"
480*7c478bd9Sstevel@tonic-gate "_________\n"
481*7c478bd9Sstevel@tonic-gate "\n"
482*7c478bd9Sstevel@tonic-gate "# set creation and set listing\n"
483*7c478bd9Sstevel@tonic-gate "create $<set_name> <selector_list>\n"
484*7c478bd9Sstevel@tonic-gate "list sets				# list the defined sets\n"
485*7c478bd9Sstevel@tonic-gate "\n"
486*7c478bd9Sstevel@tonic-gate "# function listing\n"
487*7c478bd9Sstevel@tonic-gate "list fcns				# list the defined functions.\n"
488*7c478bd9Sstevel@tonic-gate "\n"
489*7c478bd9Sstevel@tonic-gate "# commands to connect and disconnect probe functions\n"
490*7c478bd9Sstevel@tonic-gate "# (not available in kernel mode)\n"
491*7c478bd9Sstevel@tonic-gate "connect &<fcn_handle> $<set_name>	# eg. connect &debug $all\n"
492*7c478bd9Sstevel@tonic-gate "connect &<fcn_handle> <selector_list>\n"
493*7c478bd9Sstevel@tonic-gate "\n"
494*7c478bd9Sstevel@tonic-gate "# command to disconnect all connected probe functions\n"
495*7c478bd9Sstevel@tonic-gate "# (not available in kernel mode)\n"
496*7c478bd9Sstevel@tonic-gate "clear $<set_name>\n"
497*7c478bd9Sstevel@tonic-gate "clear <selector_list>\n"
498*7c478bd9Sstevel@tonic-gate "\n"
499*7c478bd9Sstevel@tonic-gate "# commands to toggle the tracing mode\n"
500*7c478bd9Sstevel@tonic-gate "trace $<set_name>\n"
501*7c478bd9Sstevel@tonic-gate "trace <selector_list>\n"
502*7c478bd9Sstevel@tonic-gate "untrace $<set_name>\n"
503*7c478bd9Sstevel@tonic-gate "untrace <selector_list>\n"
504*7c478bd9Sstevel@tonic-gate "\n"
505*7c478bd9Sstevel@tonic-gate "# commands to enable and disable probes\n"
506*7c478bd9Sstevel@tonic-gate "enable $<set_name>\n"
507*7c478bd9Sstevel@tonic-gate "enable <selector_list>\n"
508*7c478bd9Sstevel@tonic-gate "disable $<set_name>\n"
509*7c478bd9Sstevel@tonic-gate "disable <selector_list>\n"
510*7c478bd9Sstevel@tonic-gate "list history		# lists probe control commands issued\n"
511*7c478bd9Sstevel@tonic-gate "list tracefile		# lists the current trace file name\n"
512*7c478bd9Sstevel@tonic-gate "\n"
513*7c478bd9Sstevel@tonic-gate "# commands to list probes or to list values\n"
514*7c478bd9Sstevel@tonic-gate "list <spec_list> probes $<set_name>	#eg. list probes $all\n"
515*7c478bd9Sstevel@tonic-gate "list <spec_list> probes <selector_list> #eg. list name probes file=test.c\n"
516*7c478bd9Sstevel@tonic-gate "list values <spec_list>		# eg. list values keys\n"
517*7c478bd9Sstevel@tonic-gate "\n"
518*7c478bd9Sstevel@tonic-gate "# help command\n"
519*7c478bd9Sstevel@tonic-gate "help\n"
520*7c478bd9Sstevel@tonic-gate "\n"
521*7c478bd9Sstevel@tonic-gate "# source a file of prex commands\n"
522*7c478bd9Sstevel@tonic-gate "source <filename>\n"
523*7c478bd9Sstevel@tonic-gate "\n"
524*7c478bd9Sstevel@tonic-gate "# process control - ^C stops target and returns to 'prex>' prompt\n"
525*7c478bd9Sstevel@tonic-gate "# (In kernel mode, `continue' is a no-op, and 'quit' detaches prex\n"
526*7c478bd9Sstevel@tonic-gate "# from the kernel.)\n"
527*7c478bd9Sstevel@tonic-gate "continue		# continues target\n"
528*7c478bd9Sstevel@tonic-gate "quit kill		# quit prex, kill target\n"
529*7c478bd9Sstevel@tonic-gate "quit resume		# quit prex, continue target\n"
530*7c478bd9Sstevel@tonic-gate "quit suspend		# quit prex, leave target suspended\n"
531*7c478bd9Sstevel@tonic-gate "quit			# quit prex (continue or kill target)\n"
532*7c478bd9Sstevel@tonic-gate "\n"
533*7c478bd9Sstevel@tonic-gate 
534*7c478bd9Sstevel@tonic-gate "\n"
535*7c478bd9Sstevel@tonic-gate "# Kernel mode commands\n"
536*7c478bd9Sstevel@tonic-gate "# \"master switch\" enabling/disabling all tracing\n"
537*7c478bd9Sstevel@tonic-gate "ktrace on		# Enabled probes will generate trace output\n"
538*7c478bd9Sstevel@tonic-gate "ktrace off		# All trace output suppressed\n"
539*7c478bd9Sstevel@tonic-gate "# Create, destroy, or show the size of the kernel trace buffer\n"
540*7c478bd9Sstevel@tonic-gate "buffer [ alloc [ size ] | dealloc ]\n"
541*7c478bd9Sstevel@tonic-gate "# Control per-process kernel trace filtering\n"
542*7c478bd9Sstevel@tonic-gate "pfilter off		# Filtering off:  trace all processes\n"
543*7c478bd9Sstevel@tonic-gate "pfilter on		# Filtering on:  trace only processes in filter set\n"
544*7c478bd9Sstevel@tonic-gate "pfilter add <pidlist>		# Add specified process ids to the filter set\n"
545*7c478bd9Sstevel@tonic-gate "pfilter delete <pidlist>	# Drop specified pids from the filter set\n"
546*7c478bd9Sstevel@tonic-gate "\n"
547*7c478bd9Sstevel@tonic-gate ;
548*7c478bd9Sstevel@tonic-gate 
549*7c478bd9Sstevel@tonic-gate void
550*7c478bd9Sstevel@tonic-gate help(void)
551*7c478bd9Sstevel@tonic-gate {
552*7c478bd9Sstevel@tonic-gate 	(void) fputs(helpstr, stdout);
553*7c478bd9Sstevel@tonic-gate 
554*7c478bd9Sstevel@tonic-gate }				/* end help */
555*7c478bd9Sstevel@tonic-gate 
556*7c478bd9Sstevel@tonic-gate void
557*7c478bd9Sstevel@tonic-gate help_on_topic(char *topic)
558*7c478bd9Sstevel@tonic-gate {
559*7c478bd9Sstevel@tonic-gate 	int i;
560*7c478bd9Sstevel@tonic-gate 
561*7c478bd9Sstevel@tonic-gate 	if (topic && strlen(topic)) {
562*7c478bd9Sstevel@tonic-gate 		for (i = 0; i < NUMHELPTOPICS; i++)
563*7c478bd9Sstevel@tonic-gate 		if (strcmp(topic, helptopics[i]) == 0)
564*7c478bd9Sstevel@tonic-gate 		    break;
565*7c478bd9Sstevel@tonic-gate 		if (i < NUMHELPTOPICS)
566*7c478bd9Sstevel@tonic-gate 		    fputs(helptopicstrings[i], stdout);
567*7c478bd9Sstevel@tonic-gate 		else {
568*7c478bd9Sstevel@tonic-gate 			printf("No help for %s\n",  topic);
569*7c478bd9Sstevel@tonic-gate 			help();
570*7c478bd9Sstevel@tonic-gate 		}
571*7c478bd9Sstevel@tonic-gate 	}
572*7c478bd9Sstevel@tonic-gate }
573*7c478bd9Sstevel@tonic-gate 
574*7c478bd9Sstevel@tonic-gate 
575*7c478bd9Sstevel@tonic-gate void
576*7c478bd9Sstevel@tonic-gate help_on_command(int cmd)
577*7c478bd9Sstevel@tonic-gate {
578*7c478bd9Sstevel@tonic-gate 	switch (cmd) {
579*7c478bd9Sstevel@tonic-gate 	case CONTINUE:
580*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_continue, stdout);
581*7c478bd9Sstevel@tonic-gate 		break;
582*7c478bd9Sstevel@tonic-gate 	case DISABLE:
583*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_disable, stdout);
584*7c478bd9Sstevel@tonic-gate 		break;
585*7c478bd9Sstevel@tonic-gate 	case ENABLE:
586*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_enable, stdout);
587*7c478bd9Sstevel@tonic-gate 		break;
588*7c478bd9Sstevel@tonic-gate 	case HELP:
589*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_help, stdout);
590*7c478bd9Sstevel@tonic-gate 		break;
591*7c478bd9Sstevel@tonic-gate 	case LIST:
592*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_list, stdout);
593*7c478bd9Sstevel@tonic-gate 		break;
594*7c478bd9Sstevel@tonic-gate 	case QUIT:
595*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_quit, stdout);
596*7c478bd9Sstevel@tonic-gate 		break;
597*7c478bd9Sstevel@tonic-gate 	case SOURCE:
598*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_source, stdout);
599*7c478bd9Sstevel@tonic-gate 		break;
600*7c478bd9Sstevel@tonic-gate 	case TRACE:
601*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_trace, stdout);
602*7c478bd9Sstevel@tonic-gate 		break;
603*7c478bd9Sstevel@tonic-gate 	case UNTRACE:
604*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_untrace, stdout);
605*7c478bd9Sstevel@tonic-gate 		break;
606*7c478bd9Sstevel@tonic-gate 	case BUFFER:
607*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_buffer, stdout);
608*7c478bd9Sstevel@tonic-gate 		break;
609*7c478bd9Sstevel@tonic-gate 	case KTRACE:
610*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_ktrace, stdout);
611*7c478bd9Sstevel@tonic-gate 		break;
612*7c478bd9Sstevel@tonic-gate 	case PFILTER:
613*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_pfilter, stdout);
614*7c478bd9Sstevel@tonic-gate 		break;
615*7c478bd9Sstevel@tonic-gate 	case CLEAR:
616*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_clear, stdout);
617*7c478bd9Sstevel@tonic-gate 		break;
618*7c478bd9Sstevel@tonic-gate 	case CONNECT:
619*7c478bd9Sstevel@tonic-gate 		fputs(helpstr_connect, stdout);
620*7c478bd9Sstevel@tonic-gate 		break;
621*7c478bd9Sstevel@tonic-gate 	default:
622*7c478bd9Sstevel@tonic-gate 		fputs("No help for this command\n", stdout);
623*7c478bd9Sstevel@tonic-gate 		break;
624*7c478bd9Sstevel@tonic-gate 	}
625*7c478bd9Sstevel@tonic-gate 
626*7c478bd9Sstevel@tonic-gate }				/* end help */
627