/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1994, by Sun Microsytems, Inc. */ #pragma ident "%Z%%M% %I% %E% SMI" /* * Includes */ #ifndef DEBUG #define NDEBUG 1 #endif #include #include #include #include #include "cmd.h" #include "set.h" #include "fcn.h" #include "new.h" #include "source.h" /* * Globals */ static queue_node_t g_cmdlist = { &g_cmdlist, &g_cmdlist}; /* * cmd_set() - creates a cmd using a named set and adds it to the global list */ cmd_t * cmd_set(char *setname_p, cmd_kind_t kind, char *fcnname_p) { cmd_t *new_p; set_t *set_p; set_p = set_find(setname_p); if (!set_p) { semantic_err(gettext("no set named \"$%s\""), setname_p); return (NULL); } if (kind == CMD_CONNECT && !fcn_find(fcnname_p)) { semantic_err(gettext("no function named \"&%s\""), fcnname_p); return (NULL); } new_p = new(cmd_t); queue_init(&new_p->qn); #ifdef LATEBINDSETS new_p->isnamed = B_TRUE; new_p->expr.setname_p = setname_p; #else new_p->isnamed = B_FALSE; new_p->expr.expr_p = expr_dup(set_p->exprlist_p); #endif new_p->isnew = B_TRUE; new_p->kind = kind; new_p->fcnname_p = fcnname_p; (void) queue_append(&g_cmdlist, &new_p->qn); return (new_p); } /* end cmd_set */ /* * cmd_expr() - creates a cmd using a set and adds it to the global list */ cmd_t * cmd_expr(expr_t * expr_p, cmd_kind_t kind, char *fcnname_p) { cmd_t *new_p; if (kind == CMD_CONNECT && !fcn_find(fcnname_p)) { semantic_err(gettext("no function named \"&%s\""), fcnname_p); return (NULL); } new_p = new(cmd_t); queue_init(&new_p->qn); new_p->isnamed = B_FALSE; new_p->expr.expr_p = expr_p; new_p->isnew = B_TRUE; new_p->kind = kind; new_p->fcnname_p = fcnname_p; (void) queue_append(&g_cmdlist, &new_p->qn); return (new_p); } /* end cmd */ #if 0 /* * cmd_destroy() */ static void cmd_destroy(cmd_t * cmd_p) { if (!cmd_p) return; if (!queue_isempty(&cmd_p->qn)) (void) queue_remove(&cmd_p->qn); if (!cmd_p->isnamed) expr_destroy(cmd_p->expr.expr_p); free(cmd_p); } /* end cmd_destroy */ #endif /* * cmd_list() - pretty prints the global cmdlist */ void cmd_list(void) { cmd_t *cmd_p; int i = 0; char *str_p; cmd_p = (cmd_t *) & g_cmdlist; while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) { switch (cmd_p->kind) { case CMD_ENABLE: str_p = "enable "; break; case CMD_DISABLE: str_p = "disable"; break; case CMD_CONNECT: str_p = "connect"; break; case CMD_CLEAR: str_p = "clear "; break; case CMD_TRACE: str_p = "trace "; break; case CMD_UNTRACE: str_p = "untrace"; break; default: str_p = "???????"; break; } (void) printf("[%d] %s ", i++, str_p); if (cmd_p->kind == CMD_CONNECT) { (void) printf("&%s ", cmd_p->fcnname_p); } if (!cmd_p->isnamed) { expr_print(stdout, cmd_p->expr.expr_p); } (void) printf("\n"); } } /* end cmd_list */ /* * cmd_traverse() - calls the suppied traversal function on each command. */ tnfctl_errcode_t cmd_traverse(cmd_traverse_func_t percmdfunc, void *calldata_p) { cmd_t *cmd_p; tnfctl_errcode_t err = TNFCTL_ERR_NONE; cmd_p = (cmd_t *) & g_cmdlist; while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) { expr_t *expr_p; fcn_t *fcn_p; if (!cmd_p->isnamed) { expr_p = cmd_p->expr.expr_p; } if (cmd_p->kind == CMD_CONNECT) { fcn_p = fcn_find(cmd_p->fcnname_p); assert(fcn_p); } else fcn_p = NULL; err = (*percmdfunc) (expr_p, cmd_p->kind, fcn_p, cmd_p->isnew, calldata_p); if (err) return (err); } return (err); } /* end cmd_traverse */ /* * cmd_traverse() - calls the suppied traversal function on each command. */ tnfctl_errcode_t cmd_callback(cmd_t *cmd_p, cmd_traverse_func_t percmdfunc, void *calldata_p) { tnfctl_errcode_t err = TNFCTL_ERR_NONE; expr_t *expr_p; fcn_t *fcn_p; if (!cmd_p->isnamed) { expr_p = cmd_p->expr.expr_p; } if (cmd_p->kind == CMD_CONNECT) { fcn_p = fcn_find(cmd_p->fcnname_p); assert(fcn_p); } else fcn_p = NULL; err = (*percmdfunc) (expr_p, cmd_p->kind, fcn_p, cmd_p->isnew, calldata_p); return (err); } #ifdef NOTNEEDED /* * cmd_mark() - mark all of the commands in the global list as old */ void cmd_mark(void) { cmd_t *cmd_p; cmd_p = (cmd_t *) & g_cmdlist; while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) { cmd_p->isnew = B_FALSE; } } /* end cmd_mark */ /* * cmd_delete() - */ void cmd_delete(int cmdnum) { cmd_t *cmd_p; int i = 0; cmd_p = (cmd_t *) & g_cmdlist; while ((cmd_p = (cmd_t *) queue_next(&g_cmdlist, &cmd_p->qn))) { if (cmdnum == i) { cmd_destroy(cmd_p); return; } i++; } } /* end cmd_delete */ #endif