|
@@ -1429,137 +1429,6 @@ char *errmsg;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/*
|
|
|
|
|
- * LOCAL FUNCTION
|
|
|
|
|
- *
|
|
|
|
|
- * Convert sub-expression to string.
|
|
|
|
|
- */
|
|
|
|
|
-
|
|
|
|
|
-static int
|
|
|
|
|
-acl_expr_string( ACLExprOp_t logical, ACLExprStack_t *expr_stack )
|
|
|
|
|
-{
|
|
|
|
|
-char **expr_text;
|
|
|
|
|
-char **prev_expr_text;
|
|
|
|
|
-char *tmp;
|
|
|
|
|
-
|
|
|
|
|
- switch (logical) {
|
|
|
|
|
- case ACL_EXPR_OP_NOT:
|
|
|
|
|
- if ( expr_stack->stack_index < 1 ) {
|
|
|
|
|
- printf("expression stack underflow.\n");
|
|
|
|
|
- return(ACLERRINTERNAL);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- expr_text = &expr_stack->expr_text[expr_stack->stack_index - 1];
|
|
|
|
|
- tmp = (char *) PERM_MALLOC(strlen(*expr_text) + 7);
|
|
|
|
|
- if ( tmp == NULL )
|
|
|
|
|
- return(ACLERRNOMEM);
|
|
|
|
|
-
|
|
|
|
|
- if ( expr_stack->found_subexpression ) {
|
|
|
|
|
- sprintf(tmp, "not (%s)", *expr_text);
|
|
|
|
|
- expr_stack->found_subexpression = 0;
|
|
|
|
|
- expr_stack->last_subexpression = expr_stack->stack_index - 1;
|
|
|
|
|
- } else {
|
|
|
|
|
- sprintf(tmp, "not %s", *expr_text);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- PERM_FREE(*expr_text);
|
|
|
|
|
- *expr_text = tmp;
|
|
|
|
|
- return(0);
|
|
|
|
|
-
|
|
|
|
|
- case ACL_EXPR_OP_AND:
|
|
|
|
|
- case ACL_EXPR_OP_OR:
|
|
|
|
|
- if ( expr_stack->stack_index < 2 ) {
|
|
|
|
|
- printf("expression stack underflow.\n");
|
|
|
|
|
- return(ACLERRINTERNAL);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- expr_stack->stack_index--;
|
|
|
|
|
- prev_expr_text = &expr_stack->expr_text[expr_stack->stack_index];
|
|
|
|
|
- expr_stack->stack_index--;
|
|
|
|
|
- expr_text = &expr_stack->expr_text[expr_stack->stack_index];
|
|
|
|
|
-
|
|
|
|
|
- tmp = (char *) PERM_MALLOC (strlen(*expr_text)
|
|
|
|
|
- + strlen(*prev_expr_text) + 15);
|
|
|
|
|
- if ( tmp == NULL )
|
|
|
|
|
- return(ACLERRNOMEM);
|
|
|
|
|
-
|
|
|
|
|
- if ( expr_stack->found_subexpression &&
|
|
|
|
|
- expr_stack->stack_index == expr_stack->last_subexpression &&
|
|
|
|
|
- logical == ACL_EXPR_OP_AND ) {
|
|
|
|
|
- sprintf(tmp, "%s and\n (%s)", *expr_text, *prev_expr_text);
|
|
|
|
|
- } else if ( expr_stack->found_subexpression &&
|
|
|
|
|
- expr_stack->stack_index == expr_stack->last_subexpression ) {
|
|
|
|
|
- sprintf(tmp, "%s or\n (%s)", *expr_text, *prev_expr_text);
|
|
|
|
|
- } else if ( logical == ACL_EXPR_OP_AND ) {
|
|
|
|
|
- sprintf(tmp, "%s and\n %s", *expr_text, *prev_expr_text);
|
|
|
|
|
- } else {
|
|
|
|
|
- sprintf(tmp, "%s or\n %s", *expr_text, *prev_expr_text);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- expr_stack->found_subexpression++;
|
|
|
|
|
- expr_stack->stack_index++;
|
|
|
|
|
- PERM_FREE(*expr_text);
|
|
|
|
|
- PERM_FREE(*prev_expr_text);
|
|
|
|
|
- *expr_text = tmp;
|
|
|
|
|
- *prev_expr_text = NULL;
|
|
|
|
|
- return(0);
|
|
|
|
|
-
|
|
|
|
|
- default:
|
|
|
|
|
- printf("Bad boolean logic value.\n");
|
|
|
|
|
- return(ACLERRINTERNAL);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-/*
|
|
|
|
|
- * LOCAL FUNCTION
|
|
|
|
|
- *
|
|
|
|
|
- * Reduce all sub-expressions to a single string.
|
|
|
|
|
- */
|
|
|
|
|
-
|
|
|
|
|
-static int
|
|
|
|
|
-acl_reduce_expr_logic( ACLExprStack_t *expr_stack, ACLExprRaw_t *expr_raw )
|
|
|
|
|
-{
|
|
|
|
|
-char **expr_text;
|
|
|
|
|
-char **prev_expr_text;
|
|
|
|
|
-char *tmp;
|
|
|
|
|
-
|
|
|
|
|
- if (expr_raw->attr_name) {
|
|
|
|
|
- if (expr_stack->stack_index >= ACL_EXPR_STACK ) {
|
|
|
|
|
- printf("expression stack overflow.");
|
|
|
|
|
- return(ACLERRINTERNAL);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if ( expr_stack->found_subexpression && expr_stack->stack_index > 0 ) {
|
|
|
|
|
- prev_expr_text = &expr_stack->expr_text[expr_stack->stack_index-1];
|
|
|
|
|
- tmp = (char *) PERM_MALLOC(strlen(*prev_expr_text) + 3);
|
|
|
|
|
- sprintf(tmp, "(%s)", *prev_expr_text);
|
|
|
|
|
- PERM_FREE(*prev_expr_text);
|
|
|
|
|
- *prev_expr_text = tmp;
|
|
|
|
|
- expr_stack->found_subexpression = 0;
|
|
|
|
|
- expr_stack->last_subexpression = expr_stack->stack_index - 1;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- expr_stack->expr[expr_stack->stack_index] = expr_raw;
|
|
|
|
|
- expr_text = &expr_stack->expr_text[expr_stack->stack_index];
|
|
|
|
|
- *expr_text = (char *) PERM_MALLOC(strlen(expr_raw->attr_name)
|
|
|
|
|
- + strlen(expr_raw->attr_pattern)
|
|
|
|
|
- + 7);
|
|
|
|
|
- if ( *expr_text == NULL )
|
|
|
|
|
- return(ACLERRNOMEM);
|
|
|
|
|
-
|
|
|
|
|
- sprintf(*expr_text, "%s %s \"%s\"", expr_raw->attr_name,
|
|
|
|
|
- acl_comp_string(expr_raw->comparator),
|
|
|
|
|
- expr_raw->attr_pattern);
|
|
|
|
|
-
|
|
|
|
|
- expr_stack->stack_index++;
|
|
|
|
|
- expr_stack->expr_text[expr_stack->stack_index] = NULL;
|
|
|
|
|
- } else {
|
|
|
|
|
- return(acl_expr_string(expr_raw->logical, expr_stack));
|
|
|
|
|
- }
|
|
|
|
|
- return(0);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
* Delete a named ACL from an ACL list
|
|
* Delete a named ACL from an ACL list
|