-static int parseLDAPsync (
- Operation *op,
- SlapReply *rs,
- LDAPControl *ctrl )
-{
- ber_tag_t tag;
- BerElement *ber;
- ber_int_t mode;
- ber_len_t len;
- struct slap_session_entry *se;
-
- if ( op->o_sync != SLAP_NO_CONTROL ) {
- rs->sr_text = "Sync control specified multiple times";
- return LDAP_PROTOCOL_ERROR;
- }
-
- if ( op->o_pagedresults != SLAP_NO_CONTROL ) {
- rs->sr_text = "Sync control specified with pagedResults control";
- return LDAP_PROTOCOL_ERROR;
- }
-
-
- if ( ctrl->ldctl_value.bv_len == 0 ) {
- rs->sr_text = "Sync control value is empty (or absent)";
- return LDAP_PROTOCOL_ERROR;
- }
-
- /* Parse the control value
- * syncRequestValue ::= SEQUENCE {
- * mode ENUMERATED {
- * -- 0 unused
- * refreshOnly (1),
- * -- 2 reserved
- * refreshAndPersist (3)
- * },
- * cookie syncCookie OPTIONAL
- * }
- */
-
- ber = ber_init( &ctrl->ldctl_value );
- if( ber == NULL ) {
- rs->sr_text = "internal error";
- return LDAP_OTHER;
- }
-
- if ( (tag = ber_scanf( ber, "{i" /*}*/, &mode )) == LBER_ERROR ) {
- rs->sr_text = "Sync control : mode decoding error";
- return LDAP_PROTOCOL_ERROR;
- }
-
- switch( mode ) {
- case LDAP_SYNC_REFRESH_ONLY:
- mode = SLAP_SYNC_REFRESH;
- break;
- case LDAP_SYNC_REFRESH_AND_PERSIST:
- mode = SLAP_SYNC_REFRESH_AND_PERSIST;
- break;
- default:
- rs->sr_text = "Sync control : unknown update mode";
- return LDAP_PROTOCOL_ERROR;
- }
-
- tag = ber_peek_tag( ber, &len );
-
- if ( tag == LDAP_TAG_SYNC_COOKIE ) {
- struct berval tmp_bv;
- if (( ber_scanf( ber, /*{*/ "o", &tmp_bv )) == LBER_ERROR ) {
- rs->sr_text = "Sync control : cookie decoding error";
- return LDAP_PROTOCOL_ERROR;
- }
- ber_bvarray_add( &op->o_sync_state.octet_str, &tmp_bv );
- slap_parse_sync_cookie( &op->o_sync_state );
- }
- if ( tag == LDAP_TAG_RELOAD_HINT ) {
- if (( ber_scanf( ber, /*{*/ "b", &op->o_sync_rhint )) == LBER_ERROR ) {
- rs->sr_text = "Sync control : rhint decoding error";
- return LDAP_PROTOCOL_ERROR;
- }
- }
- if (( ber_scanf( ber, /*{*/ "}")) == LBER_ERROR ) {
- rs->sr_text = "Sync control : decoding error";
- return LDAP_PROTOCOL_ERROR;
- }
-
- (void) ber_free( ber, 1 );
-
- op->o_sync_mode = (char) mode;
-
- op->o_sync = ctrl->ldctl_iscritical
- ? SLAP_CRITICAL_CONTROL
- : SLAP_NONCRITICAL_CONTROL;
-
- return LDAP_SUCCESS;
-}