Diff for /servers/slapd/overlays/syncprov.c between versions 1.56.2.8 and 1.74

version 1.56.2.8, 2005/06/08 21:50:17 version 1.74, 2005/04/15 04:58:04
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.85 2005/06/04 07:44:39 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.73 2005/04/09 09:26:31 hyc Exp $ */
 /* syncprov.c - syncrepl provider */  /* syncprov.c - syncrepl provider */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
Line 25 Line 25
 #include <ac/string.h>  #include <ac/string.h>
 #include "lutil.h"  #include "lutil.h"
 #include "slap.h"  #include "slap.h"
 #include "config.h"  
   
 /* A modify request on a particular entry */  /* A modify request on a particular entry */
 typedef struct modinst {  typedef struct modinst {
Line 661  syncprov_findcsn( Operation *op, int mod Line 660  syncprov_findcsn( Operation *op, int mod
         return rc;          return rc;
 }  }
   
 /* Queue a persistent search response */  /* Queue a persistent search response if still in Refresh stage */
 static int  static int
 syncprov_qresp( opcookie *opc, syncops *so, int mode )  syncprov_qresp( opcookie *opc, syncops *so, int mode )
 {  {
Line 671  syncprov_qresp( opcookie *opc, syncops * Line 670  syncprov_qresp( opcookie *opc, syncops *
                 opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1 + opc->sctxcsn.bv_len + 1 );                  opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1 + opc->sctxcsn.bv_len + 1 );
         sr->s_next = NULL;          sr->s_next = NULL;
         sr->s_dn.bv_val = (char *)(sr + 1);          sr->s_dn.bv_val = (char *)(sr + 1);
         sr->s_dn.bv_len = opc->sdn.bv_len;  
         sr->s_mode = mode;          sr->s_mode = mode;
         sr->s_isreference = opc->sreference;          sr->s_isreference = opc->sreference;
         sr->s_ndn.bv_val = lutil_strcopy( sr->s_dn.bv_val, opc->sdn.bv_val );          sr->s_ndn.bv_val = lutil_strcopy( sr->s_dn.bv_val, opc->sdn.bv_val );
         sr->s_ndn.bv_len = opc->sndn.bv_len;  
         *(sr->s_ndn.bv_val++) = '\0';          *(sr->s_ndn.bv_val++) = '\0';
         sr->s_uuid.bv_val = lutil_strcopy( sr->s_ndn.bv_val, opc->sndn.bv_val );          sr->s_uuid.bv_val = lutil_strcopy( sr->s_ndn.bv_val, opc->sndn.bv_val );
         sr->s_uuid.bv_len = opc->suuid.bv_len;  
         *(sr->s_uuid.bv_val++) = '\0';          *(sr->s_uuid.bv_val++) = '\0';
         sr->s_csn.bv_val = lutil_strcopy( sr->s_uuid.bv_val, opc->suuid.bv_val );          sr->s_csn.bv_val = lutil_strcopy( sr->s_uuid.bv_val, opc->suuid.bv_val );
         sr->s_csn.bv_len = opc->sctxcsn.bv_len;  
         strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val );  
   
         if ( !so->s_res ) {          if ( !so->s_res ) {
                 so->s_res = sr;                  so->s_res = sr;
Line 694  syncprov_qresp( opcookie *opc, syncops * Line 688  syncprov_qresp( opcookie *opc, syncops *
         return LDAP_SUCCESS;          return LDAP_SUCCESS;
 }  }
   
 /* Play back queued responses */  
 static int  
 syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry **e, int mode, int queue );  
   
 static int  
 syncprov_qplay( Operation *op, slap_overinst *on, syncops *so )  
 {  
         syncres *sr, *srnext;  
         Entry *e;  
         opcookie opc;  
         int rc;  
   
         opc.son = on;  
         op->o_bd->bd_info = (BackendInfo *)on->on_info;  
         for (sr = so->s_res; sr; sr=srnext) {  
                 srnext = sr->s_next;  
                 opc.sdn = sr->s_dn;  
                 opc.sndn = sr->s_ndn;  
                 opc.suuid = sr->s_uuid;  
                 opc.sctxcsn = sr->s_csn;  
                 opc.sreference = sr->s_isreference;  
                 e = NULL;  
   
                 if ( sr->s_mode != LDAP_SYNC_DELETE ) {  
                         rc = be_entry_get_rw( op, &opc.sndn, NULL, NULL, 0, &e );  
                         if ( rc ) {  
                                 ch_free( sr );  
                                 so->s_res = srnext;  
                                 continue;  
                         }  
                 }  
                 rc = syncprov_sendresp( op, &opc, so, &e, sr->s_mode, 0 );  
   
                 if ( e ) {  
                         be_entry_release_rw( op, e, 0 );  
                 }  
                 if ( rc )  
                         break;  
   
                 ch_free( sr );  
                 so->s_res = srnext;  
         }  
         op->o_bd->bd_info = (BackendInfo *)on;  
         if ( !so->s_res )  
                 so->s_restail = NULL;  
         return rc;  
 }  
   
 /* Send a persistent search response */  /* Send a persistent search response */
 static int  static int
 syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry **e, int mode, int queue )  syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry *e, int mode, int queue )
 {  {
         slap_overinst *on = opc->son;          slap_overinst *on = opc->son;
         syncprov_info_t *si = on->on_bi.bi_private;          syncprov_info_t *si = on->on_bi.bi_private;
Line 757  syncprov_sendresp( Operation *op, opcook Line 703  syncprov_sendresp( Operation *op, opcook
         Operation sop = *so->s_op;          Operation sop = *so->s_op;
         Opheader ohdr;          Opheader ohdr;
   
         if ( so->s_op->o_abandon )  
                 return SLAPD_ABANDON;  
   
         ohdr = *sop.o_hdr;          ohdr = *sop.o_hdr;
         sop.o_hdr = &ohdr;          sop.o_hdr = &ohdr;
         sop.o_tmpmemctx = op->o_tmpmemctx;          sop.o_tmpmemctx = op->o_tmpmemctx;
         sop.o_bd = op->o_bd;          sop.o_bd = op->o_bd;
         sop.o_controls = op->o_controls;          sop.o_controls = op->o_controls;
         sop.o_private = op->o_private;  
   
         /* If queueing is allowed */          if ( queue && (so->s_flags & PS_IS_REFRESHING) ) {
         if ( queue ) {  
                 ldap_pvt_thread_mutex_lock( &so->s_mutex );                  ldap_pvt_thread_mutex_lock( &so->s_mutex );
                 /* If we're still in refresh mode, must queue */                  if ( so->s_flags & PS_IS_REFRESHING )
                 if (so->s_flags & PS_IS_REFRESHING) {  
                         return syncprov_qresp( opc, so, mode );                          return syncprov_qresp( opc, so, mode );
                 }  
                 /* If connection is free but queue is non-empty,  
                  * try to flush the queue.  
                  */  
                 if ( so->s_res ) {  
                         rs.sr_err = syncprov_qplay( &sop, on, so );  
                 }  
                 /* If the connection is busy, must queue */  
                 if ( sop.o_conn->c_writewaiter || rs.sr_err == LDAP_BUSY ) {  
                         return syncprov_qresp( opc, so, mode );  
                 }  
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );                  ldap_pvt_thread_mutex_unlock( &so->s_mutex );
   
                 /* If syncprov_qplay returned any other error, bail out. */  
                 if ( rs.sr_err ) {  
                         return rs.sr_err;  
                 }  
         } else {  
                 /* Queueing not allowed and conn is busy, give up */  
                 if ( sop.o_conn->c_writewaiter )  
                         return LDAP_BUSY;  
         }          }
   
         ctrls[1] = NULL;          ctrls[1] = NULL;
Line 805  syncprov_sendresp( Operation *op, opcook Line 725  syncprov_sendresp( Operation *op, opcook
         rs.sr_err = syncprov_state_ctrl( &sop, &rs, &e_uuid,          rs.sr_err = syncprov_state_ctrl( &sop, &rs, &e_uuid,
                 mode, ctrls, 0, 1, &cookie );                  mode, ctrls, 0, 1, &cookie );
   
           rs.sr_entry = e;
         rs.sr_ctrls = ctrls;          rs.sr_ctrls = ctrls;
         op->o_bd->bd_info = (BackendInfo *)on->on_info;  
         switch( mode ) {          switch( mode ) {
         case LDAP_SYNC_ADD:          case LDAP_SYNC_ADD:
                 rs.sr_entry = *e;  
                 if ( rs.sr_entry->e_private )  
                         rs.sr_flags = REP_ENTRY_MUSTRELEASE;  
                 if ( opc->sreference ) {                  if ( opc->sreference ) {
                         rs.sr_ref = get_entry_referrals( &sop, rs.sr_entry );                          rs.sr_ref = get_entry_referrals( &sop, e );
                         send_search_reference( &sop, &rs );                          send_search_reference( &sop, &rs );
                         ber_bvarray_free( rs.sr_ref );                          ber_bvarray_free( rs.sr_ref );
                         if ( !rs.sr_entry )  
                                 *e = NULL;  
                         break;                          break;
                 }                  }
                 /* fallthru */                  /* fallthru */
         case LDAP_SYNC_MODIFY:          case LDAP_SYNC_MODIFY:
                 rs.sr_entry = *e;  
                 if ( rs.sr_entry->e_private )  
                         rs.sr_flags = REP_ENTRY_MUSTRELEASE;  
                 rs.sr_attrs = sop.ors_attrs;                  rs.sr_attrs = sop.ors_attrs;
                 send_search_entry( &sop, &rs );                  send_search_entry( &sop, &rs );
                 if ( !rs.sr_entry )  
                         *e = NULL;  
                 break;                  break;
         case LDAP_SYNC_DELETE:          case LDAP_SYNC_DELETE:
                 e_uuid.e_attrs = NULL;                  e_uuid.e_attrs = NULL;
Line 847  syncprov_sendresp( Operation *op, opcook Line 757  syncprov_sendresp( Operation *op, opcook
                 assert(0);                  assert(0);
         }          }
         op->o_tmpfree( rs.sr_ctrls[0], op->o_tmpmemctx );          op->o_tmpfree( rs.sr_ctrls[0], op->o_tmpmemctx );
         op->o_private = sop.o_private;  
         rs.sr_ctrls = NULL;          rs.sr_ctrls = NULL;
         /* Check queue again here; if we were hanging in a send and eventually  
          * recovered, there may be more to send now. But don't check if the  
          * original psearch has been abandoned.  
          */  
         if ( so->s_op->o_abandon )  
                 return SLAPD_ABANDON;  
   
         if ( rs.sr_err == LDAP_SUCCESS && queue && so->s_res ) {  
                 ldap_pvt_thread_mutex_lock( &so->s_mutex );  
                 rs.sr_err = syncprov_qplay( &sop, on, so );  
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );  
         }  
         return rs.sr_err;          return rs.sr_err;
 }  }
   
Line 988  syncprov_matchops( Operation *op, opcook Line 885  syncprov_matchops( Operation *op, opcook
         if ( op->o_tag != LDAP_REQ_ADD ) {          if ( op->o_tag != LDAP_REQ_ADD ) {
                 op->o_bd->bd_info = (BackendInfo *)on->on_info;                  op->o_bd->bd_info = (BackendInfo *)on->on_info;
                 rc = be_entry_get_rw( op, fc.fdn, NULL, NULL, 0, &e );                  rc = be_entry_get_rw( op, fc.fdn, NULL, NULL, 0, &e );
                 /* If we're sending responses now, make a copy and unlock the DB */  
                 if ( e && !saveit ) {  
                         Entry *e2 = entry_dup( e );  
                         be_entry_release_rw( op, e, 0 );  
                         e = e2;  
                 }  
                 op->o_bd->bd_info = (BackendInfo *)on;                  op->o_bd->bd_info = (BackendInfo *)on;
                 if ( rc ) return;                  if ( rc ) return;
         } else {          } else {
Line 1060  syncprov_matchops( Operation *op, opcook Line 951  syncprov_matchops( Operation *op, opcook
                                 opc->smatches = sm;                                  opc->smatches = sm;
                         } else {                          } else {
                                 /* if found send UPDATE else send ADD */                                  /* if found send UPDATE else send ADD */
                                 ss->s_inuse++;                                  syncprov_sendresp( op, opc, ss, e,
                                 ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );  
                                 syncprov_sendresp( op, opc, ss, &e,  
                                         found ? LDAP_SYNC_MODIFY : LDAP_SYNC_ADD, 1 );                                          found ? LDAP_SYNC_MODIFY : LDAP_SYNC_ADD, 1 );
                                 ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );  
                                 ss->s_inuse--;  
                         }                          }
                 } else if ( !saveit && found ) {                  } else if ( !saveit && found ) {
                         /* send DELETE */                          /* send DELETE */
                         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );  
                         syncprov_sendresp( op, opc, ss, NULL, LDAP_SYNC_DELETE, 1 );                          syncprov_sendresp( op, opc, ss, NULL, LDAP_SYNC_DELETE, 1 );
                         ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );  
                 }                  }
         }          }
         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
 done:  done:
         if ( op->o_tag != LDAP_REQ_ADD && e ) {          if ( op->o_tag != LDAP_REQ_ADD ) {
                 op->o_bd->bd_info = (BackendInfo *)on->on_info;                  op->o_bd->bd_info = (BackendInfo *)on->on_info;
                 be_entry_release_rw( op, e, 0 );                  be_entry_release_rw( op, e, 0 );
                 op->o_bd->bd_info = (BackendInfo *)on;                  op->o_bd->bd_info = (BackendInfo *)on;
Line 1106  syncprov_op_cleanup( Operation *op, Slap Line 991  syncprov_op_cleanup( Operation *op, Slap
         mtdummy.mt_op = op;          mtdummy.mt_op = op;
         ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );          ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );
         mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp );          mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp );
           ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
         if ( mt ) {          if ( mt ) {
                 modinst *mi = mt->mt_mods;                  modinst *mi = mt->mt_mods;
   
Line 1116  syncprov_op_cleanup( Operation *op, Slap Line 1002  syncprov_op_cleanup( Operation *op, Slap
                         mt->mt_op = mt->mt_mods->mi_op;                          mt->mt_op = mt->mt_mods->mi_op;
                         ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );                          ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
                 } else {                  } else {
                           ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );
                         avl_delete( &si->si_mods, mt, sp_avl_cmp );                          avl_delete( &si->si_mods, mt, sp_avl_cmp );
                           ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
                         ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );                          ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
                         ldap_pvt_thread_mutex_destroy( &mt->mt_mutex );                          ldap_pvt_thread_mutex_destroy( &mt->mt_mutex );
                         ch_free( mt );                          ch_free( mt );
                 }                  }
         }          }
         ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );  
         if ( !BER_BVISNULL( &opc->suuid ))          if ( !BER_BVISNULL( &opc->suuid ))
                 op->o_tmpfree( opc->suuid.bv_val, op->o_tmpmemctx );                  op->o_tmpfree( opc->suuid.bv_val, op->o_tmpmemctx );
         if ( !BER_BVISNULL( &opc->sndn ))          if ( !BER_BVISNULL( &opc->sndn ))
Line 1151  syncprov_checkpoint( Operation *op, Slap Line 1038  syncprov_checkpoint( Operation *op, Slap
         mod.sml_nvalues = NULL;          mod.sml_nvalues = NULL;
         mod.sml_desc = slap_schema.si_ad_contextCSN;          mod.sml_desc = slap_schema.si_ad_contextCSN;
         mod.sml_op = LDAP_MOD_REPLACE;          mod.sml_op = LDAP_MOD_REPLACE;
         mod.sml_flags = 0;  
         mod.sml_next = NULL;          mod.sml_next = NULL;
   
         cb.sc_response = slap_null_cb;          cb.sc_response = slap_null_cb;
Line 1422  syncprov_op_response( Operation *op, Sla Line 1308  syncprov_op_response( Operation *op, Sla
                                 /* for each match in opc->smatches:                                  /* for each match in opc->smatches:
                                  *   send DELETE msg                                   *   send DELETE msg
                                  */                                   */
                                   ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
                                 for ( sm = opc->smatches; sm; sm=sm->sm_next ) {                                  for ( sm = opc->smatches; sm; sm=sm->sm_next ) {
                                         if ( sm->sm_op->s_op->o_abandon )                                          if ( sm->sm_op->s_op->o_abandon )
                                                 continue;                                                  continue;
                                         syncprov_sendresp( op, opc, sm->sm_op, NULL,                                          syncprov_sendresp( op, opc, sm->sm_op, NULL,
                                                 LDAP_SYNC_DELETE, 1 );                                                  LDAP_SYNC_DELETE, 1 );
                                 }                                  }
                                   ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
                                 break;                                  break;
                         }                          }
                 }                  }
Line 1581  syncprov_op_mod( Operation *op, SlapRepl Line 1469  syncprov_op_mod( Operation *op, SlapRepl
   
         if (( si->si_ops || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )          if (( si->si_ops || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )
                 syncprov_matchops( op, opc, 1 );                  syncprov_matchops( op, opc, 1 );
                   
   
         return SLAP_CB_CONTINUE;          return SLAP_CB_CONTINUE;
 }  }
Line 1744  syncprov_search_response( Operation *op, Line 1633  syncprov_search_response( Operation *op,
                                 &cookie, 1, NULL, 0 );                                  &cookie, 1, NULL, 0 );
                         /* Flush any queued persist messages */                          /* Flush any queued persist messages */
                         if ( ss->ss_so->s_res ) {                          if ( ss->ss_so->s_res ) {
                                   syncres *sr, *srnext;
                                   Entry *e;
                                   opcookie opc;
   
                                   opc.son = on;
                                 ldap_pvt_thread_mutex_lock( &ss->ss_so->s_mutex );                                  ldap_pvt_thread_mutex_lock( &ss->ss_so->s_mutex );
                                 locked = 1;                                  locked = 1;
                                 syncprov_qplay( op, on, ss->ss_so );                                  for (sr = ss->ss_so->s_res; sr; sr=srnext) {
                                           int rc = LDAP_SUCCESS;
                                           srnext = sr->s_next;
                                           opc.sdn = sr->s_dn;
                                           opc.sndn = sr->s_ndn;
                                           opc.suuid = sr->s_uuid;
                                           opc.sctxcsn = sr->s_csn;
                                           opc.sreference = sr->s_isreference;
                                           e = NULL;
   
                                           if ( sr->s_mode != LDAP_SYNC_DELETE ) {
                                                   op->o_bd->bd_info = (BackendInfo *)on->on_info;
                                                   rc = be_entry_get_rw( op, &opc.sndn, NULL, NULL, 0, &e );
                                                   op->o_bd->bd_info = (BackendInfo *)on;
                                           }
                                           if ( rc == LDAP_SUCCESS )
                                                   syncprov_sendresp( op, &opc, ss->ss_so, e,
                                                           sr->s_mode, 0 );
   
                                           if ( e ) {
                                                   op->o_bd->bd_info = (BackendInfo *)on->on_info;
                                                   be_entry_release_rw( op, e, 0 );
                                                   op->o_bd->bd_info = (BackendInfo *)on;
                                           }
                                           ch_free( sr );
                                   }
                                   ss->ss_so->s_res = NULL;
                                   ss->ss_so->s_restail = NULL;
                         }                          }
   
                         /* Turn off the refreshing flag */                          /* Turn off the refreshing flag */
Line 1996  syncprov_operational( Line 1917  syncprov_operational(
         return SLAP_CB_CONTINUE;          return SLAP_CB_CONTINUE;
 }  }
   
 enum {  
         SP_CHKPT = 1,  
         SP_SESSL  
 };  
   
 static ConfigDriver sp_cf_gen;  
   
 static ConfigTable spcfg[] = {  
         { "syncprov-checkpoint", "ops> <minutes", 3, 3, 0, ARG_MAGIC|SP_CHKPT,  
                 sp_cf_gen, "( OLcfgOvAt:1.1 NAME 'olcSpCheckpoint' "  
                         "DESC 'ContextCSN checkpoint interval in ops and minutes' "  
                         "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },  
         { "syncprov-sessionlog", "size", 2, 2, 0, ARG_INT|ARG_MAGIC|SP_SESSL,  
                 sp_cf_gen, "( OLcfgOvAt:1.2 NAME 'olcSpSessionlog' "  
                         "DESC 'Session log size in ops' "  
                         "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },  
         { NULL, NULL, 0, 0, 0, ARG_IGNORED }  
 };  
   
 static ConfigOCs spocs[] = {  
         { "( OLcfgOvOc:1.1 "  
                 "NAME 'olcSyncProvConfig' "  
                 "DESC 'SyncRepl Provider configuration' "  
                 "SUP olcOverlayConfig "  
                 "MAY ( olcSpCheckpoint $ olcSpSessionlog ) )",  
                         Cft_Overlay, spcfg },  
         { NULL, 0, NULL }  
 };  
   
 static int  static int
 sp_cf_gen(ConfigArgs *c)  syncprov_db_config(
           BackendDB       *be,
           const char      *fname,
           int             lineno,
           int             argc,
           char    **argv
   )
 {  {
         slap_overinst           *on = (slap_overinst *)c->bi;          slap_overinst           *on = (slap_overinst *)be->bd_info;
         syncprov_info_t         *si = (syncprov_info_t *)on->on_bi.bi_private;          syncprov_info_t         *si = (syncprov_info_t *)on->on_bi.bi_private;
         int rc = 0;  
   
         if ( c->op == SLAP_CONFIG_EMIT ) {          if ( strcasecmp( argv[ 0 ], "syncprov-checkpoint" ) == 0 ) {
                 switch ( c->type ) {                  if ( argc != 3 ) {
                 case SP_CHKPT:                          fprintf( stderr, "%s: line %d: wrong number of arguments in "
                         if ( si->si_chkops || si->si_chktime ) {                                  "\"syncprov-checkpoint <ops> <minutes>\"\n", fname, lineno );
                                 struct berval bv;                          return -1;
                                 bv.bv_len = sprintf( c->msg, "%d %d",  
                                         si->si_chkops, si->si_chktime );  
                                 bv.bv_val = c->msg;  
                                 value_add_one( &c->rvalue_vals, &bv );  
                         } else {  
                                 rc = 1;  
                         }  
                         break;  
                 case SP_SESSL:  
                         if ( si->si_logs ) {  
                                 c->value_int = si->si_logs->sl_size;  
                         } else {  
                                 rc = 1;  
                         }  
                         break;  
                 }                  }
                 return rc;                  si->si_chkops = atoi( argv[1] );
         } else if ( c->op == LDAP_MOD_DELETE ) {                  si->si_chktime = atoi( argv[2] ) * 60;
                 switch ( c->type ) {                  return 0;
                 case SP_CHKPT:  
                         si->si_chkops = 0;  
                         si->si_chktime = 0;  
                         break;  
                 case SP_SESSL:  
                         if ( si->si_logs )  
                                 si->si_logs->sl_size = 0;  
                         else  
                                 rc = LDAP_NO_SUCH_ATTRIBUTE;  
                         break;  
                 }  
                 return rc;  
         }  
         switch ( c->type ) {  
         case SP_CHKPT:  
                 si->si_chkops = atoi( c->argv[1] );  
                 si->si_chktime = atoi( c->argv[2] ) * 60;  
                 break;  
         case SP_SESSL: {  
                 sessionlog *sl;  
                 int size = c->value_int;  
   
           } else if ( strcasecmp( argv[0], "syncprov-sessionlog" ) == 0 ) {
                   sessionlog *sl;
                   int size;
                   if ( argc != 2 ) {
                           fprintf( stderr, "%s: line %d: wrong number of arguments in "
                                   "\"syncprov-sessionlog <size>\"\n", fname, lineno );
                           return -1;
                   }
                   size = atoi( argv[1] );
                 if ( size < 0 ) {                  if ( size < 0 ) {
                         sprintf( c->msg, "%s size %d is negative",                          fprintf( stderr,
                                 c->argv[0], size );                                  "%s: line %d: session log size %d is negative\n",
                         Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );                                  fname, lineno, size );
                         return ARG_BAD_CONF;                          return -1;
                 }                  }
                 sl = si->si_logs;                  sl = si->si_logs;
                 if ( !sl ) {                  if ( !sl ) {
Line 2095  sp_cf_gen(ConfigArgs *c) Line 1965  sp_cf_gen(ConfigArgs *c)
                         si->si_logs = sl;                          si->si_logs = sl;
                 }                  }
                 sl->sl_size = size;                  sl->sl_size = size;
                 }                  return 0;
                 break;  
         }          }
         return rc;  
           return SLAP_CONF_UNKNOWN;
 }  }
   
 /* Cheating - we have no thread pool context for these functions,  /* Cheating - we have no thread pool context for these functions,
Line 2391  syncprov_init() Line 2261  syncprov_init()
                 SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL,                  SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL,
                 syncprov_parseCtrl, &slap_cids.sc_LDAPsync );                  syncprov_parseCtrl, &slap_cids.sc_LDAPsync );
         if ( rc != LDAP_SUCCESS ) {          if ( rc != LDAP_SUCCESS ) {
                 Debug( LDAP_DEBUG_ANY,                  fprintf( stderr, "Failed to register control %d\n", rc );
                         "syncprov_init: Failed to register control %d\n", rc, 0, 0 );  
                 return rc;                  return rc;
         }          }
   
         syncprov.on_bi.bi_type = "syncprov";          syncprov.on_bi.bi_type = "syncprov";
         syncprov.on_bi.bi_db_init = syncprov_db_init;          syncprov.on_bi.bi_db_init = syncprov_db_init;
           syncprov.on_bi.bi_db_config = syncprov_db_config;
         syncprov.on_bi.bi_db_destroy = syncprov_db_destroy;          syncprov.on_bi.bi_db_destroy = syncprov_db_destroy;
         syncprov.on_bi.bi_db_open = syncprov_db_open;          syncprov.on_bi.bi_db_open = syncprov_db_open;
         syncprov.on_bi.bi_db_close = syncprov_db_close;          syncprov.on_bi.bi_db_close = syncprov_db_close;
Line 2414  syncprov_init() Line 2284  syncprov_init()
         syncprov.on_bi.bi_extended = syncprov_op_extended;          syncprov.on_bi.bi_extended = syncprov_op_extended;
         syncprov.on_bi.bi_operational = syncprov_operational;          syncprov.on_bi.bi_operational = syncprov_operational;
   
         syncprov.on_bi.bi_cf_ocs = spocs;  
   
         rc = config_register_schema( spcfg, spocs );  
         if ( rc ) return rc;  
   
         return overlay_register( &syncprov );          return overlay_register( &syncprov );
 }  }
   

Removed from v.1.56.2.8  
changed lines
  Added in v.1.74


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org