2 Unix SMB/CIFS mplementation.
4 ildap api - an api similar to the traditional ldap api
6 Copyright (C) Andrew Tridgell 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "libcli/ldap/ldap.h"
25 #include "libcli/ldap/ldap_client.h"
29 count the returned search entries
31 _PUBLIC_
int ildap_count_entries(struct ldap_connection
*conn
, struct ldap_message
**res
)
34 for (i
=0;res
&& res
[i
];i
++) /* noop */ ;
40 perform a synchronous ldap search
42 _PUBLIC_ NTSTATUS
ildap_search_bytree(struct ldap_connection
*conn
, const char *basedn
,
43 int scope
, struct ldb_parse_tree
*tree
,
44 const char * const *attrs
, bool attributesonly
,
45 struct ldb_control
**control_req
,
46 struct ldb_control
***control_res
,
47 struct ldap_message
***results
)
49 struct ldap_message
*msg
;
52 struct ldap_request
*req
;
58 msg
= new_ldap_message(conn
);
59 NT_STATUS_HAVE_NO_MEMORY(msg
);
61 for (n
=0;attrs
&& attrs
[n
];n
++) /* noop */ ;
63 msg
->type
= LDAP_TAG_SearchRequest
;
64 msg
->r
.SearchRequest
.basedn
= basedn
;
65 msg
->r
.SearchRequest
.scope
= scope
;
66 msg
->r
.SearchRequest
.deref
= LDAP_DEREFERENCE_NEVER
;
67 msg
->r
.SearchRequest
.timelimit
= 0;
68 msg
->r
.SearchRequest
.sizelimit
= 0;
69 msg
->r
.SearchRequest
.attributesonly
= attributesonly
;
70 msg
->r
.SearchRequest
.tree
= tree
;
71 msg
->r
.SearchRequest
.num_attributes
= n
;
72 msg
->r
.SearchRequest
.attributes
= attrs
;
73 msg
->controls
= control_req
;
75 req
= ldap_request_send(conn
, msg
);
76 talloc_steal(msg
, req
);
78 for (i
=n
=0;true;i
++) {
79 struct ldap_message
*res
;
80 status
= ldap_result_n(req
, i
, &res
);
81 if (!NT_STATUS_IS_OK(status
)) break;
83 if (res
->type
== LDAP_TAG_SearchResultDone
) {
84 status
= ldap_check_response(conn
, &res
->r
.GeneralResult
);
86 *control_res
= talloc_steal(conn
, res
->controls
);
91 if (res
->type
!= LDAP_TAG_SearchResultEntry
&&
92 res
->type
!= LDAP_TAG_SearchResultReference
)
95 (*results
) = talloc_realloc(conn
, *results
, struct ldap_message
*, n
+2);
96 if (*results
== NULL
) {
98 return NT_STATUS_NO_MEMORY
;
100 (*results
)[n
] = talloc_steal(*results
, res
);
101 (*results
)[n
+1] = NULL
;
105 if (NT_STATUS_EQUAL(status
, NT_STATUS_NO_MORE_ENTRIES
)) {
106 status
= NT_STATUS_OK
;
113 perform a ldap search
115 _PUBLIC_ NTSTATUS
ildap_search(struct ldap_connection
*conn
, const char *basedn
,
116 int scope
, const char *expression
,
117 const char * const *attrs
, bool attributesonly
,
118 struct ldb_control
**control_req
,
119 struct ldb_control
***control_res
,
120 struct ldap_message
***results
)
122 struct ldb_parse_tree
*tree
= ldb_parse_tree(conn
, expression
);
124 status
= ildap_search_bytree(conn
, basedn
, scope
, tree
, attrs
,
125 attributesonly
, control_req
,
126 control_res
, results
);