cb_close.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. #include "cb.h"
  13. /*
  14. ** Close a chaining backend instance
  15. ** Should be followed by a cleanup
  16. */
  17. static void
  18. free_cb_backend(cb_backend *cb)
  19. {
  20. if(cb){
  21. slapi_destroy_rwlock(cb->config.rwl_config_lock);
  22. slapi_ch_free_string(&cb->pluginDN);
  23. slapi_ch_free_string(&cb->configDN);
  24. slapi_ch_array_free(cb->config.chainable_components);
  25. slapi_ch_array_free(cb->config.chaining_components);
  26. slapi_ch_array_free(cb->config.forward_ctrls);
  27. slapi_ch_free((void **)&cb);
  28. }
  29. }
  30. int cb_back_close( Slapi_PBlock *pb )
  31. {
  32. Slapi_Backend *be;
  33. cb_backend_instance *inst;
  34. cb_backend *cb = cb_get_backend_type();
  35. int rc;
  36. slapi_pblock_get( pb, SLAPI_BACKEND, &be );
  37. if (be == NULL) {
  38. CB_ASSERT(cb!=NULL);
  39. slapi_config_remove_callback(SLAPI_OPERATION_MODIFY, DSE_FLAG_POSTOP, cb->configDN, LDAP_SCOPE_BASE,
  40. "(objectclass=*)",cb_config_modify_callback);
  41. slapi_config_remove_callback(SLAPI_OPERATION_MODIFY, DSE_FLAG_PREOP, cb->configDN, LDAP_SCOPE_BASE,
  42. "(objectclass=*)",cb_config_modify_check_callback);
  43. slapi_config_remove_callback(SLAPI_OPERATION_ADD, DSE_FLAG_POSTOP, cb->configDN, LDAP_SCOPE_BASE,
  44. "(objectclass=*)",cb_config_add_callback);
  45. slapi_config_remove_callback(SLAPI_OPERATION_ADD, DSE_FLAG_PREOP, cb->configDN, LDAP_SCOPE_BASE,
  46. "(objectclass=*)",cb_config_add_check_callback);
  47. slapi_config_remove_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, cb->configDN, LDAP_SCOPE_BASE,
  48. "(objectclass=*)",cb_config_search_callback);
  49. slapi_config_remove_callback(SLAPI_OPERATION_ADD, DSE_FLAG_POSTOP, cb->pluginDN,
  50. LDAP_SCOPE_SUBTREE, CB_CONFIG_INSTANCE_FILTER,
  51. cb_config_add_instance_callback);
  52. slapi_config_remove_callback(SLAPI_OPERATION_ADD, DSE_FLAG_PREOP, cb->pluginDN,
  53. LDAP_SCOPE_SUBTREE, CB_CONFIG_INSTANCE_FILTER,
  54. cb_config_add_instance_check_callback);
  55. free_cb_backend(cb);
  56. return 0;
  57. }
  58. /* XXXSD: temp fix . Sometimes, this functions */
  59. /* gets called with a ldbm backend instance... */
  60. {
  61. const char *betype = slapi_be_gettype(be);
  62. if (!betype || strcasecmp(betype,CB_CHAINING_BACKEND_TYPE)) {
  63. slapi_log_error(SLAPI_LOG_FATAL, LOG_ERR, CB_PLUGIN_SUBSYSTEM, "Wrong database type.\n");
  64. free_cb_backend(cb);
  65. return 0;
  66. }
  67. }
  68. inst = cb_get_instance(be);
  69. CB_ASSERT( inst != NULL );
  70. slapi_log_error(SLAPI_LOG_PLUGIN, LOG_DEBUG, CB_PLUGIN_SUBSYSTEM,"Stopping chaining database instance %s\n",
  71. inst->configDn);
  72. /*
  73. * emulate a backend instance deletion to clean up everything
  74. */
  75. cb_instance_delete_config_callback(NULL, NULL,NULL, &rc, NULL, inst);
  76. free_cb_backend(cb);
  77. return 0;
  78. }