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