X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fadd.c;h=f36dfc8a0f05269be3fae9acdf0ebdbd62437959;hb=b9e2fd0dd6d8ad614a6c595f168058cd2ebc4bca;hp=7ce74dd97a27a259c7ba58eb3c4b43fce40c16ba;hpb=6939c531700652491f4be4688c6a1f35a1ab8a18;p=openldap diff --git a/libraries/libldap/add.c b/libraries/libldap/add.c index 7ce74dd97a..f36dfc8a0f 100644 --- a/libraries/libldap/add.c +++ b/libraries/libldap/add.c @@ -1,24 +1,20 @@ +/* add.c */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file - */ -/* Portions - * Copyright (c) 1990 Regents of the University of Michigan. - * All rights reserved. +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2007 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. * - * add.c + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ - -/* - * An add request looks like this: - * AddRequest ::= SEQUENCE { - * entry DistinguishedName, - * attrs SEQUENCE OF SEQUENCE { - * type AttributeType, - * values SET OF AttributeValue - * } - * } +/* Portions Copyright (c) 1990 Regents of the University of Michigan. + * All rights reserved. */ #include "portable.h" @@ -31,6 +27,30 @@ #include "ldap-int.h" +/* An LDAP Add Request/Response looks like this: + * AddRequest ::= [APPLICATION 8] SEQUENCE { + * entry LDAPDN, + * attributes AttributeList } + * + * AttributeList ::= SEQUENCE OF attribute Attribute + * + * Attribute ::= PartialAttribute(WITH COMPONENTS { + * ..., + * vals (SIZE(1..MAX))}) + * + * PartialAttribute ::= SEQUENCE { + * type AttributeDescription, + * vals SET OF value AttributeValue } + * + * AttributeDescription ::= LDAPString + * -- Constrained to [RFC4512] + * + * AttributeValue ::= OCTET STRING + * + * AddResponse ::= [APPLICATION 9] LDAPResult + * (Source: RFC 4511) + */ + /* * ldap_add - initiate an ldap add operation. Parameters: * @@ -98,12 +118,9 @@ ldap_add_ext( { BerElement *ber; int i, rc; + ber_int_t id; -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ENTRY, "ldap_add_ext\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_TRACE, "ldap_add_ext\n", 0, 0, 0 ); -#endif assert( ld != NULL ); assert( LDAP_VALID( ld ) ); assert( dn != NULL ); @@ -119,8 +136,9 @@ ldap_add_ext( return ld->ld_errno; } + LDAP_NEXT_MSGID(ld, id); rc = ber_printf( ber, "{it{s{", /* '}}}' */ - ++ld->ld_msgid, LDAP_REQ_ADD, dn ); + id, LDAP_REQ_ADD, dn ); if ( rc == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; @@ -128,19 +146,22 @@ ldap_add_ext( return ld->ld_errno; } - /* 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]N}", attrs[i]->mod_type, - attrs[i]->mod_bvalues ); - } else { - rc = ber_printf( ber, "{s[v]N}", attrs[i]->mod_type, - attrs[i]->mod_values ); - } - if ( rc == -1 ) { - ld->ld_errno = LDAP_ENCODING_ERROR; - ber_free( ber, 1 ); - return ld->ld_errno; + /* allow attrs to be NULL ("touch"; should fail...) */ + if ( attrs ) { + /* 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]N}", attrs[i]->mod_type, + attrs[i]->mod_bvalues ); + } else { + rc = ber_printf( ber, "{s[v]N}", attrs[i]->mod_type, + attrs[i]->mod_values ); + } + if ( rc == -1 ) { + ld->ld_errno = LDAP_ENCODING_ERROR; + ber_free( ber, 1 ); + return ld->ld_errno; + } } } @@ -163,7 +184,7 @@ ldap_add_ext( } /* send the message */ - *msgidp = ldap_send_initial_request( ld, LDAP_REQ_ADD, dn, ber ); + *msgidp = ldap_send_initial_request( ld, LDAP_REQ_ADD, dn, ber, id ); if(*msgidp < 0) return ld->ld_errno; @@ -187,7 +208,7 @@ ldap_add_ext_s( if ( rc != LDAP_SUCCESS ) return( rc ); - if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 ) + if ( ldap_result( ld, msgid, LDAP_MSG_ALL, (struct timeval *) NULL, &res ) == -1 || !res ) return( ld->ld_errno ); return( ldap_result2error( ld, res, 1 ) );