s3:librpc: add smbXsrv.idl
[Samba/gebeck_regimport.git] / source4 / libcli / ldap / ldap_ildap.c
blob10fe8e491658705d0653269849304c05d269f84f
1 /*
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/>.
23 #include "includes.h"
24 #include "libcli/ldap/libcli_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)
33 int i;
34 for (i=0;res && res[i];i++) /* noop */ ;
35 return i;
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;
50 int n, i;
51 NTSTATUS status;
52 struct ldap_request *req;
54 if (control_res)
55 *control_res = NULL;
56 *results = NULL;
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_reparent(conn, 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);
85 if (control_res) {
86 *control_res = talloc_steal(conn, res->controls);
88 break;
91 if (res->type != LDAP_TAG_SearchResultEntry &&
92 res->type != LDAP_TAG_SearchResultReference)
93 continue;
95 (*results) = talloc_realloc(conn, *results, struct ldap_message *, n+2);
96 if (*results == NULL) {
97 talloc_free(msg);
98 return NT_STATUS_NO_MEMORY;
100 (*results)[n] = talloc_steal(*results, res);
101 (*results)[n+1] = NULL;
102 n++;
105 if (NT_STATUS_EQUAL(status, NT_STATUS_NO_MORE_ENTRIES)) {
106 status = NT_STATUS_OK;
109 return status;
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);
123 NTSTATUS status;
124 status = ildap_search_bytree(conn, basedn, scope, tree, attrs,
125 attributesonly, control_req,
126 control_res, results);
127 talloc_free(tree);
128 return status;