1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * 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 * Copyright (c) 1994, by Sun Microsytems, Inc.
24 */
25
26#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28/*
29 * Includes
30 */
31
32#ifndef DEBUG
33#define	NDEBUG	1
34#endif
35
36#include <stdio.h>
37#include <stdlib.h>
38#include <assert.h>
39#include <libintl.h>
40#include "cmd.h"
41#include "set.h"
42#include "fcn.h"
43#include "new.h"
44#include "source.h"
45
46
47/*
48 * Globals
49 */
50
51static queue_node_t g_cmdlist = {
52	&g_cmdlist,
53&g_cmdlist};
54
55
56/*
57 * cmd_set() - creates a cmd using a named set and adds it to the global list
58 */
59
60cmd_t *
61cmd_set(char *setname_p, cmd_kind_t kind, char *fcnname_p)
62{
63	cmd_t		  *new_p;
64	set_t		  *set_p;
65
66	set_p = set_find(setname_p);
67	if (!set_p) {
68		semantic_err(gettext("no set named \"$%s\""), setname_p);
69		return (NULL);
70	}
71	if (kind == CMD_CONNECT && !fcn_find(fcnname_p)) {
72		semantic_err(gettext("no function named \"&%s\""), fcnname_p);
73		return (NULL);
74	}
75	new_p = new(cmd_t);
76	queue_init(&new_p->qn);
77#ifdef LATEBINDSETS
78	new_p->isnamed = B_TRUE;
79	new_p->expr.setname_p = setname_p;
80#else
81	new_p->isnamed = B_FALSE;
82	new_p->expr.expr_p = expr_dup(set_p->exprlist_p);
83#endif
84	new_p->isnew = B_TRUE;
85	new_p->kind = kind;
86	new_p->fcnname_p = fcnname_p;
87
88	(void) queue_append(&g_cmdlist, &new_p->qn);
89	return (new_p);
90
91}				/* end cmd_set */
92
93
94/*
95 * cmd_expr() - creates a cmd using a set and adds it to the global list
96 */
97
98cmd_t *
99cmd_expr(expr_t * expr_p, cmd_kind_t kind, char *fcnname_p)
100{
101	cmd_t		  *new_p;
102
103	if (kind == CMD_CONNECT && !fcn_find(fcnname_p)) {
104		semantic_err(gettext("no function named \"&%s\""), fcnname_p);
105		return (NULL);
106	}
107	new_p = new(cmd_t);
108	queue_init(&new_p->qn);
109	new_p->isnamed = B_FALSE;
110	new_p->expr.expr_p = expr_p;
111	new_p->isnew = B_TRUE;
112	new_p->kind = kind;
113	new_p->fcnname_p = fcnname_p;
114
115	(void) queue_append(&g_cmdlist, &new_p->qn);
116	return (new_p);
117
118}				/* end cmd */
119
120
121#if 0
122/*
123 * cmd_destroy()
124 */
125
126static void
127cmd_destroy(cmd_t * cmd_p)
128{
129	if (!cmd_p)
130		return;
131
132	if (!queue_isempty(&cmd_p->qn))
133		(void) queue_remove(&cmd_p->qn);
134
135	if (!cmd_p->isnamed)
136		expr_destroy(cmd_p->expr.expr_p);
137
138	free(cmd_p);
139
140}				/* end cmd_destroy */
141#endif
142
143
144/*
145 * cmd_list() - pretty prints the global cmdlist
146 */
147
148void
149cmd_list(void)
150{
151	cmd_t		  *cmd_p;
152	int			 i = 0;
153	char		   *str_p;
154
155	cmd_p = (cmd_t *) & g_cmdlist;
156	while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) {
157		switch (cmd_p->kind) {
158		case CMD_ENABLE:
159			str_p = "enable ";
160			break;
161		case CMD_DISABLE:
162			str_p = "disable";
163			break;
164		case CMD_CONNECT:
165			str_p = "connect";
166			break;
167		case CMD_CLEAR:
168			str_p = "clear  ";
169			break;
170		case CMD_TRACE:
171			str_p = "trace  ";
172			break;
173		case CMD_UNTRACE:
174			str_p = "untrace";
175			break;
176		default:
177			str_p = "???????";
178			break;
179		}
180		(void) printf("[%d] %s ", i++, str_p);
181
182		if (cmd_p->kind == CMD_CONNECT) {
183			(void) printf("&%s ", cmd_p->fcnname_p);
184		}
185		if (!cmd_p->isnamed) {
186			expr_print(stdout, cmd_p->expr.expr_p);
187		}
188
189		(void) printf("\n");
190	}
191
192}				/* end cmd_list */
193
194
195/*
196 * cmd_traverse() - calls the suppied traversal function on each command.
197 */
198
199tnfctl_errcode_t
200cmd_traverse(cmd_traverse_func_t percmdfunc, void *calldata_p)
201{
202	cmd_t			*cmd_p;
203	tnfctl_errcode_t	err = TNFCTL_ERR_NONE;
204
205	cmd_p = (cmd_t *) & g_cmdlist;
206	while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) {
207		expr_t		 *expr_p;
208		fcn_t		  *fcn_p;
209
210		if (!cmd_p->isnamed) {
211			expr_p = cmd_p->expr.expr_p;
212		}
213
214		if (cmd_p->kind == CMD_CONNECT) {
215			fcn_p = fcn_find(cmd_p->fcnname_p);
216			assert(fcn_p);
217		}
218		else
219			fcn_p = NULL;
220
221		err = (*percmdfunc) (expr_p,
222			cmd_p->kind,
223			fcn_p, cmd_p->isnew, calldata_p);
224		if (err)
225			return (err);
226	}
227	return (err);
228}				/* end cmd_traverse */
229
230
231/*
232 * cmd_traverse() - calls the suppied traversal function on each command.
233 */
234
235tnfctl_errcode_t
236cmd_callback(cmd_t *cmd_p, cmd_traverse_func_t percmdfunc, void *calldata_p)
237{
238	tnfctl_errcode_t	err = TNFCTL_ERR_NONE;
239	expr_t			*expr_p;
240	fcn_t			*fcn_p;
241
242	if (!cmd_p->isnamed) {
243		expr_p = cmd_p->expr.expr_p;
244	}
245
246	if (cmd_p->kind == CMD_CONNECT) {
247		fcn_p = fcn_find(cmd_p->fcnname_p);
248		assert(fcn_p);
249	}
250	else
251		fcn_p = NULL;
252
253	err = (*percmdfunc) (expr_p, cmd_p->kind, fcn_p, cmd_p->isnew,
254				calldata_p);
255
256	return (err);
257}
258
259#ifdef NOTNEEDED
260/*
261 * cmd_mark() - mark all of the commands in the global list as old
262 */
263
264void
265cmd_mark(void)
266{
267	cmd_t		  *cmd_p;
268
269	cmd_p = (cmd_t *) & g_cmdlist;
270	while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) {
271		cmd_p->isnew = B_FALSE;
272	}
273
274}				/* end cmd_mark */
275
276/*
277 * cmd_delete() -
278 */
279
280void
281cmd_delete(int cmdnum)
282{
283	cmd_t		  *cmd_p;
284	int			 i = 0;
285
286	cmd_p = (cmd_t *) & g_cmdlist;
287	while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) {
288		if (cmdnum == i) {
289			cmd_destroy(cmd_p);
290			return;
291		}
292		i++;
293	}
294
295}				/* end cmd_delete */
296#endif
297