int LDAP_CALL ldap_msgtype( LDAPMessage *lm ) { if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( lm )) { return( -1 ); } return( lm->lm_msgtype ); }
int LDAP_CALL ldap_modify_ext( LDAP *ld, const char *dn, LDAPMod **mods, LDAPControl **serverctrls, LDAPControl **clientctrls, int *msgidp ) { BerElement *ber; int i, rc, lderr; /* * A modify request looks like this: * ModifyRequet ::= SEQUENCE { * object DistinguishedName, * modifications SEQUENCE OF SEQUENCE { * operation ENUMERATED { * add (0), * delete (1), * replace (2) * }, * modification SEQUENCE { * type AttributeType, * values SET OF AttributeValue * } * } * } */ LDAPDebug( LDAP_DEBUG_TRACE, "ldap_modify_ext\n", 0, 0, 0 ); if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) { return( LDAP_PARAM_ERROR ); } if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( msgidp )) { LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL ); return( LDAP_PARAM_ERROR ); } if ( !NSLDAPI_VALID_NONEMPTY_LDAPMOD_ARRAY( mods )) { lderr = LDAP_PARAM_ERROR; LDAP_SET_LDERRNO( ld, lderr, NULL, NULL ); return( lderr ); } if ( dn == NULL ) { dn = ""; } LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK ); *msgidp = ++ld->ld_msgid; LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK ); /* see if we should add to the cache */ if ( ld->ld_cache_on && ld->ld_cache_modify != NULL ) { LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK ); if ( (rc = (ld->ld_cache_modify)( ld, *msgidp, LDAP_REQ_MODIFY, dn, mods )) != 0 ) { *msgidp = rc; LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK ); return( LDAP_SUCCESS ); } LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK ); } /* create a message to send */ if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber )) != LDAP_SUCCESS ) { return( lderr ); } if ( ber_printf( ber, "{it{s{", *msgidp, LDAP_REQ_MODIFY, dn ) == -1 ) { lderr = LDAP_ENCODING_ERROR; LDAP_SET_LDERRNO( ld, lderr, NULL, NULL ); ber_free( ber, 1 ); return( lderr ); } /* for each modification to be performed... */ for ( i = 0; mods[i] != NULL; i++ ) { if (( mods[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) { rc = ber_printf( ber, "{e{s[V]}}", mods[i]->mod_op & ~LDAP_MOD_BVALUES, mods[i]->mod_type, mods[i]->mod_bvalues ); } else { rc = ber_printf( ber, "{e{s[v]}}", mods[i]->mod_op, mods[i]->mod_type, mods[i]->mod_values ); } if ( rc == -1 ) { lderr = LDAP_ENCODING_ERROR; LDAP_SET_LDERRNO( ld, lderr, NULL, NULL ); ber_free( ber, 1 ); return( lderr ); } } if ( ber_printf( ber, "}}" ) == -1 ) { lderr = LDAP_ENCODING_ERROR; LDAP_SET_LDERRNO( ld, lderr, NULL, NULL ); ber_free( ber, 1 ); return( lderr ); } if (( lderr = nsldapi_put_controls( ld, serverctrls, 1, ber )) != LDAP_SUCCESS ) { ber_free( ber, 1 ); return( lderr ); } /* send the message */ rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_MODIFY, (char *)dn, ber ); *msgidp = rc; return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS ); }