X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibrewrite%2Fcontext.c;h=c5770de8928385d5e81278f52aa06f3183581a24;hb=ec24e6293fac6a4c196f49a8575707b5dedefd1d;hp=9d4f9b794ea2d629a961b4adaed8fb2713295038;hpb=fdbe100e5f134aead3920c882573eb30057e5054;p=openldap
diff --git a/libraries/librewrite/context.c b/libraries/librewrite/context.c
index 9d4f9b794e..c5770de892 100644
--- a/libraries/librewrite/context.c
+++ b/libraries/librewrite/context.c
@@ -1,31 +1,24 @@
-/******************************************************************************
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software .
*
- * Copyright (C) 2000 Pierangelo Masarati,
+ * Copyright 2000-2005 The OpenLDAP Foundation.
* All rights reserved.
*
- * Permission is granted to anyone to use this software for any purpose
- * on any computer system, and to alter it and redistribute it, subject
- * to the following restrictions:
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
*
- * 1. The author is not responsible for the consequences of use of this
- * software, no matter how awful, even if they arise from flaws in it.
- *
- * 2. The origin of this software must not be misrepresented, either by
- * explicit claim or by omission. Since few users ever read sources,
- * credits should appear in the documentation.
- *
- * 3. Altered versions must be plainly marked as such, and must not be
- * misrepresented as being the original software. Since few users
- * ever read sources, credits should appear in the documentation.
- *
- * 4. This notice may not be removed or altered.
- *
- ******************************************************************************/
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * .
+ */
+/* ACKNOWLEDGEMENT:
+ * This work was initially developed by Pierangelo Masarati for
+ * inclusion in OpenLDAP Software.
+ */
#include
-#include
-
#include "rewrite-int.h"
/*
@@ -38,10 +31,10 @@ rewrite_context_cmp(
const void *c2
)
{
- struct rewrite_context *lc1, *lc2;
+ const struct rewrite_context *lc1, *lc2;
- lc1 = (struct rewrite_context *)c1;
- lc2 = (struct rewrite_context *)c2;
+ lc1 = (const struct rewrite_context *)c1;
+ lc2 = (const struct rewrite_context *)c2;
assert( c1 != NULL );
assert( c2 != NULL );
@@ -146,6 +139,7 @@ rewrite_context_create(
free( context );
return NULL;
}
+ memset( context->lc_rule, 0, sizeof( struct rewrite_rule ) );
/*
* Add context to tree
@@ -224,10 +218,10 @@ rewrite_context_apply(
assert( op->lo_depth > 0 );
Debug( LDAP_DEBUG_TRACE, "==> rewrite_context_apply"
- " [depth=%d] string='%s'\n%s",
- op->lo_depth, string, "" );
+ " [depth=%d] string='%s'\n",
+ op->lo_depth, string, 0 );
- s = strdup( string );
+ s = (char *)string;
for ( rule = context->lc_rule->lr_next;
rule != NULL && op->lo_num_passes < info->li_max_passes;
@@ -252,7 +246,7 @@ rewrite_context_apply(
case REWRITE_REGEXEC_ERR:
Debug( LDAP_DEBUG_ANY, "==> rewrite_context_apply"
- " error ...\n%s%s%s", "", "", "");
+ " error ...\n", 0, 0, 0);
/*
* Checks for special actions to be taken
@@ -274,8 +268,7 @@ rewrite_context_apply(
case REWRITE_ACTION_IGNORE_ERR:
Debug( LDAP_DEBUG_ANY,
"==> rewrite_context_apply"
- " ignoring error ...\n%s%s%s",
- "", "", "" );
+ " ignoring error ...\n", 0, 0, 0 );
do_continue = 1;
break;
@@ -328,7 +321,9 @@ rewrite_context_apply(
if ( res != NULL ) {
struct rewrite_action *action;
- free( s );
+ if ( s != string && s != res ) {
+ free( s );
+ }
s = res;
for ( action = rule->lr_action;
@@ -364,6 +359,15 @@ rewrite_context_apply(
goto rc_end_of_context;
}
break;
+
+ /*
+ * This ends the rewrite context
+ * and returns a user-defined
+ * error code
+ */
+ case REWRITE_ACTION_USER:
+ return_code = ((int *)action->la_args)[ 0 ];
+ goto rc_end_of_context;
default:
/* ... */
@@ -392,10 +396,17 @@ rewrite_context_apply(
* This will instruct the server to return
* an `unwilling to perform' error message
*/
- case REWRITE_REGEXEC_UNWILLING:
+ case REWRITE_REGEXEC_UNWILLING:
return_code = REWRITE_REGEXEC_UNWILLING;
goto rc_end_of_context;
+ /*
+ * A user-defined error code has propagated ...
+ */
+ default:
+ assert( rc >= REWRITE_REGEXEC_USER );
+ goto rc_end_of_context;
+
}
rc_continue:; /* sent here by actions that require to continue */
@@ -415,3 +426,49 @@ rc_end_of_context:;
return return_code;
}
+void
+rewrite_context_free(
+ void *tmp
+)
+{
+ struct rewrite_context *context = (struct rewrite_context *)tmp;
+
+ assert( tmp != NULL );
+
+ rewrite_context_destroy( &context );
+}
+
+int
+rewrite_context_destroy(
+ struct rewrite_context **pcontext
+)
+{
+ struct rewrite_context *context;
+ struct rewrite_rule *r;
+
+ assert( pcontext != NULL );
+ assert( *pcontext != NULL );
+
+ context = *pcontext;
+
+ assert( context->lc_rule != NULL );
+
+ for ( r = context->lc_rule->lr_next; r; ) {
+ struct rewrite_rule *cr = r;
+
+ r = r->lr_next;
+ rewrite_rule_destroy( &cr );
+ }
+
+ free( context->lc_rule );
+ context->lc_rule = NULL;
+
+ assert( context->lc_name != NULL );
+ free( context->lc_name );
+ context->lc_name = NULL;
+
+ free( context );
+ *pcontext = NULL;
+
+ return 0;
+}