Home | History | Annotate | Download | only in prex
      1 %{
      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, Version 1.0 only
      7  * (the "License").  You may not use this file except in compliance
      8  * with the License.
      9  *
     10  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     11  * or http://www.opensolaris.org/os/licensing.
     12  * See the License for the specific language governing permissions
     13  * and limitations under the License.
     14  *
     15  * When distributing Covered Code, include this CDDL HEADER in each
     16  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     17  * If applicable, add the following below this CDDL HEADER, with the
     18  * fields enclosed by brackets "[]" replaced with your own identifying
     19  * information: Portions Copyright [yyyy] [name of copyright owner]
     20  *
     21  * CDDL HEADER END
     22  *
     23  *	Copyright (c) 1994, by Sun Microsytems, Inc.
     24  */
     25 
     26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     27 %}
     28 
     29 %token ADD
     30 %token ALLOC
     31 %token BUFFER
     32 %token CLEAR
     33 %token COMMA
     34 %token CONNECT
     35 %token DEALLOC
     36 %token DELETE
     37 %token FILTER
     38 %token CONTINUE
     39 %token CREATE
     40 %token DISABLE
     41 %token ENABLE
     42 %token EQ
     43 %token FCNNAME
     44 %token FCNS
     45 %token ON
     46 %token OFF
     47 %token HELP
     48 %token KTRACE
     49 %token HISTORY
     50 %token IDENT
     51 %token INVAL
     52 %token KILL
     53 %token LIST
     54 %token NL
     55 %token PFILTER
     56 %token PROBES
     57 %token QUIT
     58 %token REGEXP
     59 %token RESUME
     60 %token SCALED_INT
     61 %token SETNAME
     62 %token SETS
     63 %token SOURCE
     64 %token SUSPEND
     65 %token TRACE
     66 %token TRACEFILE
     67 %token UNTRACE
     68 %token VALSTR
     69 %token VALUES
     70 
     71 %{
     72 #include <stdio.h>
     73 #include <string.h>
     74 #include <sys/types.h>
     75 
     76 #include "set.h"
     77 #include "cmd.h"
     78 #include "fcn.h"
     79 #include "list.h"
     80 #include "expr.h"
     81 #include "spec.h"
     82 #include "source.h"
     83 #include "prbk.h"
     84 
     85 extern int	yylex();
     86 
     87 extern void help_on_topic(char *topic);
     88 extern void help_on_command(int cmd);
     89 extern boolean_t g_kernelmode;
     90 extern tnfctl_handle_t *g_hndl;
     91 
     92 void		quit(boolean_t	killtarget, boolean_t  runtarget);
     93 extern void	help(void);
     94 extern void	process_cmd(tnfctl_handle_t *hndl, cmd_t *cmd);
     95 extern void 	cmd_listtracefile();
     96 %}
     97 
     98 %union
     99 {
    100 	char *	strval;
    101 	expr_t *	exprval;
    102 	spec_t *	specval;
    103 	void *	pidlistval;
    104 	int		intval;
    105 }
    106 
    107 %type <strval>	SETNAME FCNNAME IDENT VALSTR REGEXP
    108 %type <intval>  CONTINUE DISABLE ENABLE HELP LIST QUIT SOURCE TRACE UNTRACE BUFFER KTRACE PFILTER CLEAR CONNECT command
    109 %type <exprval>	expr exprlist
    110 %type <specval> spec speclist
    111 %type <pidlistval> pidlist
    112 %type <intval>	SCALED_INT singlepid
    113 
    114 %%
    115 
    116 file			: statement_list
    117 			;
    118 
    119 statement_list		: /* empty */			{ prompt(); }
    120 			| statement_list statement
    121 				{
    122 			  		  if (g_kernelmode)
    123 						prbk_warn_pfilter_empty();
    124 						prompt();
    125 				}
    126 			;
    127 
    128 statement		: empty_statement
    129 			| help_statement
    130 			| continue_statement
    131 			| quit_statement
    132 			| enable_statement
    133 			| disable_statement
    134 			| trace_statement
    135 			| untrace_statement
    136 			| connect_statement
    137 			| clear_statement
    138 			| pfilter_statement
    139 			| ktrace_statement
    140 			| buffer_statement
    141 			| create_statement
    142 			| source_statement
    143 			| listsets_statement
    144 			| listhistory_statement
    145 			| listtracefile_statement
    146 			| listfcns_statement
    147 			| listprobes_statement
    148 			| listvalues_statement
    149 			| error NL		{ yyerrok; }
    150 			;
    151 
    152 empty_statement		: NL
    153 			;
    154 
    155 command			: CONTINUE	{ $$ = $1; } /* user&kernel */
    156 			| DISABLE	{ $$ = $1; }
    157     			| ENABLE	{ $$ = $1; }
    158 			| HELP		{ $$ = $1; }
    159 			| LIST		{ $$ = $1; }
    160     			| QUIT		{ $$ = $1; }
    161 			| SOURCE	{ $$ = $1; }
    162 			| TRACE		{ $$ = $1; }
    163 			| UNTRACE	{ $$ = $1; }
    164 			| BUFFER	{ $$ = $1; } /* kernel only */
    165 			| KTRACE	{ $$ = $1; }
    166 			| PFILTER	{ $$ = $1; }
    167     			| CLEAR		{ $$ = $1; } /* user only */
    168 			| CONNECT	{ $$ = $1; }
    169     			;
    170 
    171 help_statement		: HELP NL		{ help(); }
    172 			| HELP command NL       { help_on_command($2); }
    173 			| HELP IDENT NL         { help_on_topic($2); }
    174 			;
    175 
    176 continue_statement	: CONTINUE NL
    177 				{
    178 					if (!g_kernelmode) YYACCEPT;
    179 				}
    180 			;
    181 
    182 quit_statement		: QUIT NL		{ quit(B_TRUE, B_TRUE); }
    183 			| QUIT KILL NL		{ quit(B_TRUE, B_FALSE); }
    184 			| QUIT RESUME NL	{ quit(B_FALSE, B_TRUE); }
    185 			| QUIT SUSPEND NL	{ quit(B_FALSE, B_FALSE); }
    186 			;
    187 
    188 enable_statement	: ENABLE SETNAME NL
    189 				{
    190 					cmd_t *cmd_p;
    191 					cmd_p = cmd_set($2, CMD_ENABLE, NULL);
    192 					if (cmd_p)
    193 						process_cmd(g_hndl, cmd_p);
    194 				}
    195 			| ENABLE exprlist NL
    196 				{
    197 					cmd_t *cmd_p;
    198 					cmd_p = cmd_expr($2, CMD_ENABLE, NULL);
    199 					if (cmd_p)
    200 						process_cmd(g_hndl, cmd_p);
    201 				}
    202 			;
    203 
    204 disable_statement	: DISABLE SETNAME NL
    205 				{
    206 					cmd_t *cmd_p;
    207 					cmd_p = cmd_set($2, CMD_DISABLE, NULL);
    208 					if (cmd_p)
    209 						process_cmd(g_hndl, cmd_p);
    210 				}
    211 			| DISABLE exprlist NL
    212 				{
    213 					cmd_t *cmd_p;
    214 					cmd_p = cmd_expr($2, CMD_DISABLE, NULL);
    215 					if (cmd_p)
    216 						process_cmd(g_hndl, cmd_p);
    217 				}
    218 			;
    219 
    220 trace_statement		: TRACE SETNAME NL
    221 				{
    222 					cmd_t *cmd_p;
    223 					cmd_p = cmd_set($2, CMD_TRACE, NULL);
    224 					if (cmd_p)
    225 						process_cmd(g_hndl, cmd_p);
    226 				}
    227 			| TRACE exprlist NL
    228 				{
    229 					cmd_t *cmd_p;
    230 					cmd_p = cmd_expr($2, CMD_TRACE, NULL);
    231 					if (cmd_p)
    232 						process_cmd(g_hndl, cmd_p);
    233 				}
    234 			;
    235 
    236 untrace_statement	: UNTRACE SETNAME NL
    237 				{
    238 					cmd_t *cmd_p;
    239 					cmd_p = cmd_set($2, CMD_UNTRACE, NULL);
    240 					if (cmd_p)
    241 						process_cmd(g_hndl, cmd_p);
    242 				}
    243 			| UNTRACE exprlist NL
    244 				{
    245 					cmd_t *cmd_p;
    246 					cmd_p = cmd_expr($2, CMD_UNTRACE, NULL);
    247 					if (cmd_p)
    248 						process_cmd(g_hndl, cmd_p);
    249 				}
    250 			;
    251 
    252 connect_statement	: CONNECT FCNNAME SETNAME NL
    253 				{
    254 					cmd_t *cmd_p;
    255 					cmd_p = cmd_set($3, CMD_CONNECT, $2);
    256 					if (cmd_p)
    257 						process_cmd(g_hndl, cmd_p);
    258 				}
    259 			| CONNECT FCNNAME exprlist NL
    260 				{
    261 					cmd_t *cmd_p;
    262 					cmd_p = cmd_expr($3, CMD_CONNECT, $2);
    263 					if (cmd_p)
    264 						process_cmd(g_hndl, cmd_p);
    265 				}
    266 			;
    267 
    268 clear_statement		: CLEAR SETNAME NL
    269 				{
    270 					cmd_t *cmd_p;
    271 					cmd_p = cmd_set($2, CMD_CLEAR, NULL);
    272 					if (cmd_p)
    273 						process_cmd(g_hndl, cmd_p);
    274 				}
    275 			| CLEAR exprlist NL
    276 				{
    277 					cmd_t *cmd_p;
    278 					cmd_p = cmd_expr($2, CMD_CLEAR, NULL);
    279 					if (cmd_p)
    280 						process_cmd(g_hndl, cmd_p);
    281 				}
    282 			;
    283 
    284 create_statement	: CREATE SETNAME exprlist NL	{ (void) set($2, $3); }
    285 			| CREATE FCNNAME IDENT NL	{ fcn($2, $3); }
    286 			;
    287 
    288 source_statement	: SOURCE VALSTR NL	{ source_file($2); }
    289 			| SOURCE IDENT NL	{ source_file($2); }
    290 			;
    291 
    292 listsets_statement	: LIST SETS NL		{ set_list(); }
    293 			;
    294 
    295 listhistory_statement	: LIST HISTORY NL	{ cmd_list(); }
    296 			;
    297 
    298 listtracefile_statement	: LIST TRACEFILE NL	{ cmd_listtracefile(); }
    299 			;
    300 
    301 listfcns_statement	: LIST FCNS NL		{ fcn_list(); }
    302 			;
    303 
    304 			;
    305 
    306 pfilter_statement	: PFILTER ON NL
    307 					{ prbk_set_pfilter_mode(B_TRUE); }
    308 			| PFILTER OFF NL
    309 					{ prbk_set_pfilter_mode(B_FALSE); }
    310 			| PFILTER ADD pidlist NL
    311 					{ prbk_pfilter_add($3); }
    312 			| PFILTER DELETE pidlist NL
    313 					{ prbk_pfilter_drop($3); }
    314 			| PFILTER NL
    315 					{ prbk_show_pfilter_mode(); }
    316 			;
    317 
    318 ktrace_statement	: KTRACE ON NL
    319 					{ prbk_set_tracing(B_TRUE); }
    320 			| KTRACE OFF NL
    321 					{ prbk_set_tracing(B_FALSE); }
    322 			| KTRACE NL
    323 					{ prbk_show_tracing(); }
    324 			;
    325 
    326 listprobes_statement	: LIST speclist PROBES SETNAME NL
    327 						{ list_set($2, $4); }
    328 			| LIST speclist PROBES exprlist NL
    329 						{ list_expr($2, $4); }
    330 			;
    331 
    332 listvalues_statement	: LIST VALUES speclist NL { list_values($3); }
    333 			;
    334 
    335 exprlist		: /* empty */		{ $$ = NULL; }
    336 			| exprlist expr		{ $$ = expr_list($1, $2); }
    337 			;
    338 
    339 speclist		: /* empty */		{ $$ = NULL; }
    340 			| speclist spec		{ $$ = spec_list($1, $2); }
    341 			;
    342 
    343 expr			: spec EQ spec		{ $$ = expr($1, $3); }
    344 			| spec			{ $$ = expr(spec(strdup("keys"),
    345 							SPEC_EXACT), $1); }
    346 			;
    347 
    348 spec			: IDENT			{ $$ = spec($1, SPEC_EXACT); }
    349 			| VALSTR		{ $$ = spec($1, SPEC_EXACT); }
    350 			| REGEXP		{ $$ = spec($1, SPEC_REGEXP); }
    351 			;
    352 
    353 pidlist			: pidlist COMMA singlepid
    354 				{ $$ = prbk_pidlist_add($1, $3); }
    355 			| singlepid
    356 				{ $$ = prbk_pidlist_add(NULL, $1); }
    357 			;
    358 
    359 singlepid		: SCALED_INT
    360 			;
    361 
    362 buffer_statement	: BUFFER NL
    363 				{
    364 				    prbk_buffer_list();
    365 				}
    366 			| BUFFER ALLOC NL
    367 				{
    368 				    extern int g_outsize;
    369 				    prbk_buffer_alloc(g_outsize);
    370 				}
    371 			| BUFFER ALLOC SCALED_INT NL
    372 				{
    373 				    prbk_buffer_alloc($3);
    374 				}
    375 			| BUFFER DEALLOC NL
    376 				{
    377 				    prbk_buffer_dealloc();
    378 				}
    379 			;
    380 
    381 
    382 %%
    383