BerElement * ldap_build_compare_req(LDAP *ld, char *dn, char *attr, struct berval *bvalue, LDAPControl **serverctrls) { BerElement *ber; int rc, rv; /* The compare request looks like this: * CompareRequest ::= SEQUENCE { * entry DistinguishedName, * ava SEQUENCE { * type AttributeType, * value AttributeValue * } * } * and must be wrapped in an LDAPMessage. */ /* create a message to send */ if ( (ber = alloc_ber_with_options( ld )) == NULLBER ) { ld->ld_errno = LDAP_NO_MEMORY; return( NULLBER ); } if ( ber_printf( ber, "{it{s{so}}", ++ld->ld_msgid, LDAP_REQ_COMPARE, dn, attr, bvalue->bv_val, bvalue->bv_len ) == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } /* LDAPv3 */ /* Code controls if any */ if (serverctrls && serverctrls[0]) { if (ldap_controls_code(ber, serverctrls) != LDAP_SUCCESS){ ld->ld_errno = LDAP_ENCODING_ERROR; return( NULLBER ); } } else if (ld->ld_srvctrls && ld->ld_srvctrls[0]) { /* Otherwise, is there any global server ctrls ? */ if (ldap_controls_code(ber, ld->ld_srvctrls) != LDAP_SUCCESS){ ld->ld_errno = LDAP_ENCODING_ERROR; return( NULLBER ); } } if (ber_printf(ber, "}") == -1) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free(ber, 1); return (NULLBER); } return (ber); }
BerElement * ldap_build_add_req(LDAP *ld, char *dn, LDAPMod **attrs, LDAPControl ** serverctrls) { BerElement * ber; int rc, i; /* * An add request looks like this: * AddRequest ::= [APPLICATION 8] SEQUENCE { * entry DistinguishedName, * attrs SEQUENCE OF SEQUENCE { * type AttributeType, * values SET OF AttributeValue * } * } */ /* create a message to send */ if ( (ber = alloc_ber_with_options( ld )) == NULLBER ) { ld->ld_errno = LDAP_NO_MEMORY; return( NULLBER ); } if ( ber_printf( ber, "{it{s{", ++ld->ld_msgid, LDAP_REQ_ADD, dn ) == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } /* for each attribute in the entry... */ for ( i = 0; attrs[i] != NULL; i++ ) { if ( ( attrs[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) { rc = ber_printf( ber, "{s[V]}", attrs[i]->mod_type, attrs[i]->mod_values ); } else { rc = ber_printf( ber, "{s[v]}", attrs[i]->mod_type, attrs[i]->mod_values ); } if ( rc == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return(NULLBER); } } if ( ber_printf( ber, "}}" ) == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } /* LDAPv3 */ /* Code controls if any */ if (serverctrls && serverctrls[0]) { if (ldap_controls_code(ber, serverctrls) != LDAP_SUCCESS){ ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } } else if (ld->ld_srvctrls && ld->ld_srvctrls[0]) { /* Otherwise, is there any global server ctrls ? */ if (ldap_controls_code(ber, ld->ld_srvctrls) != LDAP_SUCCESS){ ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } } if ( ber_printf( ber, "}" ) == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } return (ber); }