---
name: "ldap_first_attribute"
section: "3"
platform: "linux"
package: "libldap"
version: "2.7.2-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/ldap_first_attribute"
---

# ldap\_first\_attribute(3)

step through LDAP entry attributes

## NAME

ldap\_first\_attribute, ldap\_next\_attribute - step through LDAP entry attributes

## LIBRARY

OpenLDAP LDAP (libldap, -lldap)

## SYNOPSIS

```
#include <ldap.h>
```

**char \*ldap\_first\_attribute(**\
 	**LDAP \*ld, LDAPMessage \*entry, BerElement \*\*berptr )**

**char \*ldap\_next\_attribute(**\
 	**LDAP \*ld, LDAPMessage \*entry, BerElement \*ber )**

**int ldap\_get\_attribute\_ber(**\
 	**LDAP \*ld, LDAPMessage \*entry, BerElement \*ber,**\
 	**BerValue \*attr, BerVarray \*vals )**

## DESCRIPTION

**The** **ldap\_first\_attribute()**, **ldap\_next\_attribute()** **and** **ldap\_get\_attribute\_ber()** **routines are used** **to step through the attributes in an LDAP entry.** **ldap\_first\_attribute()** **takes an** *entry* **as returned by** [**ldap\_first\_entry**(3)](/ldap_first_entry/3.md) **or** [**ldap\_next\_entry**(3)](/ldap_next_entry/3.md) **and returns a pointer to character string** **containing the first attribute description in the entry.** **ldap\_next\_attribute()** **returns the next attribute description in the entry.**

**It also returns, in** *berptr***, a pointer to a BerElement it has** **allocated to keep track of its current position.  This pointer should** **be passed to subsequent calls to** **ldap\_next\_attribute()** **and is used** **to effectively step through the entry's attributes.  The caller is** **solely responsible for freeing the BerElement pointed to by** *berptr* **when it is no longer needed by calling** [**ber\_free**(3)](/ber_free/3.md). **When calling** [**ber\_free**(3)](/ber_free/3.md) **in this instance, be sure the second argument is 0.**

**The attribute names returned are suitable for inclusion in a call** **to** [**ldap\_get\_values**(3)](/ldap_get_values/3.md) **to retrieve the attribute's values.**

**The** **ldap\_get\_attribute\_ber()** **routine allows one to iterate over all attributes in-place, without** **allocating memory to hold text for the attribute name or its values,** **if requested. The use case is similar to** **ldap\_next\_attribute()** **except that the attribute name is returned into** *attr* **and, if** *vals* **is non-NULL, the list of values is stored there. Both point** **into the LDAP message and remain valid only while the entry is valid.** **The caller is still responsible for freeing** *vals* **with** [**ldap\_memfree**(3)](/ldap_memfree/3.md), **if used.**

## ERRORS

**If an error occurs, NULL is returned and the ld\_errno field in the** *ld* **parameter is set to indicate the error.  See** [**ldap\_error**(3)](/ldap_error/3.md) **for a description of possible error codes.**

## NOTES

**The** **ldap\_first\_attribute()** **and** **ldap\_next\_attribute()** **return dynamically allocated memory that must be freed by the caller via** [**ldap\_memfree**(3)](/ldap_memfree/3.md). **For** **ldap\_get\_attribute\_ber()**, **only the actual** *vals* **pointer needs to be freed with** [**ldap\_memfree**(3)](/ldap_memfree/3.md), **other data is accounted for as part of** *ber***.**

## SEE ALSO

[**ldap**(3)](/ldap/3.md), [**ldap\_first\_entry**(3)](/ldap_first_entry/3.md), [**ldap\_get\_values**(3)](/ldap_get_values/3.md), [**ldap\_error**(3)](/ldap_error/3.md)

## ACKNOWLEDGEMENTS

**OpenLDAP Software** **is developed and maintained by The OpenLDAP Project \<http://www.openldap.org/\>.** **OpenLDAP Software** **is derived from the University of Michigan LDAP 3.3 Release.**
