X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibrewrite%2Frewrite-int.h;h=ca8873b06af622c219e893e0d8774ea8fc74773f;hb=1f635b8bcfaaac666005a88a5620e9798c9565e1;hp=1a21ca80d39a1164ad3b17a1c6f54364878d4861;hpb=1aa97d5f87981a4f113f28d0852f2ab130c4e2f7;p=openldap diff --git a/libraries/librewrite/rewrite-int.h b/libraries/librewrite/rewrite-int.h index 1a21ca80d3..ca8873b06a 100644 --- a/libraries/librewrite/rewrite-int.h +++ b/libraries/librewrite/rewrite-int.h @@ -1,26 +1,21 @@ -/****************************************************************************** +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . * - * Copyright (C) 2000 Pierangelo Masarati, + * Copyright 2000-2007 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. + */ #ifndef REWRITE_INT_H #define REWRITE_INT_H @@ -39,7 +34,7 @@ #include #include #include "../libldap/ldap-int.h" - +#include #include #include @@ -58,8 +53,12 @@ /* * Submatch escape char */ -//#define REWRITE_SUBMATCH_ESCAPE '\\' -#define REWRITE_SUBMATCH_ESCAPE '%' +/* the '\' conflicts with slapd.conf parsing */ +/* #define REWRITE_SUBMATCH_ESCAPE '\\' */ +#define REWRITE_SUBMATCH_ESCAPE_ORIG '%' +#define REWRITE_SUBMATCH_ESCAPE '$' +#define IS_REWRITE_SUBMATCH_ESCAPE(c) \ + ((c) == REWRITE_SUBMATCH_ESCAPE || (c) == REWRITE_SUBMATCH_ESCAPE_ORIG) /* * REGEX flags @@ -75,6 +74,8 @@ #define REWRITE_FLAG_STOP '@' #define REWRITE_FLAG_UNWILLING '#' #define REWRITE_FLAG_GOTO 'G' /* requires an arg */ +#define REWRITE_FLAG_USER 'U' /* requires an arg */ +#define REWRITE_FLAG_MAX_PASSES 'M' /* requires an arg */ #define REWRITE_FLAG_IGNORE_ERR 'I' /* @@ -101,6 +102,7 @@ struct rewrite_action { #define REWRITE_ACTION_UNWILLING 0x0002 #define REWRITE_ACTION_GOTO 0x0003 #define REWRITE_ACTION_IGNORE_ERR 0x0004 +#define REWRITE_ACTION_USER 0x0005 int la_type; void *la_args; }; @@ -155,10 +157,11 @@ struct rewrite_map { * Builtin maps */ struct rewrite_builtin_map { -#define REWRITE_BUILTIN_MAP_LDAP 0x0201 +#define REWRITE_BUILTIN_MAP 0x0200 int lb_type; char *lb_name; void *lb_private; + const rewrite_mapper *lb_mapper; #ifdef USE_REWRITE_LDAP_PVT_THREADS ldap_pvt_thread_mutex_t lb_mutex; @@ -188,10 +191,10 @@ struct rewrite_submatch { */ struct rewrite_subst { size_t lt_subs_len; - struct berval **lt_subs; + struct berval *lt_subs; int lt_num_submatch; - struct rewrite_submatch **lt_submatch; + struct rewrite_submatch *lt_submatch; }; /* @@ -204,7 +207,7 @@ struct rewrite_rule { char *lr_pattern; char *lr_subststring; char *lr_flagstring; - regex_t lr_regex; + regex_t lr_regex; /* * I was thinking about some kind of per-rule mutex, but there's @@ -221,6 +224,7 @@ struct rewrite_rule { #define REWRITE_RECURSE 0x0001 #define REWRITE_EXEC_ONCE 0x0002 int lr_mode; + int lr_max_passes; struct rewrite_action *lr_action; }; @@ -242,7 +246,9 @@ struct rewrite_session { Avlnode *ls_vars; #ifdef USE_REWRITE_LDAP_PVT_THREADS ldap_pvt_thread_rdwr_t ls_vars_mutex; + ldap_pvt_thread_mutex_t ls_mutex; #endif /* USE_REWRITE_LDAP_PVT_THREADS */ + int ls_count; }; /* @@ -250,6 +256,7 @@ struct rewrite_session { */ struct rewrite_var { char *lv_name; + int lv_flags; struct berval lv_value; }; @@ -259,7 +266,9 @@ struct rewrite_var { struct rewrite_op { int lo_num_passes; int lo_depth; +#if 0 /* FIXME: not used anywhere! (debug? then, why strdup?) */ char *lo_string; +#endif char *lo_result; Avlnode *lo_vars; const void *lo_cookie; @@ -301,6 +310,7 @@ struct rewrite_info { */ #define REWRITE_MAXPASSES 100 int li_max_passes; + int li_max_passes_per_rule; /* * Behavior in case a NULL or non-existent context is required @@ -312,6 +322,7 @@ struct rewrite_info { * PRIVATE * ***********/ +LDAP_REWRITE_V (struct rewrite_context*) rewrite_int_curr_context; /* * Maps @@ -320,14 +331,14 @@ struct rewrite_info { /* * Parses a map (also in legacy 'x' version) */ -extern struct rewrite_map * +LDAP_REWRITE_F (struct rewrite_map *) rewrite_map_parse( struct rewrite_info *info, const char *s, const char **end ); -extern struct rewrite_map * +LDAP_REWRITE_F (struct rewrite_map *) rewrite_xmap_parse( struct rewrite_info *info, const char *s, @@ -337,7 +348,7 @@ rewrite_xmap_parse( /* * Resolves key in val by means of map (also in legacy 'x' version) */ -extern int +LDAP_REWRITE_F (int) rewrite_map_apply( struct rewrite_info *info, struct rewrite_op *op, @@ -346,7 +357,7 @@ rewrite_map_apply( struct berval *val ); -extern int +LDAP_REWRITE_F (int) rewrite_xmap_apply( struct rewrite_info *info, struct rewrite_op *op, @@ -355,7 +366,20 @@ rewrite_xmap_apply( struct berval *val ); +LDAP_REWRITE_F (int) +rewrite_map_destroy( + struct rewrite_map **map +); +LDAP_REWRITE_F (int) +rewrite_xmap_destroy( + struct rewrite_map **map +); + +LDAP_REWRITE_F (void) +rewrite_builtin_map_free( + void *map +); /* * Submatch substitution */ @@ -363,7 +387,7 @@ rewrite_xmap_apply( /* * Compiles a substitution pattern */ -extern struct rewrite_subst * +LDAP_REWRITE_F (struct rewrite_subst *) rewrite_subst_compile( struct rewrite_info *info, const char *result @@ -373,7 +397,7 @@ rewrite_subst_compile( * Substitutes a portion of rewritten string according to substitution * pattern using submatches */ -extern int +LDAP_REWRITE_F (int) rewrite_subst_apply( struct rewrite_info *info, struct rewrite_op *op, @@ -383,6 +407,11 @@ rewrite_subst_apply( struct berval *val ); +LDAP_REWRITE_F (int) +rewrite_subst_destroy( + struct rewrite_subst **subst +); + /* * Rules @@ -391,7 +420,7 @@ rewrite_subst_apply( /* * Compiles the rule and appends it at the running context */ -extern int +LDAP_REWRITE_F (int) rewrite_rule_compile( struct rewrite_info *info, struct rewrite_context *context, @@ -409,7 +438,7 @@ rewrite_rule_compile( * REWRITE_REGEXEC_UNWILL: rule matched; force 'unwilling to perform' * REWRITE_REGEXEC_ERR: an error occurred */ -extern int +LDAP_REWRITE_F (int) rewrite_rule_apply( struct rewrite_info *info, struct rewrite_op *op, @@ -418,6 +447,11 @@ rewrite_rule_apply( char **result ); +LDAP_REWRITE_F (int) +rewrite_rule_destroy( + struct rewrite_rule **rule +); + /* * Sessions */ @@ -425,7 +459,7 @@ rewrite_rule_apply( /* * Fetches a struct rewrite_session */ -extern struct rewrite_session * +LDAP_REWRITE_F (struct rewrite_session *) rewrite_session_find( struct rewrite_info *info, const void *cookie @@ -434,18 +468,19 @@ rewrite_session_find( /* * Defines and inits a variable with session scope */ -extern int -rewrite_session_var_set( +LDAP_REWRITE_F (int) +rewrite_session_var_set_f( struct rewrite_info *info, const void *cookie, const char *name, - const char *value + const char *value, + int flags ); /* * Gets a var with session scope */ -extern int +LDAP_REWRITE_F (int) rewrite_session_var_get( struct rewrite_info *info, const void *cookie, @@ -456,7 +491,7 @@ rewrite_session_var_get( /* * Deletes a session */ -extern int +LDAP_REWRITE_F (int) rewrite_session_delete( struct rewrite_info *info, const void *cookie @@ -465,7 +500,7 @@ rewrite_session_delete( /* * Destroys the cookie tree */ -extern int +LDAP_REWRITE_F (int) rewrite_session_destroy( struct rewrite_info *info ); @@ -478,37 +513,56 @@ rewrite_session_destroy( /* * Finds a var */ -extern struct rewrite_var * +LDAP_REWRITE_F (struct rewrite_var *) rewrite_var_find( Avlnode *tree, const char *name ); +/* + * Replaces the value of a variable + */ +LDAP_REWRITE_F (int) +rewrite_var_replace( + struct rewrite_var *var, + const char *value, + int flags +); + /* * Inserts a newly created var */ -extern struct rewrite_var * -rewrite_var_insert( +LDAP_REWRITE_F (struct rewrite_var *) +rewrite_var_insert_f( Avlnode **tree, const char *name, - const char *value + const char *value, + int flags ); +#define rewrite_var_insert(tree, name, value) \ + rewrite_var_insert_f((tree), (name), (value), \ + REWRITE_VAR_UPDATE|REWRITE_VAR_COPY_NAME|REWRITE_VAR_COPY_VALUE) + /* * Sets/inserts a var */ -extern struct rewrite_var * -rewrite_var_set( +LDAP_REWRITE_F (struct rewrite_var *) +rewrite_var_set_f( Avlnode **tree, const char *name, const char *value, - int insert + int flags ); +#define rewrite_var_set(tree, name, value, insert) \ + rewrite_var_set_f((tree), (name), (value), \ + REWRITE_VAR_UPDATE|REWRITE_VAR_COPY_NAME|REWRITE_VAR_COPY_VALUE|((insert)? REWRITE_VAR_INSERT : 0)) + /* * Deletes a var tree */ -extern int +LDAP_REWRITE_F (int) rewrite_var_delete( Avlnode *tree ); @@ -521,7 +575,7 @@ rewrite_var_delete( /* * Finds the context named rewriteContext in the context tree */ -extern struct rewrite_context * +LDAP_REWRITE_F (struct rewrite_context *) rewrite_context_find( struct rewrite_info *info, const char *rewriteContext @@ -530,7 +584,7 @@ rewrite_context_find( /* * Creates a new context called rewriteContext and stores in into the tree */ -extern struct rewrite_context * +LDAP_REWRITE_F (struct rewrite_context *) rewrite_context_create( struct rewrite_info *info, const char *rewriteContext @@ -542,7 +596,7 @@ rewrite_context_create( * STOP: fine, rule matched; stop processing following rules * UNWILL: rule matched; force 'unwilling to perform' */ -extern int +LDAP_REWRITE_F (int) rewrite_context_apply( struct rewrite_info *info, struct rewrite_op *op, @@ -551,5 +605,15 @@ rewrite_context_apply( char **result ); +LDAP_REWRITE_F (int) +rewrite_context_destroy( + struct rewrite_context **context +); + +LDAP_REWRITE_F (void) +rewrite_context_free( + void *tmp +); + #endif /* REWRITE_INT_H */