2002-06-13 11:59:10 +08:00
|
|
|
.TH LBER_DECODE 3 "RELEASEDATE" "OpenLDAP LDVERSION"
|
1999-09-12 12:41:47 +08:00
|
|
|
.\" $OpenLDAP$
|
2003-01-04 04:20:47 +08:00
|
|
|
.\" Copyright 1998-2003 The OpenLDAP Foundation All Rights Reserved.
|
1999-09-12 12:41:47 +08:00
|
|
|
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
1998-08-09 08:43:13 +08:00
|
|
|
.SH NAME
|
2002-01-20 09:10:51 +08:00
|
|
|
ber_get_next, ber_skip_tag, ber_peek_tag, ber_scanf, ber_get_int,
|
|
|
|
ber_get_enum, ber_get_stringb, ber_get_stringa, ber_get_stringal,
|
|
|
|
ber_get_stringbv, ber_get_null, ber_get_boolean, ber_get_bitstring,
|
|
|
|
ber_first_element, ber_next_element
|
|
|
|
\- LBER simplified Basic Encoding Rules library routines for decoding
|
2002-06-21 15:32:54 +08:00
|
|
|
.SH LIBRARY
|
2002-06-22 05:25:38 +08:00
|
|
|
OpenLDAP LBER (liblber, -llber)
|
1998-08-09 08:43:13 +08:00
|
|
|
.SH SYNOPSIS
|
2002-01-20 09:10:51 +08:00
|
|
|
.B #include <lber.h>
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_next(Sockbuf *" sb ", ber_len_t *" len ", BerElement *" ber ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_skip_tag(BerElement *" ber ", ber_len_t *" len ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_peek_tag(BerElement *" ber ", ber_len_t *" len ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_scanf(BerElement *" ber ", const char *" fmt ", ...);"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_int(BerElement *" ber ", ber_int_t *" num ");"
|
2000-05-14 07:08:25 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_enum(BerElement *" ber ", ber_int_t *" num ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_stringb(BerElement *" ber ", char *" buf ", ber_len_t *" len ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_stringa(BerElement *" ber ", char **" buf ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_stringal(BerElement *" ber ", struct berval **" bv ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_stringbv(BerElement *" ber ", struct berval *" bv ", int " alloc ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_null(BerElement *" ber ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_boolean(BerElement *" ber ", ber_int_t *" bool ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_get_bitstringa(BerElement *" ber ", char **" buf ", ber_len_t *" blen ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
.BI "ber_tag_t ber_first_element(BerElement *" ber ", ber_len_t *" len ", char **" cookie ");"
|
|
|
|
.LP
|
|
|
|
.BI "ber_tag_t ber_next_element(BerElement *" ber ", ber_len_t *" len ", const char *" cookie ");"
|
1998-08-09 08:43:13 +08:00
|
|
|
.SH DESCRIPTION
|
|
|
|
.LP
|
|
|
|
These routines provide a subroutine interface to a simplified
|
|
|
|
implementation of the Basic Encoding Rules of ASN.1. The version
|
|
|
|
of BER these routines support is the one defined for the LDAP
|
|
|
|
protocol. The encoding rules are the same as BER, except that
|
|
|
|
only definite form lengths are used, and bitstrings and octet strings
|
2002-01-20 09:10:51 +08:00
|
|
|
are always encoded in primitive form. This man page
|
|
|
|
describes the decoding routines in the lber library. See
|
|
|
|
.BR lber-encode (3)
|
1998-08-09 08:43:13 +08:00
|
|
|
for details on the corresponding encoding routines.
|
2002-01-20 09:10:51 +08:00
|
|
|
Consult
|
|
|
|
.BR lber-types (3)
|
|
|
|
for information about types, allocators, and deallocators.
|
|
|
|
.LP
|
|
|
|
Normally, the only routines that need to be called by an application
|
|
|
|
are
|
|
|
|
.BR ber_get_next ()
|
|
|
|
to get the next BER element and
|
|
|
|
.BR ber_scanf ()
|
|
|
|
to do the actual decoding. In some cases,
|
|
|
|
.BR ber_peek_tag ()
|
|
|
|
may also need to be called in normal usage. The other routines are
|
|
|
|
provided for those applications that need more control than
|
|
|
|
.BR ber_scanf ()
|
|
|
|
provides. In
|
1998-08-09 08:43:13 +08:00
|
|
|
general, these routines return the tag of the element decoded, or
|
2002-01-20 09:10:51 +08:00
|
|
|
LBER_ERROR if an error occurred.
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR ber_get_next ()
|
|
|
|
routine is used to read the next BER element from the given Sockbuf,
|
|
|
|
\fIsb\fP. It strips off and returns the leading tag, strips off and
|
|
|
|
returns the length of the entire element in \fIlen\fP, and sets up
|
|
|
|
\fIber\fP for subsequent calls to
|
|
|
|
.BR ber_scanf ()
|
2002-01-25 20:34:57 +08:00
|
|
|
et al to decode the element. See
|
|
|
|
.BR lber-sockbuf (3)
|
|
|
|
for details of the Sockbuf implementation of the \fIsb\fP parameter.
|
2002-01-20 09:10:51 +08:00
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR ber_scanf ()
|
|
|
|
routine is used to decode a BER element in much the same way that
|
|
|
|
.BR scanf (3)
|
|
|
|
works. It reads from \fIber\fP, a pointer to a BerElement
|
|
|
|
such as returned by
|
|
|
|
.BR ber_get_next (),
|
|
|
|
interprets the bytes according to the format string \fIfmt\fP, and stores the
|
1998-08-09 08:43:13 +08:00
|
|
|
results in its additional arguments. The format string contains
|
|
|
|
conversion specifications which are used to direct the interpretation
|
|
|
|
of the BER element. The format string can contain the following
|
|
|
|
characters.
|
|
|
|
.RS
|
|
|
|
.LP
|
|
|
|
.TP 3
|
2002-01-20 09:10:51 +08:00
|
|
|
.B a
|
1998-08-09 08:43:13 +08:00
|
|
|
Octet string. A char ** should be supplied. Memory is allocated,
|
|
|
|
filled with the contents of the octet string, null-terminated, and
|
2002-01-20 09:10:51 +08:00
|
|
|
returned in the parameter. The caller should free the returned
|
|
|
|
string using
|
|
|
|
.BR ber_memfree ().
|
|
|
|
.TP
|
|
|
|
.B s
|
|
|
|
Octet string. A char * buffer should be supplied, followed by a pointer to a
|
|
|
|
ber_len_t initialized to the size of the buffer. Upon return, the
|
|
|
|
null-terminated octet string is put into the buffer, and the
|
|
|
|
ber_len_t is set to the actual size of the octet string.
|
1998-08-09 08:43:13 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B O
|
|
|
|
Octet string. A struct ber_val ** should be supplied, which upon
|
|
|
|
return points to a dynamically allocated struct berval
|
|
|
|
containing the octet string and its length.
|
|
|
|
The caller should free the returned structure using
|
|
|
|
.BR ber_bvfree ().
|
1998-08-09 08:43:13 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B o
|
|
|
|
Octet string. A struct ber_val * should be supplied, which upon
|
|
|
|
return contains the dynamically allocated
|
|
|
|
octet string and its length. The caller should free the returned octet
|
|
|
|
string using
|
|
|
|
.BR ber_memfree ().
|
2000-05-14 07:08:25 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B m
|
2000-05-14 07:08:25 +08:00
|
|
|
Octet string. A struct ber_val * should be supplied, which upon return
|
2002-01-20 09:10:51 +08:00
|
|
|
contains the octet string and its length. The string resides in memory
|
|
|
|
assigned to the BerElement, and must not be freed by the caller.
|
1998-08-09 08:43:13 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B b
|
2000-05-13 09:44:58 +08:00
|
|
|
Boolean. A pointer to a ber_int_t should be supplied.
|
1998-08-09 08:43:13 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B e
|
2000-05-14 07:08:25 +08:00
|
|
|
Enumeration. A pointer to a ber_int_t should be supplied.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B i
|
2000-05-13 09:44:58 +08:00
|
|
|
Integer. A pointer to a ber_int_t should be supplied.
|
1998-08-09 08:43:13 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B B
|
1998-12-23 03:08:27 +08:00
|
|
|
Bitstring. A char ** should be supplied which will point to the
|
|
|
|
dynamically allocated
|
2002-01-20 09:10:51 +08:00
|
|
|
bits, followed by a ber_len_t *, which will point to the length
|
1998-08-09 08:43:13 +08:00
|
|
|
(in bits) of the bitstring returned.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B n
|
1998-08-09 08:43:13 +08:00
|
|
|
Null. No parameter is required. The element is simply skipped if
|
|
|
|
it is recognized.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B v
|
1998-08-09 08:43:13 +08:00
|
|
|
Sequence of octet strings. A char *** should be supplied, which upon
|
1998-12-23 03:08:27 +08:00
|
|
|
return points to a dynamically allocated null-terminated array of char *'s
|
1998-08-09 08:43:13 +08:00
|
|
|
containing the octet strings. NULL is returned if the sequence is empty.
|
2000-05-14 07:08:25 +08:00
|
|
|
The caller should free the returned array and octet strings using
|
2002-01-20 09:10:51 +08:00
|
|
|
.BR ber_memvfree ().
|
1998-08-09 08:43:13 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B V
|
1998-08-09 08:43:13 +08:00
|
|
|
Sequence of octet strings with lengths.
|
|
|
|
A struct berval *** should be supplied, which upon
|
1998-12-23 03:08:27 +08:00
|
|
|
return points to a dynamically allocated null-terminated array of
|
|
|
|
struct berval *'s
|
1998-08-09 08:43:13 +08:00
|
|
|
containing the octet strings and their lengths.
|
2000-05-13 09:44:58 +08:00
|
|
|
NULL is returned if the sequence is empty.
|
2002-01-20 09:10:51 +08:00
|
|
|
The caller should free the returned structures using
|
|
|
|
.BR ber_bvecfree ().
|
|
|
|
.TP
|
|
|
|
.B W
|
|
|
|
Sequence of octet strings with lengths.
|
|
|
|
A BerVarray * should be supplied, which upon
|
|
|
|
return points to a dynamically allocated array of
|
|
|
|
struct berval's
|
|
|
|
containing the octet strings and their lengths. The array is terminated
|
|
|
|
by a struct berval with a NULL bv_val string pointer.
|
|
|
|
NULL is returned if the sequence is empty.
|
|
|
|
The caller should free the returned structures using
|
|
|
|
.BR ber_bvarray_free ().
|
|
|
|
.TP
|
|
|
|
.B M
|
|
|
|
Sequence of octet strings with lengths. This is a generalized form
|
|
|
|
of the previous three formats.
|
|
|
|
A void ** (ptr) should be supplied, followed by a ber_len_t * (len)
|
|
|
|
and a ber_len_t (off).
|
|
|
|
Upon return (ptr) will point to a dynamically allocated array
|
|
|
|
whose elements are all of size (*len). A struct berval will be filled
|
|
|
|
starting at offset (off) in each element. The strings in each struct
|
|
|
|
berval reside in memory assigned to the BerElement and must not be
|
|
|
|
freed by the caller. The array is terminated by a struct berval
|
|
|
|
with a NULL bv_val string pointer. NULL is returned if the sequence
|
|
|
|
is empty. The number of elements in the array is also stored
|
|
|
|
in (*len) on return. The caller should free the returned array using
|
|
|
|
.BR ber_memfree ().
|
2000-05-14 07:08:25 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B l
|
2000-05-14 07:08:25 +08:00
|
|
|
Length of the next element. A pointer to a ber_len_t should be supplied.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B t
|
2000-05-14 07:08:25 +08:00
|
|
|
Tag of the next element. A pointer to a ber_tag_t should be supplied.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B T
|
2000-05-14 07:08:25 +08:00
|
|
|
Skip element and return its tag. A pointer to a ber_tag_t should be supplied.
|
1998-08-09 08:43:13 +08:00
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B x
|
1998-08-09 08:43:13 +08:00
|
|
|
Skip element. The next element is skipped.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B {
|
1998-08-09 08:43:13 +08:00
|
|
|
Begin sequence. No parameter is required. The initial sequence tag
|
|
|
|
and length are skipped.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B }
|
1998-08-09 08:43:13 +08:00
|
|
|
End sequence. No parameter is required and no action is taken.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B [
|
1998-08-09 08:43:13 +08:00
|
|
|
Begin set. No parameter is required. The initial set tag
|
|
|
|
and length are skipped.
|
|
|
|
.TP
|
2002-01-20 09:10:51 +08:00
|
|
|
.B ]
|
1998-08-09 08:43:13 +08:00
|
|
|
End set. No parameter is required and no action is taken.
|
|
|
|
.RE
|
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
The
|
|
|
|
.BR ber_get_int ()
|
|
|
|
routine tries to interpret the next element as an integer,
|
1998-08-09 08:43:13 +08:00
|
|
|
returning the result in \fInum\fP. The tag of whatever it finds is returned
|
2000-05-13 09:44:58 +08:00
|
|
|
on success, LBER_ERROR (\-1) on failure.
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
The
|
|
|
|
.BR ber_get_stringb ()
|
|
|
|
routine is used to read an octet string into a
|
1998-08-09 08:43:13 +08:00
|
|
|
preallocated buffer. The \fIlen\fP parameter should be initialized to
|
|
|
|
the size of the buffer, and will contain the length of the octet string
|
|
|
|
read upon return. The buffer should be big enough to take the octet
|
|
|
|
string value plus a terminating NULL byte.
|
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
The
|
|
|
|
.BR ber_get_stringa ()
|
|
|
|
routine is used to dynamically allocate space into
|
2000-05-13 09:44:58 +08:00
|
|
|
which an octet string is read.
|
2002-01-20 09:10:51 +08:00
|
|
|
The caller should free the returned string using
|
|
|
|
.BR ber_memfree().
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
The
|
|
|
|
.BR ber_get_stringal ()
|
|
|
|
routine is used to dynamically allocate space
|
1998-12-23 03:08:27 +08:00
|
|
|
into which an octet string and its length are read. It takes a
|
|
|
|
struct berval **, and returns the result in this parameter.
|
2002-01-20 09:10:51 +08:00
|
|
|
The caller should free the returned structure using
|
|
|
|
.BR ber_bvfree().
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR ber_get_stringbv ()
|
|
|
|
routine is used to read an octet string and its length into the
|
|
|
|
provided struct berval *. If the \fIalloc\fP parameter is zero, the string
|
|
|
|
will reside in memory assigned to the BerElement, and must not be freed
|
|
|
|
by the caller. If the \fIalloc\fP parameter is non-zero, the string will be
|
|
|
|
copied into dynamically allocated space which should be returned using
|
|
|
|
.BR ber_memfree ().
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR ber_get_null ()
|
|
|
|
routine is used to read a NULL element. It returns
|
1998-08-09 08:43:13 +08:00
|
|
|
the tag of the element it skips over.
|
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
The
|
|
|
|
.BR ber_get_boolean ()
|
|
|
|
routine is used to read a boolean value. It is called the same way that
|
|
|
|
.BR ber_get_int ()
|
|
|
|
is called.
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR ber_get_enum ()
|
|
|
|
routine is used to read a enumeration value. It is called the same way that
|
|
|
|
.BR ber_get_int ()
|
|
|
|
is called.
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR ber_get_bitstringa ()
|
|
|
|
routine is used to read a bitstring value. It
|
1998-12-23 03:08:27 +08:00
|
|
|
takes a char ** which will hold the dynamically allocated bits, followed by an
|
2000-05-14 07:08:25 +08:00
|
|
|
ber_len_t *, which will point to the length (in bits) of the bitstring returned.
|
2002-01-20 09:10:51 +08:00
|
|
|
The caller should free the returned string using
|
|
|
|
.BR ber_memfree ().
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
The
|
|
|
|
.BR ber_first_element ()
|
|
|
|
routine is used to return the tag and length
|
1998-08-09 08:43:13 +08:00
|
|
|
of the first element in a set or sequence. It also returns in \fIcookie\fP
|
|
|
|
a magic cookie parameter that should be passed to subsequent calls to
|
|
|
|
ber_next_element(), which returns similar information.
|
|
|
|
.SH EXAMPLES
|
|
|
|
Assume the variable \fIber\fP contains a lightweight BER encoding of
|
|
|
|
the following ASN.1 object:
|
|
|
|
.LP
|
|
|
|
.nf
|
|
|
|
AlmostASearchRequest := SEQUENCE {
|
|
|
|
baseObject DistinguishedName,
|
|
|
|
scope ENUMERATED {
|
|
|
|
baseObject (0),
|
|
|
|
singleLevel (1),
|
|
|
|
wholeSubtree (2)
|
|
|
|
},
|
|
|
|
derefAliases ENUMERATED {
|
|
|
|
neverDerefaliases (0),
|
|
|
|
derefInSearching (1),
|
|
|
|
derefFindingBaseObj (2),
|
|
|
|
alwaysDerefAliases (3)
|
|
|
|
},
|
|
|
|
sizelimit INTEGER (0 .. 65535),
|
|
|
|
timelimit INTEGER (0 .. 65535),
|
|
|
|
attrsOnly BOOLEAN,
|
|
|
|
attributes SEQUENCE OF AttributeType
|
|
|
|
}
|
|
|
|
.fi
|
|
|
|
.LP
|
2002-01-20 09:10:51 +08:00
|
|
|
The element can be decoded using
|
|
|
|
.BR ber_scanf ()
|
|
|
|
as follows.
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
|
|
|
.nf
|
2000-05-14 07:08:25 +08:00
|
|
|
ber_int_t scope, deref, size, time, attrsonly;
|
1998-08-09 08:43:13 +08:00
|
|
|
char *dn, **attrs;
|
2000-05-13 09:44:58 +08:00
|
|
|
ber_tag_t tag;
|
|
|
|
|
2000-05-14 07:08:25 +08:00
|
|
|
tag = ber_scanf( ber, "{aeeiib{v}}",
|
|
|
|
&dn, &scope, &deref,
|
2000-05-13 09:44:58 +08:00
|
|
|
&size, &time, &attrsonly, &attrs );
|
1998-08-09 08:43:13 +08:00
|
|
|
|
2000-05-13 09:44:58 +08:00
|
|
|
if( tag == LBER_ERROR ) {
|
1998-08-09 08:43:13 +08:00
|
|
|
/* error */
|
2000-05-13 09:44:58 +08:00
|
|
|
} else {
|
1998-08-09 08:43:13 +08:00
|
|
|
/* success */
|
2000-05-13 09:44:58 +08:00
|
|
|
}
|
2000-05-14 07:08:25 +08:00
|
|
|
|
|
|
|
ber_memfree( dn );
|
|
|
|
ber_memvfree( attrs );
|
1998-08-09 08:43:13 +08:00
|
|
|
.fi
|
|
|
|
.SH ERRORS
|
2000-05-13 09:44:58 +08:00
|
|
|
If an error occurs during decoding, generally these routines return
|
2003-01-19 21:10:17 +08:00
|
|
|
LBER_ERROR ((ber_tag_t)\-1).
|
1998-08-09 08:43:13 +08:00
|
|
|
.LP
|
|
|
|
.SH NOTES
|
|
|
|
.LP
|
|
|
|
The return values for all of these functions are declared in the
|
2002-01-20 09:10:51 +08:00
|
|
|
.B <lber.h>
|
|
|
|
header file. Some routines may dynamically allocate memory
|
1998-12-23 03:08:27 +08:00
|
|
|
which must be freed by the caller using supplied deallocation routines.
|
1998-08-09 08:43:13 +08:00
|
|
|
.SH SEE ALSO
|
2002-05-09 10:07:41 +08:00
|
|
|
.BR lber-encode (3),
|
|
|
|
.BR lber-memory (3),
|
|
|
|
.BR lber-sockbuf (3),
|
2000-05-13 09:44:58 +08:00
|
|
|
.BR lber-types (3)
|
1998-10-25 09:41:42 +08:00
|
|
|
.SH ACKNOWLEDGEMENTS
|
|
|
|
.B OpenLDAP
|
|
|
|
is developed and maintained by The OpenLDAP Project (http://www.openldap.org/).
|
|
|
|
.B OpenLDAP
|
|
|
|
is derived from University of Michigan LDAP 3.3 Release.
|