LDAP_SYNC
Section: C Library Functions (3)
Updated: 2018/12/19
Page Index
NAME
ldap_sync_init, ldap_sync_init_refresh_only, ldap_sync_init_refresh_and_persist, ldap_sync_poll - LDAP sync routines
LIBRARY
OpenLDAP LDAP (libldap, -lldap)
SYNOPSIS
#include <ldap.h>
int ldap_sync_init(ldap_sync_t *ls, int mode);
int ldap_sync_init_refresh_only(ldap_sync_t *ls);
int ldap_sync_init_refresh_and_persist(ldap_sync_t *ls);
int ldap_sync_poll(ldap_sync_t *ls);
ldap_sync_t * ldap_sync_initialize(ldap_sync_t *ls);
void ldap_sync_destroy(ldap_sync_t *ls, int freeit);
typedef int (*ldap_sync_search_entry_f)(ldap_sync_t *ls,
- LDAPMessage *msg, struct berval *entryUUID,
ldap_sync_refresh_t phase);
typedef int (*ldap_sync_search_reference_f)(ldap_sync_t *ls,
- LDAPMessage *msg);
typedef int (*ldap_sync_intermediate_f)(ldap_sync_t *ls,
- LDAPMessage *msg, BerVarray syncUUIDs,
ldap_sync_refresh_t phase);
typedef int (*ldap_sync_search_result_f)(ldap_sync_t *ls,
- LDAPMessage *msg, int refreshDeletes);
DESCRIPTION
These routines provide an interface to the LDAP Content Synchronization
operation (RFC 4533).
They require an
ldap_sync_t
structure to be set up with parameters required for various phases
of the operation; this includes setting some handlers for special events.
All handlers take a pointer to the ldap_sync_t structure as the first
argument, and a pointer to the LDAPMessage structure as received
from the server by the client library, plus, occasionally, other specific
arguments.
The members of the ldap_sync_t structure are:
- char *ls_base
-
The search base; by default, the
BASE
option in
ldap.conf(5).
- int ls_scope
-
The search scope (one of
LDAP_SCOPE_BASE,
LDAP_SCOPE_ONELEVEL,
LDAP_SCOPE_SUBORDINATE
or
LDAP_SCOPE_SUBTREE;
see
ldap.h
for details).
- char *ls_filter
-
The filter (RFC 4515); by default,
(objectClass=*).
- char **ls_attrs
-
The requested attributes; by default
NULL,
indicating all user attributes.
- int ls_timelimit
-
The requested time limit (in seconds); by default
0,
to indicate no limit.
- int ls_sizelimit
-
The requested size limit (in entries); by default
0,
to indicate no limit.
- int ls_timeout
-
The desired timeout during polling with
ldap_sync_poll(3).
A value of
-1
means that polling is blocking, so
ldap_sync_poll(3)
will not return until a message is received; a value of
0
means that polling returns immediately, no matter if any response
is available or not; a positive value represents the timeout the
ldap_sync_poll(3)
function will wait for response before returning, unless a message
is received; in that case,
ldap_sync_poll(3)
returns as soon as the message is available.
- ldap_sync_search_entry_f ls_search_entry
-
A function that is called whenever an entry is returned.
The
msg
argument is the
LDAPMessage
that contains the searchResultEntry; it can be parsed using the regular
client API routines, like
ldap_get_dn(3),
ldap_first_attribute(3),
and so on.
The
entryUUID
argument contains the entryUUID of the entry.
The
phase
argument indicates the type of operation: one of
LDAP_SYNC_CAPI_PRESENT,
LDAP_SYNC_CAPI_ADD,
LDAP_SYNC_CAPI_MODIFY,
LDAP_SYNC_CAPI_DELETE;
in case of
LDAP_SYNC_CAPI_PRESENT
or
LDAP_SYNC_CAPI_DELETE,
only the DN is contained in the
LDAPMessage;
in case of
LDAP_SYNC_CAPI_MODIFY,
the whole entry is contained in the
LDAPMessage,
and the application is responsible of determining the differences
between the new view of the entry provided by the caller and the data
already known.
- ldap_sync_search_reference_f ls_search_reference
-
A function that is called whenever a search reference is returned.
The
msg
argument is the
LDAPMessage
that contains the searchResultReference; it can be parsed using
the regular client API routines, like
ldap_parse_reference(3).
- ldap_sync_intermediate_f ls_intermediate
-
A function that is called whenever something relevant occurs during
the refresh phase of the search, which is marked by
an intermediateResponse message type.
The
msg
argument is the
LDAPMessage
that contains the intermediate response; it can be parsed using
the regular client API routines, like
ldap_parse_intermediate(3).
The
syncUUIDs
argument contains an array of UUIDs of the entries that depends
on the value of the
phase
argument.
In case of
LDAP_SYNC_CAPI_PRESENTS,
the "present" phase is being entered;
this means that the following sequence of results will consist
in entries in "present" sync state.
In case of
LDAP_SYNC_CAPI_DELETES,
the "deletes" phase is being entered;
this means that the following sequence of results will consist
in entries in "delete" sync state.
In case of
LDAP_SYNC_CAPI_PRESENTS_IDSET,
the message contains a set of UUIDs of entries that are present;
it replaces a "presents" phase.
In case of
LDAP_SYNC_CAPI_DELETES_IDSET,
the message contains a set of UUIDs of entries that have been deleted;
it replaces a "deletes" phase.
In case of
LDAP_SYNC_CAPI_DONE,
a "presents" phase with "refreshDone" set to "TRUE" has been returned
to indicate that the refresh phase of refreshAndPersist is over, and
the client should start polling.
Except for the
LDAP_SYNC_CAPI_PRESENTS_IDSET
and
LDAP_SYNC_CAPI_DELETES_IDSET
cases,
syncUUIDs
is NULL.
- ldap_sync_search_result_f ls_search_result
-
A function that is called whenever a searchResultDone is returned.
In refreshAndPersist this can only occur when the server decides
that the search must be interrupted.
The
msg
argument is the
LDAPMessage
that contains the response; it can be parsed using
the regular client API routines, like
ldap_parse_result(3).
The
refreshDeletes
argument is not relevant in this case; it should always be -1.
- void *ls_private
-
A pointer to private data. The client may register here
a pointer to data the handlers above may need.
- LDAP *ls_ld
-
A pointer to a LDAP structure that is used to connect to the server.
It is the responsibility of the client to initialize the structure
and to provide appropriate authentication and security in place.
GENERAL USE
A
ldap_sync_t
structure is initialized by calling
ldap_sync_initialize(3).
This simply clears out the contents of an already existing
ldap_sync_t
structure, and sets appropriate values for some members.
After that, the caller is responsible for setting up the
connection (member
ls_ld),
eventually setting up transport security (TLS),
for binding and any other initialization.
The caller must also fill all the documented search-related fields
of the
ldap_sync_t
structure.
At the end of a session, the structure can be cleaned up by calling
ldap_sync_destroy(3),
which takes care of freeing all data assuming it was allocated by
ldap_mem*(3)
routines.
Otherwise, the caller should take care of destroying and zeroing out
the documented search-related fields, and call
ldap_sync_destroy(3)
to free undocumented members set by the API.
REFRESH ONLY
The
refreshOnly
functionality is obtained by periodically calling
ldap_sync_init(3)
with mode set to
LDAP_SYNC_REFRESH_ONLY,
or, which is equivalent, by directly calling
ldap_sync_init_refresh_only(3).
The state of the search, and the consistency of the search parameters,
is preserved across calls by passing the
ldap_sync_t
structure as left by the previous call.
REFRESH AND PERSIST
The
refreshAndPersist
functionality is obtained by calling
ldap_sync_init(3)
with mode set to
LDAP_SYNC_REFRESH_AND_PERSIST,
or, which is equivalent, by directly calling
ldap_sync_init_refresh_and_persist(3)
and, after a successful return, by repeatedly polling with
ldap_sync_poll(3)
according to the desired pattern.
A client may insert a call to
ldap_sync_poll(3)
into an external loop to check if any modification was returned;
in this case, it might be appropriate to set
ls_timeout
to 0, or to set it to a finite, small value.
Otherwise, if the client's main purpose consists in waiting for
responses, a timeout of -1 is most suitable, so that the function
only returns after some data has been received and handled.
ERRORS
All routines return any LDAP error resulting from a lower-level error
in the API calls they are based on, or LDAP_SUCCESS in case of success.
ldap_sync_poll(3)
may return
LDAP_SYNC_REFRESH_REQUIRED
if a full refresh is requested by the server.
In this case, it is appropriate to call
ldap_sync_init(3)
again, passing the same
ldap_sync_t
structure as resulted from any previous call.
NOTES
SEE ALSO
ldap(3),
ldap_search_ext(3),
ldap_result(3)
;
RFC 4533
(
http://www.rfc-editor.org),
AUTHOR
Designed and implemented by Pierangelo Masarati, based on RFC 4533
and loosely inspired by syncrepl code in
slapd(8).
ACKNOWLEDGEMENTS
Initially developed by
SysNet s.n.c.
OpenLDAP
is developed and maintained by The OpenLDAP Project (
http://www.openldap.org/).
OpenLDAP
is derived from University of Michigan LDAP 3.3 Release.