1 /* $NetBSD: entry.c,v 1.1.1.3 2010/12/12 15:23:14 adam Exp $ */ 2 3 /* entry.c - monitor backend entry handling routines */ 4 /* OpenLDAP: pkg/ldap/servers/slapd/back-monitor/entry.c,v 1.21.2.7 2010/04/13 20:23:32 kurt Exp */ 5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 * 7 * Copyright 2001-2010 The OpenLDAP Foundation. 8 * Portions Copyright 2001-2003 Pierangelo Masarati. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted only as authorized by the OpenLDAP 13 * Public License. 14 * 15 * A copy of this license is available in file LICENSE in the 16 * top-level directory of the distribution or, alternatively, at 17 * <http://www.OpenLDAP.org/license.html>. 18 */ 19 /* ACKNOWLEDGEMENTS: 20 * This work was initially developed by Pierangelo Masarati for inclusion 21 * in OpenLDAP Software. 22 */ 23 24 #include "portable.h" 25 26 #include <slap.h> 27 #include "back-monitor.h" 28 29 int 30 monitor_entry_update( 31 Operation *op, 32 SlapReply *rs, 33 Entry *e 34 ) 35 { 36 monitor_info_t *mi = ( monitor_info_t * )op->o_bd->be_private; 37 monitor_entry_t *mp; 38 39 int rc = SLAP_CB_CONTINUE; 40 41 assert( mi != NULL ); 42 assert( e != NULL ); 43 assert( e->e_private != NULL ); 44 45 mp = ( monitor_entry_t * )e->e_private; 46 47 if ( mp->mp_cb ) { 48 struct monitor_callback_t *mc; 49 50 for ( mc = mp->mp_cb; mc; mc = mc->mc_next ) { 51 if ( mc->mc_update ) { 52 rc = mc->mc_update( op, rs, e, mc->mc_private ); 53 if ( rc != SLAP_CB_CONTINUE ) { 54 break; 55 } 56 } 57 } 58 } 59 60 if ( rc == SLAP_CB_CONTINUE && mp->mp_info && mp->mp_info->mss_update ) { 61 rc = mp->mp_info->mss_update( op, rs, e ); 62 } 63 64 if ( rc == SLAP_CB_CONTINUE ) { 65 rc = LDAP_SUCCESS; 66 } 67 68 return rc; 69 } 70 71 int 72 monitor_entry_create( 73 Operation *op, 74 SlapReply *rs, 75 struct berval *ndn, 76 Entry *e_parent, 77 Entry **ep ) 78 { 79 monitor_info_t *mi = ( monitor_info_t * )op->o_bd->be_private; 80 monitor_entry_t *mp; 81 82 int rc = SLAP_CB_CONTINUE; 83 84 assert( mi != NULL ); 85 assert( e_parent != NULL ); 86 assert( e_parent->e_private != NULL ); 87 assert( ep != NULL ); 88 89 mp = ( monitor_entry_t * )e_parent->e_private; 90 91 if ( mp->mp_info && mp->mp_info->mss_create ) { 92 rc = mp->mp_info->mss_create( op, rs, ndn, e_parent, ep ); 93 } 94 95 if ( rc == SLAP_CB_CONTINUE ) { 96 rc = LDAP_SUCCESS; 97 } 98 99 return rc; 100 } 101 102 int 103 monitor_entry_modify( 104 Operation *op, 105 SlapReply *rs, 106 Entry *e 107 ) 108 { 109 monitor_info_t *mi = ( monitor_info_t * )op->o_bd->be_private; 110 monitor_entry_t *mp; 111 112 int rc = SLAP_CB_CONTINUE; 113 114 assert( mi != NULL ); 115 assert( e != NULL ); 116 assert( e->e_private != NULL ); 117 118 mp = ( monitor_entry_t * )e->e_private; 119 120 if ( mp->mp_cb ) { 121 struct monitor_callback_t *mc; 122 123 for ( mc = mp->mp_cb; mc; mc = mc->mc_next ) { 124 if ( mc->mc_modify ) { 125 rc = mc->mc_modify( op, rs, e, mc->mc_private ); 126 if ( rc != SLAP_CB_CONTINUE ) { 127 break; 128 } 129 } 130 } 131 } 132 133 if ( rc == SLAP_CB_CONTINUE && mp->mp_info && mp->mp_info->mss_modify ) { 134 rc = mp->mp_info->mss_modify( op, rs, e ); 135 } 136 137 if ( rc == SLAP_CB_CONTINUE ) { 138 rc = LDAP_SUCCESS; 139 } 140 141 return rc; 142 } 143 144 int 145 monitor_entry_test_flags( 146 monitor_entry_t *mp, 147 int cond 148 ) 149 { 150 assert( mp != NULL ); 151 152 return( ( mp->mp_flags & cond ) || ( mp->mp_info->mss_flags & cond ) ); 153 } 154 155 monitor_entry_t * 156 monitor_entrypriv_create( void ) 157 { 158 monitor_entry_t *mp; 159 160 mp = ( monitor_entry_t * )ch_calloc( sizeof( monitor_entry_t ), 1 ); 161 162 mp->mp_next = NULL; 163 mp->mp_children = NULL; 164 mp->mp_info = NULL; 165 mp->mp_flags = MONITOR_F_NONE; 166 mp->mp_cb = NULL; 167 168 ldap_pvt_thread_mutex_init( &mp->mp_mutex ); 169 170 return mp; 171 } 172 173 Entry * 174 monitor_entry_stub( 175 struct berval *pdn, 176 struct berval *pndn, 177 struct berval *rdn, 178 ObjectClass *oc, 179 monitor_info_t *mi, 180 struct berval *create, 181 struct berval *modify 182 ) 183 { 184 AttributeDescription *nad = NULL; 185 Entry *e; 186 struct berval nat; 187 char *ptr; 188 const char *text; 189 int rc; 190 191 nat = *rdn; 192 ptr = strchr( nat.bv_val, '=' ); 193 nat.bv_len = ptr - nat.bv_val; 194 rc = slap_bv2ad( &nat, &nad, &text ); 195 if ( rc ) 196 return NULL; 197 198 e = entry_alloc(); 199 if ( e ) { 200 struct berval nrdn; 201 202 rdnNormalize( 0, NULL, NULL, rdn, &nrdn, NULL ); 203 build_new_dn( &e->e_name, pdn, rdn, NULL ); 204 build_new_dn( &e->e_nname, pndn, &nrdn, NULL ); 205 ber_memfree( nrdn.bv_val ); 206 nat.bv_val = ptr + 1; 207 nat.bv_len = rdn->bv_len - ( nat.bv_val - rdn->bv_val ); 208 attr_merge_normalize_one( e, slap_schema.si_ad_objectClass, 209 &oc->soc_cname, NULL ); 210 attr_merge_normalize_one( e, slap_schema.si_ad_structuralObjectClass, 211 &oc->soc_cname, NULL ); 212 attr_merge_normalize_one( e, nad, &nat, NULL ); 213 attr_merge_one( e, slap_schema.si_ad_creatorsName, &mi->mi_creatorsName, 214 &mi->mi_ncreatorsName ); 215 attr_merge_one( e, slap_schema.si_ad_modifiersName, &mi->mi_creatorsName, 216 &mi->mi_ncreatorsName ); 217 attr_merge_normalize_one( e, slap_schema.si_ad_createTimestamp, 218 create ? create : &mi->mi_startTime, NULL ); 219 attr_merge_normalize_one( e, slap_schema.si_ad_modifyTimestamp, 220 modify ? modify : &mi->mi_startTime, NULL ); 221 } 222 return e; 223 } 224