mirror of
https://github.com/samba-team/samba.git
synced 2025-08-04 08:22:08 +03:00
r12850: - add Doxygen comments to ldb
- 'make doxygen' generated the api documentation under apidocs/
Many thanks to Brad Hards <bradh@frogmouth.net> for the patches!
metze
(This used to be commit e98d483174
)
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
c07d16d201
commit
4a8656fd65
1229
source4/lib/ldb/Doxyfile
Normal file
1229
source4/lib/ldb/Doxyfile
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,7 @@
|
|||||||
CC = @CC@
|
CC = @CC@
|
||||||
GCOV = @GCOV@
|
GCOV = @GCOV@
|
||||||
XSLTPROC = @XSLTPROC@
|
XSLTPROC = @XSLTPROC@
|
||||||
|
DOXYGEN = @DOXYGEN@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
includedir = @includedir@
|
includedir = @includedir@
|
||||||
@ -76,7 +77,7 @@ MANPAGES = $(patsubst %.xml,%,$(wildcard man/*.xml))
|
|||||||
|
|
||||||
EXAMPLES = examples/ldbreader examples/ldifreader
|
EXAMPLES = examples/ldbreader examples/ldifreader
|
||||||
|
|
||||||
all: $(DIRS) $(BINS) $(LIBS) $(EXAMPLES) $(MANPAGES)
|
all: $(DIRS) $(BINS) $(LIBS) $(EXAMPLES) $(MANPAGES) doxygen
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
@echo Compiling $*.c
|
@echo Compiling $*.c
|
||||||
@ -131,11 +132,15 @@ examples/ldifreader: examples/ldifreader.o $(LIBS)
|
|||||||
%.html: %.xml
|
%.html: %.xml
|
||||||
test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $<
|
test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $<
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
test -z "$(DOXYGEN)" || $(DOXYGEN)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f */*.o *.gcov */*.gc?? tdbtest.ldb* \
|
rm -f */*.o *.gcov */*.gc?? tdbtest.ldb* \
|
||||||
rm -f $(BINS) $(TDB_OBJ) $(TALLOC_OBJ) $(LDB_LIB)
|
rm -f $(BINS) $(TDB_OBJ) $(TALLOC_OBJ) $(LDB_LIB)
|
||||||
rm -f $(MANPAGES)
|
rm -f $(MANPAGES)
|
||||||
rm -f $(EXAMPLES)
|
rm -f $(EXAMPLES)
|
||||||
|
rm -rf apidocs/
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
rm -f *~ */*~
|
rm -f *~ */*~
|
||||||
|
@ -21,6 +21,7 @@ AC_SUBST(WITH_GCOV)
|
|||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_FUNC_MMAP
|
AC_FUNC_MMAP
|
||||||
AC_PATH_PROG(XSLTPROC,xsltproc)
|
AC_PATH_PROG(XSLTPROC,xsltproc)
|
||||||
|
AC_PATH_PROG(DOXYGEN,doxygen)
|
||||||
AC_PATH_PROG(GCOV,gcov)
|
AC_PATH_PROG(GCOV,gcov)
|
||||||
AC_CHECK_HEADERS(stdint.h)
|
AC_CHECK_HEADERS(stdint.h)
|
||||||
AC_CONFIG_HEADER(include/config.h)
|
AC_CONFIG_HEADER(include/config.h)
|
||||||
|
16
source4/lib/ldb/examples.dox
Normal file
16
source4/lib/ldb/examples.dox
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/** \example ldbreader.c
|
||||||
|
|
||||||
|
The code below shows a simple LDB application.
|
||||||
|
|
||||||
|
It lists / dumps the records in a LDB database to standard output.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** \example ldifreader.c
|
||||||
|
|
||||||
|
The code below shows a simple LDB application.
|
||||||
|
|
||||||
|
It lists / dumps the entries in an LDIF file to standard output.
|
||||||
|
|
||||||
|
*/
|
@ -35,8 +35,17 @@
|
|||||||
* Author: Stefan Metzmacher
|
* Author: Stefan Metzmacher
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\file ldb.h Samba's ldb database
|
||||||
|
|
||||||
|
This header file provides the main API for ldb.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef _LDB_H_
|
#ifndef _LDB_H_
|
||||||
|
|
||||||
|
/*! \cond DOXYGEN_IGNORE */
|
||||||
#define _LDB_H_ 1
|
#define _LDB_H_ 1
|
||||||
|
/*! \endcond */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
major restrictions as compared to normal LDAP:
|
major restrictions as compared to normal LDAP:
|
||||||
@ -53,45 +62,85 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
an individual lump of data in a result comes in this format. The
|
|
||||||
pointer will usually be to a UTF-8 string if the application is
|
|
||||||
sensible, but it can be to anything you like, including binary data
|
|
||||||
blobs of arbitrary size.
|
|
||||||
*/
|
|
||||||
#ifndef ldb_val
|
#ifndef ldb_val
|
||||||
|
/**
|
||||||
|
Result value
|
||||||
|
|
||||||
|
An individual lump of data in a result comes in this format. The
|
||||||
|
pointer will usually be to a UTF-8 string if the application is
|
||||||
|
sensible, but it can be to anything you like, including binary data
|
||||||
|
blobs of arbitrary size.
|
||||||
|
|
||||||
|
\note the data is null (0x00) terminated, but the length does not
|
||||||
|
include the terminator.
|
||||||
|
*/
|
||||||
struct ldb_val {
|
struct ldb_val {
|
||||||
uint8_t *data;
|
uint8_t *data; /*!< result data */
|
||||||
size_t length;
|
size_t length; /*!< length of data */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* internal ldb exploded dn structures */
|
/**
|
||||||
|
internal ldb exploded dn structures
|
||||||
|
*/
|
||||||
struct ldb_dn_component {
|
struct ldb_dn_component {
|
||||||
char *name;
|
char *name;
|
||||||
struct ldb_val value;
|
struct ldb_val value;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ldb_dn {
|
struct ldb_dn {
|
||||||
int comp_num;
|
int comp_num;
|
||||||
struct ldb_dn_component *components;
|
struct ldb_dn_component *components;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* these flags are used in ldb_message_element.flags fields. The
|
/**
|
||||||
LDA_FLAGS_MOD_* flags are used in ldap_modify() calls to specify
|
There are a number of flags that are used with ldap_modify() in
|
||||||
whether attributes are being added, deleted or modified */
|
ldb_message_element.flags fields. The LDA_FLAGS_MOD_ADD,
|
||||||
|
LDA_FLAGS_MOD_DELETE and LDA_FLAGS_MOD_REPLACE flags are used in
|
||||||
|
ldap_modify() calls to specify whether attributes are being added,
|
||||||
|
deleted or modified respectively.
|
||||||
|
*/
|
||||||
#define LDB_FLAG_MOD_MASK 0x3
|
#define LDB_FLAG_MOD_MASK 0x3
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flag value used in ldap_modify() to indicate that attributes are
|
||||||
|
being added.
|
||||||
|
|
||||||
|
\sa LDB_FLAG_MOD_MASK
|
||||||
|
*/
|
||||||
#define LDB_FLAG_MOD_ADD 1
|
#define LDB_FLAG_MOD_ADD 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flag value used in ldap_modify() to indicate that attributes are
|
||||||
|
being replaced.
|
||||||
|
|
||||||
|
\sa LDB_FLAG_MOD_MASK
|
||||||
|
*/
|
||||||
#define LDB_FLAG_MOD_REPLACE 2
|
#define LDB_FLAG_MOD_REPLACE 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flag value used in ldap_modify() to indicate that attributes are
|
||||||
|
being deleted.
|
||||||
|
|
||||||
|
\sa LDB_FLAG_MOD_MASK
|
||||||
|
*/
|
||||||
#define LDB_FLAG_MOD_DELETE 3
|
#define LDB_FLAG_MOD_DELETE 3
|
||||||
|
|
||||||
|
/**
|
||||||
|
OID for logic AND comaprison.
|
||||||
|
|
||||||
/*
|
This is the well known object ID for a logical AND comparitor.
|
||||||
well known object IDs
|
|
||||||
*/
|
*/
|
||||||
#define LDB_OID_COMPARATOR_AND "1.2.840.113556.1.4.803"
|
#define LDB_OID_COMPARATOR_AND "1.2.840.113556.1.4.803"
|
||||||
|
|
||||||
|
/**
|
||||||
|
OID for logic OR comparison.
|
||||||
|
|
||||||
|
This is the well known object ID for a logical OR comparitor.
|
||||||
|
*/
|
||||||
#define LDB_OID_COMPARATOR_OR "1.2.840.113556.1.4.804"
|
#define LDB_OID_COMPARATOR_OR "1.2.840.113556.1.4.804"
|
||||||
|
|
||||||
/*
|
/**
|
||||||
results are given back as arrays of ldb_message_element
|
results are given back as arrays of ldb_message_element
|
||||||
*/
|
*/
|
||||||
struct ldb_message_element {
|
struct ldb_message_element {
|
||||||
@ -102,7 +151,7 @@ struct ldb_message_element {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
a ldb_message represents all or part of a record. It can contain an arbitrary
|
a ldb_message represents all or part of a record. It can contain an arbitrary
|
||||||
number of elements.
|
number of elements.
|
||||||
*/
|
*/
|
||||||
@ -120,12 +169,15 @@ enum ldb_changetype {
|
|||||||
LDB_CHANGETYPE_MODIFY
|
LDB_CHANGETYPE_MODIFY
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/**
|
||||||
a ldif record - from ldif_read
|
LDIF record
|
||||||
|
|
||||||
|
This structure contains a LDIF record, as returned from ldif_read()
|
||||||
|
and equivalent functions.
|
||||||
*/
|
*/
|
||||||
struct ldb_ldif {
|
struct ldb_ldif {
|
||||||
enum ldb_changetype changetype;
|
enum ldb_changetype changetype; /*!< The type of change */
|
||||||
struct ldb_message *msg;
|
struct ldb_message *msg; /*!< The changes */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ldb_scope {LDB_SCOPE_DEFAULT=-1,
|
enum ldb_scope {LDB_SCOPE_DEFAULT=-1,
|
||||||
@ -145,7 +197,7 @@ typedef int (*ldb_traverse_fn)(struct ldb_context *, const struct ldb_message *)
|
|||||||
enum ldb_debug_level {LDB_DEBUG_FATAL, LDB_DEBUG_ERROR,
|
enum ldb_debug_level {LDB_DEBUG_FATAL, LDB_DEBUG_ERROR,
|
||||||
LDB_DEBUG_WARNING, LDB_DEBUG_TRACE};
|
LDB_DEBUG_WARNING, LDB_DEBUG_TRACE};
|
||||||
|
|
||||||
/*
|
/**
|
||||||
the user can optionally supply a debug function. The function
|
the user can optionally supply a debug function. The function
|
||||||
is based on the vfprintf() style of interface, but with the addition
|
is based on the vfprintf() style of interface, but with the addition
|
||||||
of a severity level
|
of a severity level
|
||||||
@ -156,14 +208,31 @@ struct ldb_debug_ops {
|
|||||||
void *context;
|
void *context;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flag value for database connection mode.
|
||||||
|
|
||||||
|
If LDB_FLG_RDONLY is used in ldb_connect, then the database will be
|
||||||
|
opened read-only, if possible.
|
||||||
|
*/
|
||||||
#define LDB_FLG_RDONLY 1
|
#define LDB_FLG_RDONLY 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flag value for database connection mode.
|
||||||
|
|
||||||
|
If LDB_FLG_NOSYNC is used in ldb_connect, then the database will be
|
||||||
|
opened without synchronous operations, if possible.
|
||||||
|
*/
|
||||||
#define LDB_FLG_NOSYNC 2
|
#define LDB_FLG_NOSYNC 2
|
||||||
|
|
||||||
|
/*! \cond DOXYGEN_IGNORE */
|
||||||
#ifndef PRINTF_ATTRIBUTE
|
#ifndef PRINTF_ATTRIBUTE
|
||||||
#define PRINTF_ATTRIBUTE(a,b)
|
#define PRINTF_ATTRIBUTE(a,b)
|
||||||
#endif
|
#endif
|
||||||
|
/*! \endcond */
|
||||||
|
|
||||||
/* structures for ldb_parse_tree handling code */
|
/*
|
||||||
|
structures for ldb_parse_tree handling code
|
||||||
|
*/
|
||||||
enum ldb_parse_op { LDB_OP_AND=1, LDB_OP_OR=2, LDB_OP_NOT=3,
|
enum ldb_parse_op { LDB_OP_AND=1, LDB_OP_OR=2, LDB_OP_NOT=3,
|
||||||
LDB_OP_EQUALITY=4, LDB_OP_SUBSTRING=5,
|
LDB_OP_EQUALITY=4, LDB_OP_SUBSTRING=5,
|
||||||
LDB_OP_GREATER=6, LDB_OP_LESS=7, LDB_OP_PRESENT=8,
|
LDB_OP_GREATER=6, LDB_OP_LESS=7, LDB_OP_PRESENT=8,
|
||||||
@ -235,24 +304,106 @@ struct ldb_attrib_handler {
|
|||||||
ldb_attr_comparison_t comparison_fn;
|
ldb_attr_comparison_t comparison_fn;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LDB_ATTR_FLAG_HIDDEN (1<<0) /* the attribute is not returned by default */
|
/**
|
||||||
#define LDB_ATTR_FLAG_CONSTRUCTED (1<<1) /* the attribute is constructed from other attributes */
|
The attribute is not returned by default
|
||||||
|
*/
|
||||||
|
#define LDB_ATTR_FLAG_HIDDEN (1<<0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
The attribute is constructed from other attributes
|
||||||
|
*/
|
||||||
|
#define LDB_ATTR_FLAG_CONSTRUCTED (1<<1)
|
||||||
|
|
||||||
/* well-known ldap attribute syntaxes - see rfc2252 section 4.3.2 */
|
/**
|
||||||
|
LDAP attribute syntax for a DN
|
||||||
|
|
||||||
|
This is the well-known LDAP attribute syntax for a DN.
|
||||||
|
|
||||||
|
See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
|
||||||
|
*/
|
||||||
#define LDB_SYNTAX_DN "1.3.6.1.4.1.1466.115.121.1.12"
|
#define LDB_SYNTAX_DN "1.3.6.1.4.1.1466.115.121.1.12"
|
||||||
|
|
||||||
|
/**
|
||||||
|
LDAP attribute syntax for a Directory String
|
||||||
|
|
||||||
|
This is the well-known LDAP attribute syntax for a Directory String.
|
||||||
|
|
||||||
|
See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
|
||||||
|
*/
|
||||||
#define LDB_SYNTAX_DIRECTORY_STRING "1.3.6.1.4.1.1466.115.121.1.15"
|
#define LDB_SYNTAX_DIRECTORY_STRING "1.3.6.1.4.1.1466.115.121.1.15"
|
||||||
|
|
||||||
|
/**
|
||||||
|
LDAP attribute syntax for an integer
|
||||||
|
|
||||||
|
This is the well-known LDAP attribute syntax for an integer.
|
||||||
|
|
||||||
|
See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
|
||||||
|
*/
|
||||||
#define LDB_SYNTAX_INTEGER "1.3.6.1.4.1.1466.115.121.1.27"
|
#define LDB_SYNTAX_INTEGER "1.3.6.1.4.1.1466.115.121.1.27"
|
||||||
|
|
||||||
|
/**
|
||||||
|
LDAP attribute syntax for an octet string
|
||||||
|
|
||||||
|
This is the well-known LDAP attribute syntax for an octet string.
|
||||||
|
|
||||||
|
See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
|
||||||
|
*/
|
||||||
#define LDB_SYNTAX_OCTET_STRING "1.3.6.1.4.1.1466.115.121.1.40"
|
#define LDB_SYNTAX_OCTET_STRING "1.3.6.1.4.1.1466.115.121.1.40"
|
||||||
|
|
||||||
|
/**
|
||||||
|
LDAP attribute syntax for UTC time.
|
||||||
|
|
||||||
|
This is the well-known LDAP attribute syntax for a UTC time.
|
||||||
|
|
||||||
|
See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
|
||||||
|
*/
|
||||||
#define LDB_SYNTAX_UTC_TIME "1.3.6.1.4.1.1466.115.121.1.53"
|
#define LDB_SYNTAX_UTC_TIME "1.3.6.1.4.1.1466.115.121.1.53"
|
||||||
|
|
||||||
#define LDB_SYNTAX_OBJECTCLASS "LDB_SYNTAX_OBJECTCLASS"
|
#define LDB_SYNTAX_OBJECTCLASS "LDB_SYNTAX_OBJECTCLASS"
|
||||||
|
|
||||||
/* sorting helpers */
|
/* sorting helpers */
|
||||||
typedef int (*ldb_qsort_cmp_fn_t) (const void *, const void *, const void *);
|
typedef int (*ldb_qsort_cmp_fn_t) (const void *, const void *, const void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
OID for the paged results control. This control is included in the
|
||||||
|
searchRequest and searchResultDone messages as part of the controls
|
||||||
|
field of the LDAPMessage, as defined in Section 4.1.12 of
|
||||||
|
LDAP v3.
|
||||||
|
|
||||||
|
\sa <a href="http://www.ietf.org/rfc/rfc2696.txt">RFC 2696</a>.
|
||||||
|
*/
|
||||||
#define LDB_CONTROL_PAGED_RESULTS_OID "1.2.840.113556.1.4.319"
|
#define LDB_CONTROL_PAGED_RESULTS_OID "1.2.840.113556.1.4.319"
|
||||||
|
|
||||||
|
/**
|
||||||
|
OID for extended DN
|
||||||
|
|
||||||
|
\sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_extended_dn_oid.asp">Microsoft documentation of this OID</a>
|
||||||
|
*/
|
||||||
#define LDB_CONTROL_EXTENDED_DN_OID "1.2.840.113556.1.4.529"
|
#define LDB_CONTROL_EXTENDED_DN_OID "1.2.840.113556.1.4.529"
|
||||||
|
|
||||||
|
/**
|
||||||
|
OID for LDAP server sort result extension.
|
||||||
|
|
||||||
|
This control is included in the searchRequest message as part of
|
||||||
|
the controls field of the LDAPMessage, as defined in Section 4.1.12
|
||||||
|
of LDAP v3. The controlType is set to
|
||||||
|
"1.2.840.113556.1.4.473". The criticality MAY be either TRUE or
|
||||||
|
FALSE (where absent is also equivalent to FALSE) at the client's
|
||||||
|
option.
|
||||||
|
|
||||||
|
\sa <a href="http://www.ietf.org/rfc/rfc2891.txt">RFC 2891</a>.
|
||||||
|
*/
|
||||||
#define LDB_CONTROL_SERVER_SORT_OID "1.2.840.113556.1.4.473"
|
#define LDB_CONTROL_SERVER_SORT_OID "1.2.840.113556.1.4.473"
|
||||||
|
|
||||||
|
/**
|
||||||
|
OID for LDAP server sort result response extension.
|
||||||
|
|
||||||
|
This control is included in the searchResultDone message as part of
|
||||||
|
the controls field of the LDAPMessage, as defined in Section 4.1.12 of
|
||||||
|
LDAP v3.
|
||||||
|
|
||||||
|
\sa <a href="http://www.ietf.org/rfc/rfc2891.txt">RFC 2891</a>.
|
||||||
|
*/
|
||||||
#define LDB_CONTROL_SORT_RESP_OID "1.2.840.113556.1.4.474"
|
#define LDB_CONTROL_SORT_RESP_OID "1.2.840.113556.1.4.474"
|
||||||
|
|
||||||
struct ldb_paged_control {
|
struct ldb_paged_control {
|
||||||
@ -347,29 +498,60 @@ struct ldb_request {
|
|||||||
|
|
||||||
int ldb_request(struct ldb_context *ldb, struct ldb_request *request);
|
int ldb_request(struct ldb_context *ldb, struct ldb_request *request);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
initialise a ldb context
|
Initialise an ldb context
|
||||||
|
|
||||||
|
This is required before any other LDB call.
|
||||||
|
|
||||||
|
\param mem_ctx pointer to a talloc memory context. Pass NULL if there is
|
||||||
|
no suitable context available.
|
||||||
|
|
||||||
|
\return pointer to ldb_context that should be free'd (using talloc_free())
|
||||||
|
at the end of the program.
|
||||||
*/
|
*/
|
||||||
struct ldb_context *ldb_init(void *mem_ctx);
|
struct ldb_context *ldb_init(void *mem_ctx);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
connect to a database. The URL can either be one of the following forms
|
Connect to a database.
|
||||||
ldb://path
|
|
||||||
ldapi://path
|
|
||||||
|
|
||||||
flags is made up of LDB_FLG_*
|
This is typically called soon after ldb_init(), and is required prior to
|
||||||
|
any search or database modification operations.
|
||||||
|
|
||||||
the options are passed uninterpreted to the backend, and are
|
The URL can be one of the following forms:
|
||||||
backend specific
|
- tdb://path
|
||||||
|
- ldapi://path
|
||||||
|
- ldap://host
|
||||||
|
- sqlite3://path
|
||||||
|
|
||||||
|
\param ldb the context associated with the database (from ldb_init())
|
||||||
|
\param url the URL of the database to connect to, as noted above
|
||||||
|
\param flags a combination of LDB_FLG_* to modify the connection behaviour
|
||||||
|
\param options backend specific options - passed uninterpreted to the backend
|
||||||
|
|
||||||
|
\return result code (LDB_SUCCESS on success, or a failure code)
|
||||||
|
|
||||||
|
\note It is an error to connect to a database that does not exist in readonly mode
|
||||||
|
(that is, with LDB_FLG_RDONLY). However in read-write mode, the database will be
|
||||||
|
created if it does not exist.
|
||||||
*/
|
*/
|
||||||
int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]);
|
int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
search the database given a LDAP-like search expression
|
Search the database
|
||||||
|
|
||||||
return the number of records found, or -1 on error
|
This function searches the database, and returns
|
||||||
|
records that match an LDAP-like search expression
|
||||||
|
|
||||||
use talloc_free to free the ldb_message returned
|
\param ldb the context associated with the database (from ldb_init())
|
||||||
|
\param base the Base Distinguished Name for the query (pass NULL for root DN)
|
||||||
|
\param scope the search scope for the query
|
||||||
|
\param expression the search expression to use for this query
|
||||||
|
\param attrs the search attributes for the query (pass NULL if none required)
|
||||||
|
\param res the return result
|
||||||
|
|
||||||
|
\return result code (LDB_SUCCESS on success, or a failure code)
|
||||||
|
|
||||||
|
\note use talloc_free() to free the ldb_result returned
|
||||||
*/
|
*/
|
||||||
int ldb_search(struct ldb_context *ldb,
|
int ldb_search(struct ldb_context *ldb,
|
||||||
const struct ldb_dn *base,
|
const struct ldb_dn *base,
|
||||||
@ -386,71 +568,263 @@ int ldb_search_bytree(struct ldb_context *ldb,
|
|||||||
struct ldb_parse_tree *tree,
|
struct ldb_parse_tree *tree,
|
||||||
const char * const *attrs, struct ldb_result **res);
|
const char * const *attrs, struct ldb_result **res);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
add a record to the database. Will fail if a record with the given class and key
|
Add a record to the database.
|
||||||
already exists
|
|
||||||
|
This function adds a record to the database. This function will fail
|
||||||
|
if a record with the specified class and key already exists in the
|
||||||
|
database.
|
||||||
|
|
||||||
|
\param ldb the context associated with the database (from
|
||||||
|
ldb_init())
|
||||||
|
\param message the message containing the record to add.
|
||||||
|
|
||||||
|
\return result code (LDB_SUCCESS if the record was added, otherwise
|
||||||
|
a failure code)
|
||||||
*/
|
*/
|
||||||
int ldb_add(struct ldb_context *ldb,
|
int ldb_add(struct ldb_context *ldb,
|
||||||
const struct ldb_message *message);
|
const struct ldb_message *message);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
modify the specified attributes of a record
|
Modify the specified attributes of a record
|
||||||
|
|
||||||
|
This function modifies a record that is in the database.
|
||||||
|
|
||||||
|
\param ldb the context associated with the database (from
|
||||||
|
ldb_init())
|
||||||
|
\param message the message containing the changes required.
|
||||||
|
|
||||||
|
\return result code (LDB_SUCCESS if the record was modified as
|
||||||
|
requested, otherwise a failure code)
|
||||||
*/
|
*/
|
||||||
int ldb_modify(struct ldb_context *ldb,
|
int ldb_modify(struct ldb_context *ldb,
|
||||||
const struct ldb_message *message);
|
const struct ldb_message *message);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
rename a record in the database
|
Rename a record in the database
|
||||||
|
|
||||||
|
This function renames a record in the database.
|
||||||
|
|
||||||
|
\param ldb the context associated with the database (from
|
||||||
|
ldb_init())
|
||||||
|
\param olddn the DN for the record to be renamed.
|
||||||
|
\param newdn the new DN
|
||||||
|
|
||||||
|
\return result code (LDB_SUCCESS if the record was renamed as
|
||||||
|
requested, otherwise a failure code)
|
||||||
*/
|
*/
|
||||||
int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct ldb_dn *newdn);
|
int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct ldb_dn *newdn);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
delete a record from the database
|
Delete a record from the database
|
||||||
|
|
||||||
|
This function deletes a record from the database.
|
||||||
|
|
||||||
|
\param ldb the context associated with the database (from
|
||||||
|
ldb_init())
|
||||||
|
\param dn the DN for the record to be deleted.
|
||||||
|
|
||||||
|
\return result code (LDB_SUCCESS if the record was deleted,
|
||||||
|
otherwise a failure code)
|
||||||
*/
|
*/
|
||||||
int ldb_delete(struct ldb_context *ldb, const struct ldb_dn *dn);
|
int ldb_delete(struct ldb_context *ldb, const struct ldb_dn *dn);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
start a transaction
|
start a transaction
|
||||||
*/
|
*/
|
||||||
int ldb_transaction_start(struct ldb_context *ldb);
|
int ldb_transaction_start(struct ldb_context *ldb);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
commit a transaction
|
commit a transaction
|
||||||
*/
|
*/
|
||||||
int ldb_transaction_commit(struct ldb_context *ldb);
|
int ldb_transaction_commit(struct ldb_context *ldb);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
cancel a transaction
|
cancel a transaction
|
||||||
*/
|
*/
|
||||||
int ldb_transaction_cancel(struct ldb_context *ldb);
|
int ldb_transaction_cancel(struct ldb_context *ldb);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
return extended error information from the last call
|
return extended error information from the last call
|
||||||
*/
|
*/
|
||||||
const char *ldb_errstring(struct ldb_context *ldb);
|
const char *ldb_errstring(struct ldb_context *ldb);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
casefold a string (should be UTF8, but at the moment it isn't)
|
Casefold a string
|
||||||
|
|
||||||
|
\param mem_ctx the memory context to allocate the result string
|
||||||
|
memory from.
|
||||||
|
\param s the string that is to be folded
|
||||||
|
\return a copy of the string, converted to upper case
|
||||||
|
|
||||||
|
\todo This function should be UTF8 aware, but currently is not.
|
||||||
*/
|
*/
|
||||||
char *ldb_casefold(void *mem_ctx, const char *s);
|
char *ldb_casefold(void *mem_ctx, const char *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compare two strings, without regard to case.
|
||||||
|
|
||||||
|
\param s1 the first string to compare
|
||||||
|
\param s2 the second string to compare
|
||||||
|
|
||||||
|
\return 0 if the strings are the same, non-zero if there are any
|
||||||
|
differences except for case.
|
||||||
|
|
||||||
|
\note This function is not UTF8 aware.
|
||||||
|
*/
|
||||||
int ldb_caseless_cmp(const char *s1, const char *s2);
|
int ldb_caseless_cmp(const char *s1, const char *s2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ldif manipulation functions
|
ldif manipulation functions
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
Write an LDIF message
|
||||||
|
|
||||||
|
This function writes an LDIF message using a caller supplied write
|
||||||
|
function.
|
||||||
|
|
||||||
|
\param ldb the ldb context (from ldb_init())
|
||||||
|
\param fprintf_fn a function pointer for the write function. This must take
|
||||||
|
a private data pointer, followed by a format string, and then a variable argument
|
||||||
|
list.
|
||||||
|
\param private_data pointer that will be provided back to the write
|
||||||
|
function. This is useful for maintaining state or context.
|
||||||
|
\param ldif the message to write out
|
||||||
|
|
||||||
|
\return the total number of bytes written, or an error code as returned
|
||||||
|
from the write function.
|
||||||
|
|
||||||
|
\sa ldb_ldif_write_file for a more convenient way to write to a
|
||||||
|
file stream.
|
||||||
|
|
||||||
|
\sa ldb_ldif_read for the reader equivalent to this function.
|
||||||
|
*/
|
||||||
int ldb_ldif_write(struct ldb_context *ldb,
|
int ldb_ldif_write(struct ldb_context *ldb,
|
||||||
int (*fprintf_fn)(void *, const char *, ...),
|
int (*fprintf_fn)(void *, const char *, ...),
|
||||||
void *private_data,
|
void *private_data,
|
||||||
const struct ldb_ldif *ldif);
|
const struct ldb_ldif *ldif);
|
||||||
void ldb_ldif_read_free(struct ldb_context *ldb, struct ldb_ldif *);
|
|
||||||
|
/**
|
||||||
|
Clean up an LDIF message
|
||||||
|
|
||||||
|
This function cleans up a LDIF message read using ldb_ldif_read()
|
||||||
|
or related functions (such as ldb_ldif_read_string() and
|
||||||
|
ldb_ldif_read_file().
|
||||||
|
|
||||||
|
\param ldb the ldb context (from ldb_init())
|
||||||
|
\param msg the message to clean up and free
|
||||||
|
|
||||||
|
*/
|
||||||
|
void ldb_ldif_read_free(struct ldb_context *ldb, struct ldb_ldif *msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read an LDIF message
|
||||||
|
|
||||||
|
This function creates an LDIF message using a caller supplied read
|
||||||
|
function.
|
||||||
|
|
||||||
|
\param ldb the ldb context (from ldb_init())
|
||||||
|
\param fgetc_fn a function pointer for the read function. This must
|
||||||
|
take a private data pointer, and must return a pointer to an
|
||||||
|
integer corresponding to the next byte read (or EOF if there is no
|
||||||
|
more data to be read).
|
||||||
|
\param private_data pointer that will be provided back to the read
|
||||||
|
function. This is udeful for maintaining state or context.
|
||||||
|
|
||||||
|
\return the LDIF message that has been read in
|
||||||
|
|
||||||
|
\note You must free the LDIF message when no longer required, using
|
||||||
|
ldb_ldif_read_free().
|
||||||
|
|
||||||
|
\sa ldb_ldif_read_file for a more convenient way to read from a
|
||||||
|
file stream.
|
||||||
|
|
||||||
|
\sa ldb_ldif_read_string for a more convenient way to read from a
|
||||||
|
string (char array).
|
||||||
|
|
||||||
|
\sa ldb_ldif_write for the writer equivalent to this function.
|
||||||
|
*/
|
||||||
struct ldb_ldif *ldb_ldif_read(struct ldb_context *ldb,
|
struct ldb_ldif *ldb_ldif_read(struct ldb_context *ldb,
|
||||||
int (*fgetc_fn)(void *), void *private_data);
|
int (*fgetc_fn)(void *), void *private_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read an LDIF message from a file
|
||||||
|
|
||||||
|
This function reads the next LDIF message from the contents of a
|
||||||
|
file stream. If you want to get all of the LDIF messages, you will
|
||||||
|
need to repeatedly call this function, until it returns NULL.
|
||||||
|
|
||||||
|
\param ldb the ldb context (from ldb_init())
|
||||||
|
\param f the file stream to read from (typically from fdopen())
|
||||||
|
|
||||||
|
\sa ldb_ldif_read_string for an equivalent function that will read
|
||||||
|
from a string (char array).
|
||||||
|
|
||||||
|
\sa ldb_ldif_write_file for the writer equivalent to this function.
|
||||||
|
|
||||||
|
*/
|
||||||
struct ldb_ldif *ldb_ldif_read_file(struct ldb_context *ldb, FILE *f);
|
struct ldb_ldif *ldb_ldif_read_file(struct ldb_context *ldb, FILE *f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read an LDIF message from a string
|
||||||
|
|
||||||
|
This function reads the next LDIF message from the contents of a char
|
||||||
|
array. If you want to get all of the LDIF messages, you will need
|
||||||
|
to repeatedly call this function, until it returns NULL.
|
||||||
|
|
||||||
|
\param ldb the ldb context (from ldb_init())
|
||||||
|
\param s pointer to the char array to read from
|
||||||
|
|
||||||
|
\sa ldb_ldif_read_file for an equivalent function that will read
|
||||||
|
from a file stream.
|
||||||
|
|
||||||
|
\sa ldb_ldif_write for a more general (arbitrary read function)
|
||||||
|
version of this function.
|
||||||
|
*/
|
||||||
struct ldb_ldif *ldb_ldif_read_string(struct ldb_context *ldb, const char **s);
|
struct ldb_ldif *ldb_ldif_read_string(struct ldb_context *ldb, const char **s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Write an LDIF message to a file
|
||||||
|
|
||||||
|
\param ldb the ldb context (from ldb_init())
|
||||||
|
\param f the file stream to write to (typically from fdopen())
|
||||||
|
\param msg the message to write out
|
||||||
|
|
||||||
|
\return the total number of bytes written, or a negative error code
|
||||||
|
|
||||||
|
\sa ldb_ldif_read_file for the reader equivalent to this function.
|
||||||
|
*/
|
||||||
int ldb_ldif_write_file(struct ldb_context *ldb, FILE *f, const struct ldb_ldif *msg);
|
int ldb_ldif_write_file(struct ldb_context *ldb, FILE *f, const struct ldb_ldif *msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Base64 encode a buffer
|
||||||
|
|
||||||
|
\param mem_ctx the memory context that the result is allocated
|
||||||
|
from.
|
||||||
|
\param buf pointer to the array that is to be encoded
|
||||||
|
\param len the number of elements in the array to be encoded
|
||||||
|
|
||||||
|
\return pointer to an array containing the encoded data
|
||||||
|
|
||||||
|
\note The caller is responsible for freeing the result
|
||||||
|
*/
|
||||||
char *ldb_base64_encode(void *mem_ctx, const char *buf, int len);
|
char *ldb_base64_encode(void *mem_ctx, const char *buf, int len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Base64 decode a buffer
|
||||||
|
|
||||||
|
This function decodes a base64 encoded string in place.
|
||||||
|
|
||||||
|
\param s the string to decode.
|
||||||
|
|
||||||
|
\return the length of the returned (decoded) string.
|
||||||
|
|
||||||
|
\note the string is null terminated, but the null terminator is not
|
||||||
|
included in the length.
|
||||||
|
*/
|
||||||
int ldb_base64_decode(char *s);
|
int ldb_base64_decode(char *s);
|
||||||
|
|
||||||
int ldb_attrib_add_handlers(struct ldb_context *ldb,
|
int ldb_attrib_add_handlers(struct ldb_context *ldb,
|
||||||
const struct ldb_attrib_handler *handlers,
|
const struct ldb_attrib_handler *handlers,
|
||||||
unsigned num_handlers);
|
unsigned num_handlers);
|
||||||
@ -486,28 +860,67 @@ struct ldb_dn_component *ldb_dn_get_rdn(void *mem_ctx, const struct ldb_dn *dn);
|
|||||||
|
|
||||||
/* useful functions for ldb_message structure manipulation */
|
/* useful functions for ldb_message structure manipulation */
|
||||||
int ldb_dn_cmp(struct ldb_context *ldb, const char *dn1, const char *dn2);
|
int ldb_dn_cmp(struct ldb_context *ldb, const char *dn1, const char *dn2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compare two attributes
|
||||||
|
|
||||||
|
This function compares to attribute names. Note that this is a
|
||||||
|
case-insensitive comparison.
|
||||||
|
|
||||||
|
\param attr1 the first attribute name to compare
|
||||||
|
\param attr2 the second attribute name to compare
|
||||||
|
|
||||||
|
\return 0 if the attribute names are the same, or only differ in
|
||||||
|
case; non-zero if there are any differences
|
||||||
|
*/
|
||||||
int ldb_attr_cmp(const char *attr1, const char *attr2);
|
int ldb_attr_cmp(const char *attr1, const char *attr2);
|
||||||
int ldb_attr_dn(const char *attr);
|
int ldb_attr_dn(const char *attr);
|
||||||
char *ldb_dn_escape_value(void *mem_ctx, struct ldb_val value);
|
char *ldb_dn_escape_value(void *mem_ctx, struct ldb_val value);
|
||||||
|
|
||||||
/* create an empty message */
|
/**
|
||||||
|
Create an empty message
|
||||||
|
|
||||||
|
\param mem_ctx the memory context to create in. You can pass NULL
|
||||||
|
to get the top level context, however the ldb context (from
|
||||||
|
ldb_init()) may be a better choice
|
||||||
|
*/
|
||||||
struct ldb_message *ldb_msg_new(void *mem_ctx);
|
struct ldb_message *ldb_msg_new(void *mem_ctx);
|
||||||
|
|
||||||
/* find an element within an message */
|
/**
|
||||||
|
Find an element within an message
|
||||||
|
*/
|
||||||
struct ldb_message_element *ldb_msg_find_element(const struct ldb_message *msg,
|
struct ldb_message_element *ldb_msg_find_element(const struct ldb_message *msg,
|
||||||
const char *attr_name);
|
const char *attr_name);
|
||||||
|
|
||||||
/* compare two ldb_val values - return 0 on match */
|
/**
|
||||||
|
Compare two ldb_val values
|
||||||
|
|
||||||
|
\param v1 first ldb_val structure to be tested
|
||||||
|
\param v2 second ldb_val structure to be tested
|
||||||
|
|
||||||
|
\return 1 for a match, 0 if there is any difference
|
||||||
|
*/
|
||||||
int ldb_val_equal_exact(const struct ldb_val *v1, const struct ldb_val *v2);
|
int ldb_val_equal_exact(const struct ldb_val *v1, const struct ldb_val *v2);
|
||||||
|
|
||||||
/* find a value within an ldb_message_element */
|
/**
|
||||||
|
find a value within an ldb_message_element
|
||||||
|
|
||||||
|
\param el the element to search
|
||||||
|
\param val the value to search for
|
||||||
|
|
||||||
|
\note This search is case sensitive
|
||||||
|
*/
|
||||||
struct ldb_val *ldb_msg_find_val(const struct ldb_message_element *el,
|
struct ldb_val *ldb_msg_find_val(const struct ldb_message_element *el,
|
||||||
struct ldb_val *val);
|
struct ldb_val *val);
|
||||||
|
|
||||||
/* add a new empty element to a ldb_message */
|
/**
|
||||||
|
add a new empty element to a ldb_message
|
||||||
|
*/
|
||||||
int ldb_msg_add_empty(struct ldb_message *msg, const char *attr_name, int flags);
|
int ldb_msg_add_empty(struct ldb_message *msg, const char *attr_name, int flags);
|
||||||
|
|
||||||
/* add a element to a ldb_message */
|
/**
|
||||||
|
add a element to a ldb_message
|
||||||
|
*/
|
||||||
int ldb_msg_add(struct ldb_message *msg,
|
int ldb_msg_add(struct ldb_message *msg,
|
||||||
const struct ldb_message_element *el,
|
const struct ldb_message_element *el,
|
||||||
int flags);
|
int flags);
|
||||||
@ -519,13 +932,19 @@ int ldb_msg_add_string(struct ldb_message *msg,
|
|||||||
int ldb_msg_add_fmt(struct ldb_message *msg,
|
int ldb_msg_add_fmt(struct ldb_message *msg,
|
||||||
const char *attr_name, const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
|
const char *attr_name, const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
|
||||||
|
|
||||||
/* compare two message elements - return 0 on match */
|
/**
|
||||||
|
compare two message elements - return 0 on match
|
||||||
|
*/
|
||||||
int ldb_msg_element_compare(struct ldb_message_element *el1,
|
int ldb_msg_element_compare(struct ldb_message_element *el1,
|
||||||
struct ldb_message_element *el2);
|
struct ldb_message_element *el2);
|
||||||
|
|
||||||
/* find elements in a message and convert to a specific type, with
|
/**
|
||||||
|
Find elements in a message.
|
||||||
|
|
||||||
|
This function finds elements and converts to a specific type, with
|
||||||
a give default value if not found. Assumes that elements are
|
a give default value if not found. Assumes that elements are
|
||||||
single valued */
|
single valued.
|
||||||
|
*/
|
||||||
const struct ldb_val *ldb_msg_find_ldb_val(const struct ldb_message *msg, const char *attr_name);
|
const struct ldb_val *ldb_msg_find_ldb_val(const struct ldb_message *msg, const char *attr_name);
|
||||||
int ldb_msg_find_int(const struct ldb_message *msg,
|
int ldb_msg_find_int(const struct ldb_message *msg,
|
||||||
const char *attr_name,
|
const char *attr_name,
|
||||||
@ -561,11 +980,35 @@ struct ldb_message *ldb_msg_diff(struct ldb_context *ldb,
|
|||||||
struct ldb_message *msg1,
|
struct ldb_message *msg1,
|
||||||
struct ldb_message *msg2);
|
struct ldb_message *msg2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Integrity check an ldb_message
|
||||||
|
|
||||||
|
This function performs basic sanity / integrity checks on an
|
||||||
|
ldb_message.
|
||||||
|
|
||||||
|
\param msg the message to check
|
||||||
|
|
||||||
|
\return LDB_SUCCESS if the message is OK, or a non-zero error code
|
||||||
|
(one of LDB_ERR_INVALID_DN_SYNTAX, LDB_ERR_ENTRY_ALREADY_EXISTS or
|
||||||
|
LDB_ERR_INVALID_ATTRIBUTE_SYNTAX) if there is a problem with a
|
||||||
|
message.
|
||||||
|
*/
|
||||||
int ldb_msg_sanity_check(const struct ldb_message *msg);
|
int ldb_msg_sanity_check(const struct ldb_message *msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Duplicate an ldb_val structure
|
||||||
|
|
||||||
|
This function copies an ldb value structure.
|
||||||
|
|
||||||
|
\param mem_ctx the memory context that the duplicated value will be
|
||||||
|
allocated from
|
||||||
|
\param v the ldb_val to be duplicated.
|
||||||
|
|
||||||
|
\return the duplicated ldb_val structure.
|
||||||
|
*/
|
||||||
struct ldb_val ldb_val_dup(void *mem_ctx, const struct ldb_val *v);
|
struct ldb_val ldb_val_dup(void *mem_ctx, const struct ldb_val *v);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
this allows the user to set a debug function for error reporting
|
this allows the user to set a debug function for error reporting
|
||||||
*/
|
*/
|
||||||
int ldb_set_debug(struct ldb_context *ldb,
|
int ldb_set_debug(struct ldb_context *ldb,
|
||||||
@ -573,7 +1016,9 @@ int ldb_set_debug(struct ldb_context *ldb,
|
|||||||
const char *fmt, va_list ap),
|
const char *fmt, va_list ap),
|
||||||
void *context);
|
void *context);
|
||||||
|
|
||||||
/* this sets up debug to print messages on stderr */
|
/**
|
||||||
|
this sets up debug to print messages on stderr
|
||||||
|
*/
|
||||||
int ldb_set_debug_stderr(struct ldb_context *ldb);
|
int ldb_set_debug_stderr(struct ldb_context *ldb);
|
||||||
|
|
||||||
/* control backend specific opaque values */
|
/* control backend specific opaque values */
|
||||||
@ -596,7 +1041,30 @@ int ldb_msg_rename_attr(struct ldb_message *msg, const char *attr, const char *r
|
|||||||
int ldb_msg_copy_attr(struct ldb_message *msg, const char *attr, const char *replace);
|
int ldb_msg_copy_attr(struct ldb_message *msg, const char *attr, const char *replace);
|
||||||
void ldb_msg_remove_attr(struct ldb_message *msg, const char *attr);
|
void ldb_msg_remove_attr(struct ldb_message *msg, const char *attr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Convert a time structure to a string
|
||||||
|
|
||||||
|
This function converts a time_t structure to an LDAP formatted time
|
||||||
|
string.
|
||||||
|
|
||||||
|
\param mem_ctx the memory context to allocate the return string in
|
||||||
|
\param t the time structure to convert
|
||||||
|
|
||||||
|
\return the formatted string, or NULL if the time structure could
|
||||||
|
not be converted
|
||||||
|
*/
|
||||||
char *ldb_timestring(void *mem_ctx, time_t t);
|
char *ldb_timestring(void *mem_ctx, time_t t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Convert a string to a time structure
|
||||||
|
|
||||||
|
This function converts an LDAP formatted time string to a time_t
|
||||||
|
structure.
|
||||||
|
|
||||||
|
\param s the string to convert
|
||||||
|
|
||||||
|
\return the time structure, or 0 if the string cannot be converted
|
||||||
|
*/
|
||||||
time_t ldb_string_to_time(const char *s);
|
time_t ldb_string_to_time(const char *s);
|
||||||
|
|
||||||
char *ldb_dn_canonical_string(void *mem_ctx, const struct ldb_dn *dn);
|
char *ldb_dn_canonical_string(void *mem_ctx, const struct ldb_dn *dn);
|
||||||
|
@ -33,59 +33,279 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LDB_ERRORS_H_
|
#ifndef _LDB_ERRORS_H_
|
||||||
#define _LDB_ERRORS_H_ 1
|
|
||||||
|
|
||||||
/*
|
/*! \cond DOXYGEN_IGNORE */
|
||||||
* Not all error codes make sense for ldb,
|
#define _LDB_ERRORS_H_ 1
|
||||||
* but they are keept here for reference anyway
|
/*! \endcond */
|
||||||
|
|
||||||
|
/**
|
||||||
|
\file ldb_errors.h
|
||||||
|
|
||||||
|
This header provides a set of result codes for LDB function calls.
|
||||||
|
|
||||||
|
Many LDB function calls return an integer value (int). As shown in
|
||||||
|
the function documentation, those return values may indicate
|
||||||
|
whether the function call worked correctly (in which case it
|
||||||
|
returns LDB_SUCCESS) or some problem occurred (in which case some
|
||||||
|
other value will be returned). As a special case,
|
||||||
|
LDB_ERR_COMPARE_FALSE or LDB_ERR_COMPARE_TRUE may be returned,
|
||||||
|
which does not indicate an error.
|
||||||
|
|
||||||
|
\note Not all error codes make sense for LDB, however they are
|
||||||
|
based on the LDAP error codes, and are kept for reference and to
|
||||||
|
avoid overlap.
|
||||||
|
|
||||||
|
\note Some of this documentation is based on information in
|
||||||
|
the OpenLDAP documentation, as developed and maintained by the
|
||||||
|
<a href="http://www.openldap.org/">The OpenLDAP Project</a>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function call succeeded.
|
||||||
|
|
||||||
|
If a function returns LDB_SUCCESS, then that function, and the
|
||||||
|
underlying transactions that may have been required, completed
|
||||||
|
successfully.
|
||||||
|
*/
|
||||||
#define LDB_SUCCESS 0
|
#define LDB_SUCCESS 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function call failed for some non-specific reason.
|
||||||
|
*/
|
||||||
#define LDB_ERR_OPERATIONS_ERROR 1
|
#define LDB_ERR_OPERATIONS_ERROR 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function call failed because of a protocol violation.
|
||||||
|
*/
|
||||||
#define LDB_ERR_PROTOCOL_ERROR 2
|
#define LDB_ERR_PROTOCOL_ERROR 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function call failed because a time limit was exceeded.
|
||||||
|
*/
|
||||||
#define LDB_ERR_TIME_LIMIT_EXCEEDED 3
|
#define LDB_ERR_TIME_LIMIT_EXCEEDED 3
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function call failed because a size limit was exceeded.
|
||||||
|
*/
|
||||||
#define LDB_ERR_SIZE_LIMIT_EXCEEDED 4
|
#define LDB_ERR_SIZE_LIMIT_EXCEEDED 4
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function was for value comparison, and the comparison operation
|
||||||
|
returned false.
|
||||||
|
|
||||||
|
\note This is a status value, and doesn't normally indicate an
|
||||||
|
error.
|
||||||
|
*/
|
||||||
#define LDB_ERR_COMPARE_FALSE 5
|
#define LDB_ERR_COMPARE_FALSE 5
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function was for value comparison, and the comparison operation
|
||||||
|
returned true.
|
||||||
|
|
||||||
|
\note This is a status value, and doesn't normally indicate an
|
||||||
|
error.
|
||||||
|
*/
|
||||||
#define LDB_ERR_COMPARE_TRUE 6
|
#define LDB_ERR_COMPARE_TRUE 6
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function used an authentication method that is not supported by
|
||||||
|
the database.
|
||||||
|
*/
|
||||||
#define LDB_ERR_AUTH_METHOD_NOT_SUPPORTED 7
|
#define LDB_ERR_AUTH_METHOD_NOT_SUPPORTED 7
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function call required a underlying operation that required
|
||||||
|
strong authentication.
|
||||||
|
|
||||||
|
This will normally only occur if you are using LDB with a LDAP
|
||||||
|
backend.
|
||||||
|
*/
|
||||||
#define LDB_ERR_STRONG_AUTH_REQUIRED 8
|
#define LDB_ERR_STRONG_AUTH_REQUIRED 8
|
||||||
/* 9 RESERVED */
|
/* 9 RESERVED */
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function resulted in a referral to another server.
|
||||||
|
*/
|
||||||
#define LDB_ERR_REFERRAL 10
|
#define LDB_ERR_REFERRAL 10
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed because an administrative / policy limit was
|
||||||
|
exceeded.
|
||||||
|
*/
|
||||||
#define LDB_ERR_ADMIN_LIMIT_EXCEEDED 11
|
#define LDB_ERR_ADMIN_LIMIT_EXCEEDED 11
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required an extension or capability that the
|
||||||
|
database cannot provide.
|
||||||
|
*/
|
||||||
#define LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION 12
|
#define LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION 12
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function involved a transaction or database operation that
|
||||||
|
could not be performed without a secure link.
|
||||||
|
*/
|
||||||
#define LDB_ERR_CONFIDENTIALITY_REQUIRED 13
|
#define LDB_ERR_CONFIDENTIALITY_REQUIRED 13
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is an intermediate result code for SASL bind operations that
|
||||||
|
have more than one step.
|
||||||
|
|
||||||
|
\note This is a result code that does not normally indicate an
|
||||||
|
error has occurred.
|
||||||
|
*/
|
||||||
#define LDB_ERR_SASL_BIND_IN_PROGRESS 14
|
#define LDB_ERR_SASL_BIND_IN_PROGRESS 14
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function referred to an attribute type that is not present in
|
||||||
|
the entry.
|
||||||
|
*/
|
||||||
#define LDB_ERR_NO_SUCH_ATTRIBUTE 16
|
#define LDB_ERR_NO_SUCH_ATTRIBUTE 16
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function referred to an attribute type that is invalid
|
||||||
|
*/
|
||||||
#define LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE 17
|
#define LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE 17
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required a filter type that is not available for the
|
||||||
|
specified attribute.
|
||||||
|
*/
|
||||||
#define LDB_ERR_INAPPROPRIATE_MATCHING 18
|
#define LDB_ERR_INAPPROPRIATE_MATCHING 18
|
||||||
#define LDB_ERR_CONSTRAINT_VIOLAION 19
|
|
||||||
|
/**
|
||||||
|
The function would have violated an attribute constraint.
|
||||||
|
*/
|
||||||
|
#define LDB_ERR_CONSTRAINT_VIOLATION 19
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function involved an attribute type or attribute value that
|
||||||
|
already exists in the entry.
|
||||||
|
*/
|
||||||
#define LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS 20
|
#define LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS 20
|
||||||
|
/**
|
||||||
|
The function used an invalid (incorrect syntax) attribute value.
|
||||||
|
*/
|
||||||
#define LDB_ERR_INVALID_ATTRIBUTE_SYNTAX 21
|
#define LDB_ERR_INVALID_ATTRIBUTE_SYNTAX 21
|
||||||
|
|
||||||
/* 22-31 unused */
|
/* 22-31 unused */
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function referred to an object that does not exist in the
|
||||||
|
database.
|
||||||
|
*/
|
||||||
#define LDB_ERR_NO_SUCH_OBJECT 32
|
#define LDB_ERR_NO_SUCH_OBJECT 32
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function referred to an alias which points to a non-existant
|
||||||
|
object in the database.
|
||||||
|
*/
|
||||||
#define LDB_ERR_ALIAS_PROBLEM 33
|
#define LDB_ERR_ALIAS_PROBLEM 33
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function used a DN which was invalid (incorrect syntax).
|
||||||
|
*/
|
||||||
#define LDB_ERR_INVALID_DN_SYNTAX 34
|
#define LDB_ERR_INVALID_DN_SYNTAX 34
|
||||||
|
|
||||||
/* 53 RESERVED */
|
/* 53 RESERVED */
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required dereferencing of an alias, and something went
|
||||||
|
wrong during the dereferencing process.
|
||||||
|
*/
|
||||||
#define LDB_ERR_ALIAS_DEREFERENCING_PROBLEM 36
|
#define LDB_ERR_ALIAS_DEREFERENCING_PROBLEM 36
|
||||||
|
|
||||||
/* 37-47 unused */
|
/* 37-47 unused */
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function passed in the wrong authentication method.
|
||||||
|
*/
|
||||||
#define LDB_ERR_INAPPROPRIATE_AUTHENTICATION 48
|
#define LDB_ERR_INAPPROPRIATE_AUTHENTICATION 48
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function passed in or referenced incorrect credentials during
|
||||||
|
authentication.
|
||||||
|
*/
|
||||||
#define LDB_ERR_INVALID_CREDENTIALS 49
|
#define LDB_ERR_INVALID_CREDENTIALS 49
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required access permissions that the user does not
|
||||||
|
possess.
|
||||||
|
*/
|
||||||
#define LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS 50
|
#define LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS 50
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required a transaction or call that the database could
|
||||||
|
not perform because it is busy.
|
||||||
|
*/
|
||||||
#define LDB_ERR_BUSY 51
|
#define LDB_ERR_BUSY 51
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required a transaction or call to a database that is
|
||||||
|
not available.
|
||||||
|
*/
|
||||||
#define LDB_ERR_UNAVAILABLE 52
|
#define LDB_ERR_UNAVAILABLE 52
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required a transaction or call to a database that the
|
||||||
|
database declined to perform.
|
||||||
|
*/
|
||||||
#define LDB_ERR_UNWILLING_TO_PERFORM 53
|
#define LDB_ERR_UNWILLING_TO_PERFORM 53
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed because it resulted in a loop being detected.
|
||||||
|
*/
|
||||||
#define LDB_ERR_LOOP_DETECT 54
|
#define LDB_ERR_LOOP_DETECT 54
|
||||||
|
|
||||||
/* 55-63 unused */
|
/* 55-63 unused */
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed because it would have violated a naming rule.
|
||||||
|
*/
|
||||||
#define LDB_ERR_NAMING_VIOLATION 64
|
#define LDB_ERR_NAMING_VIOLATION 64
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed because it would have violated the schema.
|
||||||
|
*/
|
||||||
#define LDB_ERR_OBJECT_CLASS_VIOLATION 65
|
#define LDB_ERR_OBJECT_CLASS_VIOLATION 65
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required an operation that is only allowed on leaf
|
||||||
|
objects, but the object is not a leaf.
|
||||||
|
*/
|
||||||
#define LDB_ERR_NOT_ALLOWED_ON_NON_LEAF 66
|
#define LDB_ERR_NOT_ALLOWED_ON_NON_LEAF 66
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function required an operation that cannot be performed on a
|
||||||
|
Relative DN, but the object is a Relative DN.
|
||||||
|
*/
|
||||||
#define LDB_ERR_NOT_ALLOWED_ON_RDN 67
|
#define LDB_ERR_NOT_ALLOWED_ON_RDN 67
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed because the entry already exists.
|
||||||
|
*/
|
||||||
#define LDB_ERR_ENTRY_ALREADY_EXISTS 68
|
#define LDB_ERR_ENTRY_ALREADY_EXISTS 68
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed because modifications to an object class are
|
||||||
|
not allowable.
|
||||||
|
*/
|
||||||
#define LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED 69
|
#define LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED 69
|
||||||
|
|
||||||
/* 70 RESERVED FOR CLDAP */
|
/* 70 RESERVED FOR CLDAP */
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed because it needed to be applied to multiple
|
||||||
|
databases.
|
||||||
|
*/
|
||||||
#define LDB_ERR_AFFECTS_MULTIPLE_DSAS 71
|
#define LDB_ERR_AFFECTS_MULTIPLE_DSAS 71
|
||||||
|
|
||||||
/* 72-79 unused */
|
/* 72-79 unused */
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function failed for unknown reasons.
|
||||||
|
*/
|
||||||
#define LDB_ERR_OTHER 80
|
#define LDB_ERR_OTHER 80
|
||||||
|
|
||||||
/* 81-90 RESERVED for APIs */
|
/* 81-90 RESERVED for APIs */
|
||||||
|
|
||||||
#endif /* _LDB_ERRORS_H_ */
|
#endif /* _LDB_ERRORS_H_ */
|
||||||
|
80
source4/lib/ldb/mainpage.dox
Normal file
80
source4/lib/ldb/mainpage.dox
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
\mainpage ldb
|
||||||
|
|
||||||
|
\section Overview
|
||||||
|
|
||||||
|
ldb is a LDAP-like embedded database. It is not at all LDAP standards
|
||||||
|
compliant, so if you want a standards compliant database then please
|
||||||
|
see the excellent <a href="http://www.openldap.org/">OpenLDAP</a>
|
||||||
|
project.<p>
|
||||||
|
|
||||||
|
What ldb does is provide a fast database with an LDAP-like API
|
||||||
|
designed to be used within an application. In some ways it can be seen
|
||||||
|
as a intermediate solution between key-value pair databases and a real
|
||||||
|
LDAP database.<p>
|
||||||
|
|
||||||
|
ldb is the database engine used in Samba4.
|
||||||
|
|
||||||
|
\section Features
|
||||||
|
|
||||||
|
The main features that separate ldb from other solutions are:
|
||||||
|
- Safe multi-reader, multi-writer, using byte range locking
|
||||||
|
- LDAP-like API
|
||||||
|
- fast operation
|
||||||
|
- choice of local tdb, local sqlite3 or remote LDAP backends
|
||||||
|
- integration with <a href="http://talloc.samba.org">talloc</a>
|
||||||
|
- schema-less operation, for trivial setup
|
||||||
|
- modules for extensions (such as schema support)
|
||||||
|
- easy setup of indexes and attribute properties
|
||||||
|
- ldbedit tool for database editing (reminiscent of 'vipw')
|
||||||
|
- ldif for import/export
|
||||||
|
|
||||||
|
\section Documentation
|
||||||
|
|
||||||
|
ldb has limited programmer and administrator documentation:
|
||||||
|
- a list of <a href="globals_func.html">functions</a>
|
||||||
|
- a list of <a href="examples.html">examples</a>
|
||||||
|
- a list of <a href="annotated.html">data structures</a>
|
||||||
|
- a list of <a href="globals_defs.html">constants</a>
|
||||||
|
|
||||||
|
If you need more information than is presented in this document, you
|
||||||
|
may wish to look at the source code, especially the source code in the
|
||||||
|
<a href="http://samba.org/ftp/unpacked/samba4/source/lib/ldb/tools/">tools directory</a>.
|
||||||
|
|
||||||
|
ldb makes use of the LDAP Data Interchange Format (LDIF), which is
|
||||||
|
documented in <a href="http://www.ietf.org/rfc/rfc2849.txt">RFC
|
||||||
|
2849</a>.
|
||||||
|
|
||||||
|
\section Support
|
||||||
|
|
||||||
|
ldb does not currently have its own mailing list or bug tracking
|
||||||
|
system. For now, please use the <a
|
||||||
|
href="https://lists.samba.org/mailman/listinfo/samba-technical">samba-technical</a>
|
||||||
|
mailing list, and the <a href="http://bugzilla.samba.org/">Samba
|
||||||
|
bugzilla</a> bug tracking system.
|
||||||
|
|
||||||
|
\section Download
|
||||||
|
|
||||||
|
You can download the latest release either via rsync or anonymous
|
||||||
|
svn. To fetch via svn use the following commands:
|
||||||
|
|
||||||
|
\verbatim
|
||||||
|
svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/ldb ldb
|
||||||
|
svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/tdb tdb
|
||||||
|
svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/talloc talloc
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
To fetch via rsync use these commands:
|
||||||
|
|
||||||
|
\verbatim
|
||||||
|
rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/ldb .
|
||||||
|
rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/tdb .
|
||||||
|
rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/talloc .
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\section Credits
|
||||||
|
|
||||||
|
ldb is another product of the prolific <a href="http://samba.org/~tridge/">Andrew Tridgell</a>.
|
||||||
|
|
||||||
|
*/
|
Reference in New Issue
Block a user