diff options
-rw-r--r-- | ipa-server/ipa-slapi-plugins/dna/dna.c | 1560 |
1 files changed, 758 insertions, 802 deletions
diff --git a/ipa-server/ipa-slapi-plugins/dna/dna.c b/ipa-server/ipa-slapi-plugins/dna/dna.c index bafe44107..169edb82b 100644 --- a/ipa-server/ipa-slapi-plugins/dna/dna.c +++ b/ipa-server/ipa-slapi-plugins/dna/dna.c @@ -2,15 +2,15 @@ * This Program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; version 2 of the License. - * + * * This Program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along with * this Program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA. - * + * * In addition, as a special exception, Red Hat, Inc. gives You the additional * right to link the code of this Program with code not covered under the GNU * General Public License ("Non-GPL Code") and to distribute linked combinations @@ -28,9 +28,9 @@ * version of the file, but you are not obligated to do so. If you do not wish to * provide this exception without modification, you must delete this exception * statement from your version and license this file solely under the GPL without - * exception. - * - * + * exception. + * + * * Author: Pete Rowley * * Copyright (C) 2007 Red Hat, Inc. @@ -43,7 +43,7 @@ /** - * Distributed Numeric Assignment plug-in + * Distributed Numeric Assignment plug-in */ #include <dirsrv/slapi-plugin.h> @@ -65,13 +65,14 @@ #include <sys/stat.h> #endif -#define DNA_PLUGIN_SUBSYSTEM "ipa-dna-plugin" -#define DNA_PLUGIN_VERSION 0x00010000 +#define DNA_PLUGIN_SUBSYSTEM "ipa-dna-plugin" +#define DNA_PLUGIN_VERSION 0x00010000 -#define DNA_DN "cn=ipa-dna,cn=plugins,cn=config" /* temporary */ +/* temporary */ +#define DNA_DN "cn=ipa-dna,cn=plugins,cn=config" -#define DNA_SUCCESS 0 -#define DNA_FAILURE -1 +#define DNA_SUCCESS 0 +#define DNA_FAILURE -1 /** * DNA config types @@ -87,9 +88,10 @@ #define FEATURE_DESC "IPA Distributed Numeric Assignment" #define PLUGIN_DESC "IPA Distributed Numeric Assignment plugin" -static Slapi_PluginDesc pdesc = { FEATURE_DESC, - "FreeIPA project", "FreeIPA/1.0", - PLUGIN_DESC }; +static Slapi_PluginDesc pdesc = { FEATURE_DESC, + "FreeIPA project", "FreeIPA/1.0", + PLUGIN_DESC +}; /** @@ -97,22 +99,22 @@ static Slapi_PluginDesc pdesc = { FEATURE_DESC, */ struct _defs { - PRCList list; - char *dn; - char *type; - char *prefix; - unsigned long nextval; - unsigned long interval; - struct slapi_filter *filter; - char *generate; - char *scope; + PRCList list; + char *dn; + char *type; + char *prefix; + unsigned long nextval; + unsigned long interval; + struct slapi_filter *filter; + char *generate; + char *scope; } dna_anchor; typedef struct _defs configEntry; static PRCList *config; static PRRWLock *g_dna_cache_lock; -static void *_PluginID = NULL; -static char *_PluginDN = NULL; +static void *_PluginID = NULL; +static char *_PluginDN = NULL; /* @@ -121,43 +123,44 @@ static char *_PluginDN = NULL; static Slapi_Mutex *g_new_value_lock; /** - * + * * DNA plug-in management functions * */ -int ipa_dna_init(Slapi_PBlock *pb); -static int dna_start(Slapi_PBlock *pb); -static int dna_close(Slapi_PBlock *pb); -static int dna_postop_init(Slapi_PBlock *pb); +int ipa_dna_init(Slapi_PBlock * pb); +static int dna_start(Slapi_PBlock * pb); +static int dna_close(Slapi_PBlock * pb); +static int dna_postop_init(Slapi_PBlock * pb); /** - * + * * Local operation functions * */ static int loadPluginConfig(); -static int parseConfigEntry(Slapi_Entry *e); +static int parseConfigEntry(Slapi_Entry * e); static void deleteConfig(); -static void freeConfigEntry(configEntry **entry); +static void freeConfigEntry(configEntry ** entry); /** * * helpers * */ -static char *dna_get_dn(Slapi_PBlock *pb); +static char *dna_get_dn(Slapi_PBlock * pb); static int dna_dn_is_config(char *dn); -static int dna_get_next_value(configEntry *config_entry, char **next_value_ret); +static int dna_get_next_value(configEntry * config_entry, + char **next_value_ret); /** * * the ops (where the real work is done) * */ -static int dna_config_check_post_op(Slapi_PBlock *pb); -static int dna_pre_op( Slapi_PBlock *pb, int modtype ); -static int dna_mod_pre_op( Slapi_PBlock *pb ); -static int dna_add_pre_op( Slapi_PBlock *pb ); +static int dna_config_check_post_op(Slapi_PBlock * pb); +static int dna_pre_op(Slapi_PBlock * pb, int modtype); +static int dna_mod_pre_op(Slapi_PBlock * pb); +static int dna_add_pre_op(Slapi_PBlock * pb); /** * debug functions - global, for the debugger @@ -173,7 +176,7 @@ int *module_ldap_debug = 0; void plugin_init_debug_level(int *level_ptr) { - module_ldap_debug = level_ptr; + module_ldap_debug = level_ptr; } #endif @@ -184,131 +187,129 @@ void plugin_init_debug_level(int *level_ptr) */ void dna_read_lock() { - PR_RWLock_Rlock(g_dna_cache_lock); + PR_RWLock_Rlock(g_dna_cache_lock); } void dna_write_lock() { - PR_RWLock_Wlock(g_dna_cache_lock); + PR_RWLock_Wlock(g_dna_cache_lock); } void dna_unlock() { - PR_RWLock_Unlock(g_dna_cache_lock); + PR_RWLock_Unlock(g_dna_cache_lock); } /** - * + * * Get the dna plug-in version * */ int dna_version() { - return DNA_PLUGIN_VERSION; + return DNA_PLUGIN_VERSION; } /** * Plugin identity mgmt */ -void setPluginID(void * pluginID) +void setPluginID(void *pluginID) { - _PluginID=pluginID; + _PluginID = pluginID; } -void * getPluginID() +void *getPluginID() { - return _PluginID; + return _PluginID; } void setPluginDN(char *pluginDN) { - _PluginDN = pluginDN; + _PluginDN = pluginDN; } -char * getPluginDN() +char *getPluginDN() { - return _PluginDN; + return _PluginDN; } -/* +/* dna_init ------------- adds our callbacks to the list */ -int ipa_dna_init( Slapi_PBlock *pb ) +int ipa_dna_init(Slapi_PBlock * pb) { - int status = DNA_SUCCESS; - char * plugin_identity=NULL; + int status = DNA_SUCCESS; + char *plugin_identity = NULL; - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> ipa_dna_init\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> ipa_dna_init\n"); - /** + /** * Store the plugin identity for later use. * Used for internal operations */ - - slapi_pblock_get (pb, SLAPI_PLUGIN_IDENTITY, &plugin_identity); - PR_ASSERT (plugin_identity); - setPluginID(plugin_identity); - - if ( slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION, - SLAPI_PLUGIN_VERSION_01 ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_START_FN, - (void *) dna_start ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_CLOSE_FN, - (void *) dna_close ) != 0 || - slapi_pblock_set( pb, SLAPI_PLUGIN_DESCRIPTION, - (void *)&pdesc ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_PRE_MODIFY_FN, - (void *) dna_mod_pre_op ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_PRE_ADD_FN, - (void *) dna_add_pre_op ) != 0 || - /* the config change checking post op */ - slapi_register_plugin( - "postoperation", /* op type */ - 1, /* Enabled */ - "ipa_dna_init", /* this function desc */ - dna_postop_init, /* init func for post op */ - PLUGIN_DESC, /* plugin desc */ - NULL, /* ? */ - plugin_identity /* access control */ - ) - ) - { - slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, - "ipa_dna_init: failed to register plugin\n" ); - status = DNA_FAILURE; - } - - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- ipa_dna_init\n"); - return status; + + slapi_pblock_get(pb, SLAPI_PLUGIN_IDENTITY, &plugin_identity); + PR_ASSERT(plugin_identity); + setPluginID(plugin_identity); + + if (slapi_pblock_set(pb, SLAPI_PLUGIN_VERSION, + SLAPI_PLUGIN_VERSION_01) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_START_FN, + (void *) dna_start) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_CLOSE_FN, + (void *) dna_close) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_DESCRIPTION, + (void *) &pdesc) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_PRE_MODIFY_FN, + (void *) dna_mod_pre_op) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_PRE_ADD_FN, + (void *) dna_add_pre_op) != 0 || + /* the config change checking post op */ + slapi_register_plugin("postoperation", /* op type */ + 1, /* Enabled */ + "ipa_dna_init", /* this function desc */ + dna_postop_init, /* init func for post op */ + PLUGIN_DESC, /* plugin desc */ + NULL, /* ? */ + plugin_identity /* access control */ + ) + ) { + slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "ipa_dna_init: failed to register plugin\n"); + status = DNA_FAILURE; + } + + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- ipa_dna_init\n"); + return status; } -static int dna_postop_init(Slapi_PBlock *pb) +static int dna_postop_init(Slapi_PBlock * pb) { - int status = DNA_SUCCESS; - - if ( slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION, - SLAPI_PLUGIN_VERSION_01 ) != 0 || - slapi_pblock_set( pb, SLAPI_PLUGIN_DESCRIPTION, - (void *)&pdesc ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_POST_ADD_FN, - (void *) dna_config_check_post_op ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_POST_MODRDN_FN, - (void *) dna_config_check_post_op ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_POST_DELETE_FN, - (void *) dna_config_check_post_op ) != 0 || - slapi_pblock_set(pb, SLAPI_PLUGIN_POST_MODIFY_FN, - (void *) dna_config_check_post_op ) != 0 - ) - { - slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, - "dna_postop_init: failed to register plugin\n" ); - status = DNA_FAILURE; - } - - return status; + int status = DNA_SUCCESS; + + if (slapi_pblock_set(pb, SLAPI_PLUGIN_VERSION, + SLAPI_PLUGIN_VERSION_01) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_DESCRIPTION, + (void *) &pdesc) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_ADD_FN, + (void *) dna_config_check_post_op) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_MODRDN_FN, + (void *) dna_config_check_post_op) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_DELETE_FN, + (void *) dna_config_check_post_op) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_MODIFY_FN, + (void *) dna_config_check_post_op) != 0) { + slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_postop_init: failed to register plugin\n"); + status = DNA_FAILURE; + } + + return status; } /* @@ -317,60 +318,58 @@ static int dna_postop_init(Slapi_PBlock *pb) Kicks off the config cache. It is called after dna_init. */ -static int dna_start( Slapi_PBlock *pb ) +static int dna_start(Slapi_PBlock * pb) { - char * plugindn = NULL; + char *plugindn = NULL; - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_start\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_start\n"); - config = &dna_anchor.list; - g_dna_cache_lock = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "dna"); - g_new_value_lock = slapi_new_mutex(); + config = &dna_anchor.list; + g_dna_cache_lock = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "dna"); + g_new_value_lock = slapi_new_mutex(); - if(!g_dna_cache_lock || !g_new_value_lock) - { - slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, - "dna_start: lock creation failed\n" ); + if (!g_dna_cache_lock || !g_new_value_lock) { + slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_start: lock creation failed\n"); - return DNA_FAILURE; - } + return DNA_FAILURE; + } - /** + /** * Get the plug-in target dn from the system - * and store it for future use. This should avoid - * hardcoding of DN's in the code. + * and store it for future use. This should avoid + * hardcoding of DN's in the code. */ - slapi_pblock_get(pb, SLAPI_TARGET_DN, &plugindn); - if (plugindn == NULL || strlen(plugindn) == 0) - { - slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , - "dna_start: had to use hard coded config dn\n"); - plugindn = DNA_DN; - } - else - { - slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , + slapi_pblock_get(pb, SLAPI_TARGET_DN, &plugindn); + if (plugindn == NULL || strlen(plugindn) == 0) { + slapi_log_error(SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM, + "dna_start: had to use hard coded config dn\n"); + plugindn = DNA_DN; + } else { + slapi_log_error(SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM, "dna_start: config at %s\n", plugindn); - } + } - setPluginDN(plugindn); + setPluginDN(plugindn); - /** + /** * Load the config for our plug-in */ - PR_INIT_CLIST(config); - if (loadPluginConfig() != DNA_SUCCESS) - { - slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, - "dna_start: unable to load plug-in configuration\n" ); - return DNA_FAILURE; - } - - slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , "dna: ready for service\n"); - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_start\n"); - - return DNA_SUCCESS; + PR_INIT_CLIST(config); + if (loadPluginConfig() != DNA_SUCCESS) { + slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_start: unable to load plug-in configuration\n"); + return DNA_FAILURE; + } + + slapi_log_error(SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM, + "dna: ready for service\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_start\n"); + + return DNA_SUCCESS; } /* @@ -378,18 +377,20 @@ static int dna_start( Slapi_PBlock *pb ) -------------- closes down the cache */ -static int dna_close( Slapi_PBlock *pb ) +static int dna_close(Slapi_PBlock * pb) { - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_close\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_close\n"); - deleteConfig(); + deleteConfig(); - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_close\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_close\n"); - return DNA_SUCCESS; + return DNA_SUCCESS; } -/* +/* * config looks like this * - cn=myplugin * --- ou=posix @@ -401,139 +402,147 @@ static int dna_close( Slapi_PBlock *pb ) */ static int loadPluginConfig() { - int status = DNA_SUCCESS; - int result; - int i; - Slapi_PBlock *search_pb; - Slapi_Entry **entries = NULL; - - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> loadPluginConfig\n"); - - dna_write_lock(); - deleteConfig(); - - search_pb = slapi_pblock_new(); - - slapi_search_internal_set_pb(search_pb, DNA_DN, LDAP_SCOPE_SUBTREE, - "objectclass=*", NULL, 0, NULL, NULL, getPluginID(), 0); - slapi_search_internal_pb(search_pb); - slapi_pblock_get(search_pb, SLAPI_PLUGIN_INTOP_RESULT, &result); - - if (status != DNA_SUCCESS) - { - status = DNA_SUCCESS; - goto cleanup; - } - - slapi_pblock_get(search_pb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &entries); - if (NULL == entries || entries[0] == NULL) - { - status = DNA_SUCCESS; - goto cleanup; - } - - for (i = 0; (entries[i] != NULL); i++) - { - status = parseConfigEntry(entries[i]); - } - -cleanup: - slapi_free_search_results_internal(search_pb); - slapi_pblock_destroy(search_pb); - dna_unlock(); - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- loadPluginConfig\n"); - - return status; + int status = DNA_SUCCESS; + int result; + int i; + Slapi_PBlock *search_pb; + Slapi_Entry **entries = NULL; + + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> loadPluginConfig\n"); + + dna_write_lock(); + deleteConfig(); + + search_pb = slapi_pblock_new(); + + slapi_search_internal_set_pb(search_pb, DNA_DN, LDAP_SCOPE_SUBTREE, + "objectclass=*", NULL, 0, NULL, NULL, + getPluginID(), 0); + slapi_search_internal_pb(search_pb); + slapi_pblock_get(search_pb, SLAPI_PLUGIN_INTOP_RESULT, &result); + + if (status != DNA_SUCCESS) { + status = DNA_SUCCESS; + goto cleanup; + } + + slapi_pblock_get(search_pb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, + &entries); + if (NULL == entries || entries[0] == NULL) { + status = DNA_SUCCESS; + goto cleanup; + } + + for (i = 0; (entries[i] != NULL); i++) { + status = parseConfigEntry(entries[i]); + } + + cleanup: + slapi_free_search_results_internal(search_pb); + slapi_pblock_destroy(search_pb); + dna_unlock(); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- loadPluginConfig\n"); + + return status; } -static int parseConfigEntry(Slapi_Entry *e) +static int parseConfigEntry(Slapi_Entry * e) { - char *value = NULL; - configEntry *entry = NULL; - configEntry *config_entry = NULL; - PRCList *list = NULL; - int entry_added = 0; - - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> parseConfigEntry\n"); - - entry = (configEntry*) slapi_ch_calloc(1, sizeof(configEntry)); - if(0 == entry) - goto bail; - - value = slapi_entry_get_ndn(e); - if(value) { - entry->dn = strdup(value); - } - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dn [%s] \n",entry->dn,0,0); - - value = slapi_entry_attr_get_charptr(e, DNA_TYPE); - if(value) { - entry->type = value; - } - else - goto bail; - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaType [%s] \n",entry->type,0,0); - - value = slapi_entry_attr_get_charptr(e, DNA_NEXTVAL); - if (value) { - entry->nextval = strtoul(value,0,0); - slapi_ch_free_string(&value); - value = 0; - } - else - goto bail; - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaNextValue [%d] \n",entry->nextval,0,0); - - value = slapi_entry_attr_get_charptr(e, DNA_PREFIX); - if (value) { - entry->prefix = value; - } - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaPrefix [%s] \n",entry->prefix,0,0); - - value = slapi_entry_attr_get_charptr(e, DNA_INTERVAL); - if (value) { - entry->interval = strtoul(value,0,0); - slapi_ch_free_string(&value); - value = 0; - } - else - goto bail; - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaInterval [%s] \n",value,0,0); - - value = slapi_entry_attr_get_charptr(e, DNA_GENERATE); - if (value) { - entry->generate = value; - } - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaMagicRegen [%s] \n",entry->generate,0,0); - - value = slapi_entry_attr_get_charptr(e, DNA_FILTER); - if (value) { - entry->filter = slapi_str2filter(value); - } - else - goto bail; - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaFilter [%s] \n",value,0,0); - - slapi_ch_free_string(&value); - value = 0; - - value = slapi_entry_attr_get_charptr(e, DNA_SCOPE); - if (value) { - char *canonical_dn = slapi_dn_normalize(value); - entry->scope = canonical_dn; - } - - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaScope [%s] \n",entry->scope,0,0); - - - /** + char *value = NULL; + configEntry *entry = NULL; + configEntry *config_entry = NULL; + PRCList *list = NULL; + int entry_added = 0; + + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> parseConfigEntry\n"); + + entry = (configEntry *) slapi_ch_calloc(1, sizeof(configEntry)); + if (0 == entry) + goto bail; + + value = slapi_entry_get_ndn(e); + if (value) { + entry->dn = strdup(value); + } + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dn [%s] \n", entry->dn, 0, 0); + + value = slapi_entry_attr_get_charptr(e, DNA_TYPE); + if (value) { + entry->type = value; + } else + goto bail; + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dnaType [%s] \n", entry->type, 0, 0); + + value = slapi_entry_attr_get_charptr(e, DNA_NEXTVAL); + if (value) { + entry->nextval = strtoul(value, 0, 0); + slapi_ch_free_string(&value); + value = 0; + } else + goto bail; + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dnaNextValue [%d] \n", entry->nextval, 0, + 0); + + value = slapi_entry_attr_get_charptr(e, DNA_PREFIX); + if (value) { + entry->prefix = value; + } + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dnaPrefix [%s] \n", entry->prefix, 0, 0); + + value = slapi_entry_attr_get_charptr(e, DNA_INTERVAL); + if (value) { + entry->interval = strtoul(value, 0, 0); + slapi_ch_free_string(&value); + value = 0; + } else + goto bail; + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dnaInterval [%s] \n", value, 0, 0); + + value = slapi_entry_attr_get_charptr(e, DNA_GENERATE); + if (value) { + entry->generate = value; + } + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dnaMagicRegen [%s] \n", entry->generate, + 0, 0); + + value = slapi_entry_attr_get_charptr(e, DNA_FILTER); + if (value) { + entry->filter = slapi_str2filter(value); + } else + goto bail; + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dnaFilter [%s] \n", value, 0, 0); + + slapi_ch_free_string(&value); + value = 0; + + value = slapi_entry_attr_get_charptr(e, DNA_SCOPE); + if (value) { + char *canonical_dn = slapi_dn_normalize(value); + entry->scope = canonical_dn; + } + + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "----------> dnaScope [%s] \n", entry->scope, 0, 0); + + + /** * Finally add the entry to the list * we group by type then by filter * and finally sort by dn length with longer dn's @@ -541,109 +550,105 @@ static int parseConfigEntry(Slapi_Entry *e) * code to be simple and quick and * cunningly linear */ - if(!PR_CLIST_IS_EMPTY(config)) - { - list = PR_LIST_HEAD(config); - while(list != config) - { - config_entry = (configEntry*)list; - - if(slapi_attr_type_cmp(config_entry->type, entry->type,1)) - goto next; - - if(slapi_filter_compare(config_entry->filter, entry->filter)) - goto next; - - if(slapi_dn_issuffix(entry->scope,config_entry->scope)) - { - PR_INSERT_BEFORE(&(entry->list), list); - slapi_log_error( SLAPI_LOG_CONFIG, - DNA_PLUGIN_SUBSYSTEM , - "store [%s] before [%s] \n",entry->scope,config_entry->scope,0); - entry_added = 1; - break; - } - -next: - list = PR_NEXT_LINK (list); - - if(config == list) - { - /* add to tail */ - PR_INSERT_BEFORE(&(entry->list), list); - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "store [%s] at tail\n",entry->scope,0,0); - entry_added = 1; - break; - } - } - } - else - { - /* first entry */ - PR_INSERT_LINK(&(entry->list), config); - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "store [%s] at head \n",entry->scope,0,0); - entry_added = 1; - } - -bail: - if(0 == entry_added) - { - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , - "config entry [%s] skipped\n",entry->dn,0,0); - freeConfigEntry(&entry); - } - - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- parseConfigEntry\n"); - - return DNA_SUCCESS; + if (!PR_CLIST_IS_EMPTY(config)) { + list = PR_LIST_HEAD(config); + while (list != config) { + config_entry = (configEntry *) list; + + if (slapi_attr_type_cmp(config_entry->type, entry->type, 1)) + goto next; + + if (slapi_filter_compare(config_entry->filter, entry->filter)) + goto next; + + if (slapi_dn_issuffix(entry->scope, config_entry->scope)) { + PR_INSERT_BEFORE(&(entry->list), list); + slapi_log_error(SLAPI_LOG_CONFIG, + DNA_PLUGIN_SUBSYSTEM, + "store [%s] before [%s] \n", entry->scope, + config_entry->scope, 0); + entry_added = 1; + break; + } + + next: + list = PR_NEXT_LINK(list); + + if (config == list) { + /* add to tail */ + PR_INSERT_BEFORE(&(entry->list), list); + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "store [%s] at tail\n", entry->scope, 0, + 0); + entry_added = 1; + break; + } + } + } else { + /* first entry */ + PR_INSERT_LINK(&(entry->list), config); + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "store [%s] at head \n", entry->scope, 0, 0); + entry_added = 1; + } + + bail: + if (0 == entry_added) { + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "config entry [%s] skipped\n", entry->dn, 0, 0); + freeConfigEntry(&entry); + } + + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- parseConfigEntry\n"); + + return DNA_SUCCESS; } -static void freeConfigEntry(configEntry **entry) +static void freeConfigEntry(configEntry ** entry) { - configEntry *e = *entry; + configEntry *e = *entry; - if(e->dn) - { - slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , - "freeing config entry [%s]\n",e->dn,0,0); - slapi_ch_free_string(&e->dn); - } + if (e->dn) { + slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, + "freeing config entry [%s]\n", e->dn, 0, 0); + slapi_ch_free_string(&e->dn); + } - if(e->type) - slapi_ch_free_string(&e->type); + if (e->type) + slapi_ch_free_string(&e->type); - if(e->prefix) - slapi_ch_free_string(&e->prefix); + if (e->prefix) + slapi_ch_free_string(&e->prefix); - if(e->filter) - slapi_filter_free(e->filter,1); + if (e->filter) + slapi_filter_free(e->filter, 1); - if(e->generate) - slapi_ch_free_string(&e->generate); + if (e->generate) + slapi_ch_free_string(&e->generate); - if(e->scope) - slapi_ch_free_string(&e->scope); + if (e->scope) + slapi_ch_free_string(&e->scope); - slapi_ch_free((void**)entry); + slapi_ch_free((void **) entry); } -static void deleteConfigEntry(PRCList *entry) +static void deleteConfigEntry(PRCList * entry) { - PR_REMOVE_LINK(entry); - freeConfigEntry((configEntry**)&entry); + PR_REMOVE_LINK(entry); + freeConfigEntry((configEntry **) & entry); } static void deleteConfig() { - PRCList *list; + PRCList *list; - while(!PR_CLIST_IS_EMPTY(config)) - { - list = PR_LIST_HEAD(config); - deleteConfigEntry(list); - } + while (!PR_CLIST_IS_EMPTY(config)) { + list = PR_LIST_HEAD(config); + deleteConfigEntry(list); + } - return; + return; } @@ -651,23 +656,25 @@ static void deleteConfig() Helpers ****************************************************/ -static char *dna_get_dn(Slapi_PBlock *pb) +static char *dna_get_dn(Slapi_PBlock * pb) { - char *dn = 0; - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_get_dn\n"); + char *dn = 0; + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_get_dn\n"); - if(slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn )) - { - slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, "dna_get_dn: failed to get dn of changed entry"); - goto bail; - } + if (slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn)) { + slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_get_dn: failed to get dn of changed entry"); + goto bail; + } /* slapi_dn_normalize( dn ); */ -bail: - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_get_dn\n"); + bail: + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_get_dn\n"); - return dn; + return dn; } /* config check @@ -675,18 +682,19 @@ bail: */ static int dna_dn_is_config(char *dn) { - int ret = 0; + int ret = 0; - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_is_config\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_is_config\n"); - if(slapi_dn_issuffix(dn, getPluginDN())) - { - ret=1; - } + if (slapi_dn_issuffix(dn, getPluginDN())) { + ret = 1; + } - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_is_config\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_is_config\n"); - return ret; + return ret; } @@ -704,155 +712,144 @@ static int dna_dn_is_config(char *dn) * 2. remove current value, add new value in one operation * 3. if failed, and less than 3 times, goto 1 */ -static int dna_get_next_value(configEntry *config_entry, char **next_value_ret) +static int dna_get_next_value(configEntry * config_entry, + char **next_value_ret) { - int ret = LDAP_SUCCESS; - Slapi_DN *dn = 0; - char *attrlist[3]; - Slapi_Entry *e = 0; - int attempts = 0; + int ret = LDAP_SUCCESS; + Slapi_DN *dn = 0; + char *attrlist[3]; + Slapi_Entry *e = 0; + int attempts = 0; - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_get_next_value\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_get_next_value\n"); - /* get pre-requisites to search */ - dn = slapi_sdn_new_dn_byref(config_entry->dn); - attrlist[0] = DNA_NEXTVAL; - attrlist[1] = DNA_INTERVAL; - attrlist[2] = 0; + /* get pre-requisites to search */ + dn = slapi_sdn_new_dn_byref(config_entry->dn); + attrlist[0] = DNA_NEXTVAL; + attrlist[1] = DNA_INTERVAL; + attrlist[2] = 0; - /* the operation is constructed such that race conditions - * to increment the value are detected and avoided - one wins, - * one loses - however, there is no need for the server to compete - * with itself so we lock here - */ + /* the operation is constructed such that race conditions + * to increment the value are detected and avoided - one wins, + * one loses - however, there is no need for the server to compete + * with itself so we lock here + */ + + slapi_lock_mutex(g_new_value_lock); + + while (attempts < 3 && LDAP_SUCCESS == ret) { + attempts++; + + /* do update */ + if (e) { + slapi_entry_free(e); + e = 0; + } + + ret = + slapi_search_internal_get_entry(dn, attrlist, &e, + getPluginID()); + if (LDAP_SUCCESS == ret) { + char *old_value; + + old_value = slapi_entry_attr_get_charptr(e, DNA_NEXTVAL); + if (old_value) { + LDAPMod mod_add; + LDAPMod mod_delete; + LDAPMod *mods[3]; + Slapi_PBlock *pb = slapi_pblock_new(); + char *delete_val[2]; + char *add_val[2]; + char new_value[16]; + char *interval = 0; + + mods[0] = &mod_delete; + mods[1] = &mod_add; + mods[2] = 0; + + if (0 == pb) + goto bail; + + interval = slapi_entry_attr_get_charptr(e, DNA_INTERVAL); + if (0 == interval) { + slapi_pblock_destroy(pb); + slapi_ch_free_string(&old_value); + goto bail; + } + + /* perform increment */ + + sprintf(new_value, "%lu", + strtoul(interval, 0, 0) + + strtoul(old_value, 0, 0)); - slapi_lock_mutex(g_new_value_lock); - - while(attempts < 3 && LDAP_SUCCESS == ret) - { - attempts++; - - /* do update */ - if(e) - { - slapi_entry_free(e); - e = 0; - } - - ret = slapi_search_internal_get_entry( dn, attrlist, &e,getPluginID()); - if(LDAP_SUCCESS == ret) - { - char *old_value; - - old_value = slapi_entry_attr_get_charptr(e, DNA_NEXTVAL); - if(old_value) - { - LDAPMod mod_add; - LDAPMod mod_delete; - LDAPMod *mods[3]; - Slapi_PBlock *pb = slapi_pblock_new(); - char *delete_val[2]; - char *add_val[2]; - char new_value[16]; - char *interval = 0; - - mods[0] = &mod_delete; - mods[1] = &mod_add; - mods[2] = 0; - - if(0 == pb) - goto bail; - - interval = slapi_entry_attr_get_charptr(e, DNA_INTERVAL); - if(0 == interval) - { - slapi_pblock_destroy(pb); - slapi_ch_free_string(&old_value); - goto bail; - } - - /* perform increment */ - - sprintf(new_value, "%lu", - strtoul(interval,0,0) + - strtoul(old_value,0,0)); - - delete_val[0] = old_value; - delete_val[1] = 0; - - mod_delete.mod_op = LDAP_MOD_DELETE; - mod_delete.mod_type = DNA_NEXTVAL; - mod_delete.mod_values = delete_val; - - add_val[0] = new_value; - add_val[1] = 0; - - mod_add.mod_op = LDAP_MOD_ADD; - mod_add.mod_type = DNA_NEXTVAL; - mod_add.mod_values = add_val; - - - mods[0] = &mod_delete; - mods[1] = &mod_add; - mods[2] = 0; - - slapi_modify_internal_set_pb( - pb, config_entry->dn, - mods, 0, 0, - getPluginID(), 0); - - slapi_modify_internal_pb(pb); - - slapi_pblock_get(pb, - SLAPI_PLUGIN_INTOP_RESULT, - &ret); - - slapi_pblock_destroy(pb); - slapi_ch_free_string(&interval); - - if(LDAP_SUCCESS == ret) - { - *next_value_ret = old_value; - break; - } - else - { - slapi_ch_free_string(&old_value); - if(LDAP_NO_SUCH_ATTRIBUTE != ret) - { - /* not the result of a race - to change the value - */ - break; - } - else - /* we lost the race to mod - try again - */ - ret = LDAP_SUCCESS; - } - } - else - break; - } - else - break; - } - -bail: - - slapi_unlock_mutex(g_new_value_lock); - - if(dn) - slapi_sdn_free(&dn); - - if(e) - slapi_entry_free(e); - - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_get_next_value\n"); - - return ret; + delete_val[0] = old_value; + delete_val[1] = 0; + + mod_delete.mod_op = LDAP_MOD_DELETE; + mod_delete.mod_type = DNA_NEXTVAL; + mod_delete.mod_values = delete_val; + + add_val[0] = new_value; + add_val[1] = 0; + + mod_add.mod_op = LDAP_MOD_ADD; + mod_add.mod_type = DNA_NEXTVAL; + mod_add.mod_values = add_val; + + + mods[0] = &mod_delete; + mods[1] = &mod_add; + mods[2] = 0; + + slapi_modify_internal_set_pb(pb, config_entry->dn, + mods, 0, 0, getPluginID(), 0); + + slapi_modify_internal_pb(pb); + + slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &ret); + + slapi_pblock_destroy(pb); + slapi_ch_free_string(&interval); + + if (LDAP_SUCCESS == ret) { + *next_value_ret = old_value; + break; + } else { + slapi_ch_free_string(&old_value); + if (LDAP_NO_SUCH_ATTRIBUTE != ret) { + /* not the result of a race + to change the value + */ + break; + } else + /* we lost the race to mod + try again + */ + ret = LDAP_SUCCESS; + } + } else + break; + } else + break; + } + + bail: + + slapi_unlock_mutex(g_new_value_lock); + + if (dn) + slapi_sdn_free(&dn); + + if (e) + slapi_entry_free(e); + + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_get_next_value\n"); + + return ret; } /* for mods and adds: @@ -861,278 +858,241 @@ bail: are identical - otherwise all matches count */ -static int dna_pre_op(Slapi_PBlock *pb, int modtype) +static int dna_pre_op(Slapi_PBlock * pb, int modtype) { - char *dn = 0; - PRCList *list = 0; - configEntry *config_entry = 0; - struct slapi_entry *e = 0; - char *last_type = 0; - char *value = 0; - int generate = 0; - Slapi_Mods *smods = 0; - Slapi_Mod *smod = 0; - LDAPMod **mods; - int free_entry = 0; - int ret = 0; - - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_pre_op\n"); - - if(0 == (dn = dna_get_dn(pb))) - goto bail; - - if(dna_dn_is_config(dn)) - goto bail; - - if(LDAP_CHANGETYPE_ADD == modtype) - { - slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &e); - } - else - { - /* xxxPAR: Ideally SLAPI_MODIFY_EXISTING_ENTRY should be - * available but it turns out that is only true if you are - * a dbm backend pre-op plugin - lucky dbm backend pre-op - * plugins. - * I think that is wrong since the entry is useful for filter - * tests and schema checks and this plugin shouldn't be limited - * to a single backend type, but I don't want that fight right - * now so we go get the entry here - * - slapi_pblock_get( pb, SLAPI_MODIFY_EXISTING_ENTRY, &e); - */ - Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); - if(tmp_dn) - { - slapi_search_internal_get_entry( - tmp_dn, 0, &e,getPluginID()); - slapi_sdn_free(&tmp_dn); - free_entry = 1; - } - - /* grab the mods - we'll put them back later with - * our modifications appended - */ - slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &mods); - smods = slapi_mods_new(); - slapi_mods_init_passin(smods, mods); - } - - if(0 == e) - goto bailmod; - - dna_read_lock(); - - if(!PR_CLIST_IS_EMPTY(config)) - { - list = PR_LIST_HEAD(config); - - while(list != config && LDAP_SUCCESS == ret) - { - config_entry = (configEntry*)list; - - /* did we already service this type? */ - if(last_type) - { - if(!slapi_attr_type_cmp(config_entry->type, last_type,1)) - goto next; - } + char *dn = 0; + PRCList *list = 0; + configEntry *config_entry = 0; + struct slapi_entry *e = 0; + char *last_type = 0; + char *value = 0; + int generate = 0; + Slapi_Mods *smods = 0; + Slapi_Mod *smod = 0; + LDAPMod **mods; + int free_entry = 0; + int ret = 0; + + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_pre_op\n"); + + if (0 == (dn = dna_get_dn(pb))) + goto bail; + + if (dna_dn_is_config(dn)) + goto bail; + + if (LDAP_CHANGETYPE_ADD == modtype) { + slapi_pblock_get(pb, SLAPI_ADD_ENTRY, &e); + } else { + /* xxxPAR: Ideally SLAPI_MODIFY_EXISTING_ENTRY should be + * available but it turns out that is only true if you are + * a dbm backend pre-op plugin - lucky dbm backend pre-op + * plugins. + * I think that is wrong since the entry is useful for filter + * tests and schema checks and this plugin shouldn't be limited + * to a single backend type, but I don't want that fight right + * now so we go get the entry here + * + slapi_pblock_get( pb, SLAPI_MODIFY_EXISTING_ENTRY, &e); + */ + Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); + if (tmp_dn) { + slapi_search_internal_get_entry(tmp_dn, 0, &e, getPluginID()); + slapi_sdn_free(&tmp_dn); + free_entry = 1; + } - /* is the entry in scope? */ - if(config_entry->scope) - { - if(!slapi_dn_issuffix(dn, config_entry->scope)) - goto next; + /* grab the mods - we'll put them back later with + * our modifications appended + */ + slapi_pblock_get(pb, SLAPI_MODIFY_MODS, &mods); + smods = slapi_mods_new(); + slapi_mods_init_passin(smods, mods); + } + + if (0 == e) + goto bailmod; + + dna_read_lock(); + + if (!PR_CLIST_IS_EMPTY(config)) { + list = PR_LIST_HEAD(config); + + while (list != config && LDAP_SUCCESS == ret) { + config_entry = (configEntry *) list; + + /* did we already service this type? */ + if (last_type) { + if (!slapi_attr_type_cmp(config_entry->type, last_type, 1)) + goto next; + } + + /* is the entry in scope? */ + if (config_entry->scope) { + if (!slapi_dn_issuffix(dn, config_entry->scope)) + goto next; + } + + /* does the entry match the filter? */ + if (config_entry->filter) { + if (LDAP_SUCCESS != slapi_vattr_filter_test(pb, + e, + config_entry-> + filter, 0)) + goto next; + } + + + if (LDAP_CHANGETYPE_ADD == modtype) { + /* does attribute contain the magic value + or is the type not there? + */ + value = + slapi_entry_attr_get_charptr(e, config_entry->type); + if ((value + && !slapi_UTF8CASECMP(config_entry->generate, value)) + || 0 == value) { + generate = 1; + } + } else { + /* check mods for magic value */ + Slapi_Mod *next_mod = slapi_mod_new(); + smod = slapi_mods_get_first_smod(smods, next_mod); + while (smod) { + char *type = (char *) + slapi_mod_get_type(smod); + + if (slapi_attr_types_equivalent(type, + config_entry->type)) { + struct berval *bv = + slapi_mod_get_first_value(smod); + int len = strlen(config_entry->generate); + + + if (len == bv->bv_len) { + if (!slapi_UTF8NCASECMP(bv->bv_val, + config_entry-> + generate, len)) + + generate = 1; + break; } + } - /* does the entry match the filter? */ - if(config_entry->filter) - { - if(LDAP_SUCCESS != slapi_vattr_filter_test(pb, - e, - config_entry->filter,0)) - goto next; - } + slapi_mod_done(next_mod); + smod = slapi_mods_get_next_smod(smods, next_mod); + } + slapi_mod_free(&next_mod); + } - if(LDAP_CHANGETYPE_ADD == modtype) - { - /* does attribute contain the magic value - or is the type not there? - */ - value = slapi_entry_attr_get_charptr( - e, config_entry->type); - if((value && - !slapi_UTF8CASECMP( - config_entry->generate, - value)) || - 0 == value) - { - generate = 1; - } - } - else - { - /* check mods for magic value */ - Slapi_Mod *next_mod = slapi_mod_new(); - smod = slapi_mods_get_first_smod( - smods, - next_mod); - while(smod) - { - char *type = (char *) - slapi_mod_get_type(smod); - - if(slapi_attr_types_equivalent( - type, - config_entry->type)) - { - struct berval *bv = - slapi_mod_get_first_value( - smod); - int len = strlen( - config_entry-> - generate); - - - if(len == bv->bv_len) - { - if(!slapi_UTF8NCASECMP( - bv->bv_val, - config_entry-> - generate, - len)) - - generate = 1; - break; - } - } - - slapi_mod_done(next_mod); - smod = slapi_mods_get_next_smod( - smods, - next_mod); - } - - slapi_mod_free(&next_mod); - } + if (generate) { + char *new_value; + int len; - if(generate) - { - char *new_value; - int len; - - /* create the value to add */ - if((ret = dna_get_next_value(config_entry,&value))) - break; - - len = strlen(value) + 1; - if(config_entry->prefix) - { - len += strlen(config_entry->prefix); - } - - new_value = slapi_ch_malloc(len); - - if(config_entry->prefix) - { - strcpy(new_value, - config_entry->prefix); - strcat(new_value, value); - } - else - strcpy(new_value, value); - - /* do the mod */ - if(LDAP_CHANGETYPE_ADD == modtype) - { - /* add - add to entry */ - slapi_entry_attr_set_charptr( - e, - config_entry->type, - new_value); - } - else - { - /* mod - add to mods */ - slapi_mods_add_string( - smods, - LDAP_MOD_REPLACE, - config_entry->type, - new_value); - } - - /* free up */ - slapi_ch_free_string(&value); - slapi_ch_free_string(&new_value); - - /* make sure we don't generate for this - * type again - */ - if(LDAP_SUCCESS == ret) - { - last_type = config_entry->type; - } - - generate = 0; - } -next: - list = PR_NEXT_LINK (list); + /* create the value to add */ + if ((ret = dna_get_next_value(config_entry, &value))) + break; + + len = strlen(value) + 1; + if (config_entry->prefix) { + len += strlen(config_entry->prefix); } + + new_value = slapi_ch_malloc(len); + + if (config_entry->prefix) { + strcpy(new_value, config_entry->prefix); + strcat(new_value, value); + } else + strcpy(new_value, value); + + /* do the mod */ + if (LDAP_CHANGETYPE_ADD == modtype) { + /* add - add to entry */ + slapi_entry_attr_set_charptr(e, + config_entry->type, + new_value); + } else { + /* mod - add to mods */ + slapi_mods_add_string(smods, + LDAP_MOD_REPLACE, + config_entry->type, new_value); + } + + /* free up */ + slapi_ch_free_string(&value); + slapi_ch_free_string(&new_value); + + /* make sure we don't generate for this + * type again + */ + if (LDAP_SUCCESS == ret) { + last_type = config_entry->type; + } + + generate = 0; + } + next: + list = PR_NEXT_LINK(list); } + } - dna_unlock(); + dna_unlock(); -bailmod: - if(LDAP_CHANGETYPE_MODIFY == modtype) - { - /* these are the mods you made, really, - * I didn't change them, honest, just had a quick look - */ - mods = slapi_mods_get_ldapmods_passout(smods); - slapi_pblock_set( pb, SLAPI_MODIFY_MODS, mods); - slapi_mods_free(&smods); - } + bailmod: + if (LDAP_CHANGETYPE_MODIFY == modtype) { + /* these are the mods you made, really, + * I didn't change them, honest, just had a quick look + */ + mods = slapi_mods_get_ldapmods_passout(smods); + slapi_pblock_set(pb, SLAPI_MODIFY_MODS, mods); + slapi_mods_free(&smods); + } -bail: + bail: - if(free_entry && e) - slapi_entry_free(e); + if (free_entry && e) + slapi_entry_free(e); - if(ret) - slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , "dna_pre_op: operation failure [%d]\n", ret); + if (ret) + slapi_log_error(SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM, + "dna_pre_op: operation failure [%d]\n", ret); - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_pre_op\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_pre_op\n"); - return ret; + return ret; } -static int dna_add_pre_op( Slapi_PBlock *pb ) +static int dna_add_pre_op(Slapi_PBlock * pb) { - return dna_pre_op(pb, LDAP_CHANGETYPE_ADD); + return dna_pre_op(pb, LDAP_CHANGETYPE_ADD); } -static int dna_mod_pre_op( Slapi_PBlock *pb ) +static int dna_mod_pre_op(Slapi_PBlock * pb) { - return dna_pre_op(pb, LDAP_CHANGETYPE_MODIFY); + return dna_pre_op(pb, LDAP_CHANGETYPE_MODIFY); } -static int dna_config_check_post_op(Slapi_PBlock *pb) +static int dna_config_check_post_op(Slapi_PBlock * pb) { - char *dn; + char *dn; - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_config_check_post_op\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_config_check_post_op\n"); - if((dn = dna_get_dn(pb))) - { - if(dna_dn_is_config(dn)) - loadPluginConfig(); - } + if ((dn = dna_get_dn(pb))) { + if (dna_dn_is_config(dn)) + loadPluginConfig(); + } - slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_config_check_post_op\n"); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_config_check_post_op\n"); - return 0; + return 0; } /**************************************************** @@ -1146,31 +1106,27 @@ static int dna_config_check_post_op(Slapi_PBlock *pb) */ void dnaDumpConfig() { - PRCList *list; + PRCList *list; - dna_read_lock(); + dna_read_lock(); - if(!PR_CLIST_IS_EMPTY(config)) - { - list = PR_LIST_HEAD(config); - while(list != config) - { - dnaDumpConfigEntry((configEntry*)list); - list = PR_NEXT_LINK (list); - } - } + if (!PR_CLIST_IS_EMPTY(config)) { + list = PR_LIST_HEAD(config); + while (list != config) { + dnaDumpConfigEntry((configEntry *) list); + list = PR_NEXT_LINK(list); + } + } - dna_unlock(); + dna_unlock(); } -void dnaDumpConfigEntry(configEntry *entry) +void dnaDumpConfigEntry(configEntry * entry) { - printf("<- type --------------> %s\n", entry->type); - printf("<---- prefix ---------> %s\n", entry->prefix); - printf("<---- next value -----> %lu\n", entry->nextval); - printf("<---- interval -------> %lu\n", entry->interval); - printf("<---- generate flag --> %s\n", entry->generate); + printf("<- type --------------> %s\n", entry->type); + printf("<---- prefix ---------> %s\n", entry->prefix); + printf("<---- next value -----> %lu\n", entry->nextval); + printf("<---- interval -------> %lu\n", entry->interval); + printf("<---- generate flag --> %s\n", entry->generate); } - - |