talloc: release 2.4.2
[Samba.git] / source3 / utils / mdsearch.c
blob0f5b8873c688922175bc87109162751d5f32053e
1 /*
2 * Copyright (C) 2019, Ralph Boehme <slow@samba.org.>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
20 #include "includes.h"
21 #include "lib/util/debug.h"
22 #include "lib/cmdline/cmdline.h"
23 #include "lib/cmdline_contexts.h"
24 #include "param.h"
25 #include "client.h"
26 #include "libsmb/proto.h"
27 #include "librpc/rpc/rpc_common.h"
28 #include "rpc_client/cli_pipe.h"
29 #include "rpc_client/cli_mdssvc.h"
30 #include "librpc/gen_ndr/ndr_mdssvc_c.h"
32 static char *opt_path;
33 static int opt_live;
35 int main(int argc, char **argv)
37 const char **const_argv = discard_const_p(const char *, argv);
38 TALLOC_CTX *frame = talloc_stackframe();
39 struct loadparm_context *lp_ctx = NULL;
40 struct tevent_context *ev = NULL;
41 struct cli_credentials *creds = NULL;
42 struct rpc_pipe_client *rpccli = NULL;
43 struct mdscli_ctx *mdscli_ctx = NULL;
44 struct mdscli_search_ctx *search = NULL;
45 const char *server = NULL;
46 const char *share = NULL;
47 const char *mds_query = NULL;
48 struct cli_state *cli = NULL;
49 char *basepath = NULL;
50 uint32_t flags = CLI_FULL_CONNECTION_IPC;
51 uint64_t *cnids = NULL;
52 size_t ncnids;
53 size_t i;
54 int opt;
55 poptContext pc;
56 NTSTATUS status;
57 bool ok;
59 struct poptOption long_options[] = {
60 POPT_AUTOHELP
62 .longName = "path",
63 .shortName = 'p',
64 .argInfo = POPT_ARG_STRING,
65 .arg = &opt_path,
66 .descrip = "Server-relative search path",
69 .longName = "live",
70 .shortName = 'L',
71 .argInfo = POPT_ARG_NONE,
72 .arg = &opt_live,
73 .descrip = "live query",
75 POPT_COMMON_SAMBA
76 POPT_COMMON_CREDENTIALS
77 POPT_LEGACY_S3
78 POPT_COMMON_VERSION
79 POPT_TABLEEND
82 smb_init_locale();
84 ok = samba_cmdline_init(frame,
85 SAMBA_CMDLINE_CONFIG_CLIENT,
86 false /* require_smbconf */);
87 if (!ok) {
88 DBG_ERR("Failed to init cmdline parser!\n");
89 TALLOC_FREE(frame);
90 exit(1);
92 lp_ctx = samba_cmdline_get_lp_ctx();
93 lpcfg_set_cmdline(lp_ctx, "log level", "1");
95 pc = samba_popt_get_context(getprogname(),
96 argc,
97 const_argv,
98 long_options,
99 POPT_CONTEXT_KEEP_FIRST);
101 poptSetOtherOptionHelp(pc, "mdsearch [OPTIONS] <server> <share> <query>\n");
103 while ((opt = poptGetNextOpt(pc)) != -1) {
104 DBG_ERR("Invalid option %s: %s\n",
105 poptBadOption(pc, 0),
106 poptStrerror(opt));
107 poptPrintHelp(pc, stderr, 0);
108 goto fail;
111 poptGetArg(pc); /* Drop argv[0], the program name */
112 server = poptGetArg(pc);
113 share = poptGetArg(pc);
114 mds_query = poptGetArg(pc);
116 if (server == NULL || mds_query == NULL) {
117 poptPrintHelp(pc, stderr, 0);
118 goto fail;
121 samba_cmdline_burn(argc, argv);
123 if ((server[0] == '/' && server[1] == '/') ||
124 (server[0] == '\\' && server[1] == '\\'))
126 server += 2;
129 ev = samba_tevent_context_init(frame);
130 if (ev == NULL) {
131 goto fail;
134 cmdline_messaging_context(get_dyn_CONFIGFILE());
136 creds = samba_cmdline_get_creds();
138 status = cli_full_connection_creds(&cli,
139 lp_netbios_name(),
140 server,
141 NULL,
143 "IPC$",
144 "IPC",
145 creds,
146 flags);
147 if (!NT_STATUS_IS_OK(status)) {
148 DBG_ERR("Cannot connect to server: %s\n", nt_errstr(status));
149 goto fail_free_messaging;
152 status = cli_rpc_pipe_open_noauth(cli, &ndr_table_mdssvc, &rpccli);
153 if (!NT_STATUS_IS_OK(status)) {
154 goto fail_free_messaging;
157 status = mdscli_connect(frame,
158 rpccli->binding_handle,
159 share,
160 "/foo/bar",
161 &mdscli_ctx);
162 if (!NT_STATUS_IS_OK(status)) {
163 printf("Failed to connect mdssvc\n");
164 goto fail_free_messaging;
167 if (opt_path == NULL) {
168 basepath = mdscli_get_basepath(frame, mdscli_ctx);
169 } else {
170 basepath = talloc_strdup(frame, opt_path);
172 if (basepath == NULL) {
173 goto fail_free_messaging;
176 status = mdscli_search(frame,
177 mdscli_ctx,
178 mds_query,
179 basepath,
180 opt_live == 1 ? true : false,
181 &search);
182 if (!NT_STATUS_IS_OK(status)) {
183 printf("mdscli_search failed\n");
184 goto fail_free_messaging;
187 if (!opt_live) {
188 sleep(1);
191 while (true) {
192 status = mdscli_get_results(frame,
193 search,
194 &cnids);
195 if (NT_STATUS_EQUAL(status, NT_STATUS_NO_MORE_MATCHES)) {
196 if (opt_live) {
197 sleep(1);
198 continue;
200 break;
203 ncnids = talloc_array_length(cnids);
205 if (NT_STATUS_EQUAL(status, NT_STATUS_PENDING) &&
206 ncnids == 0)
208 sleep(1);
209 continue;
211 if (!NT_STATUS_IS_OK(status)) {
212 printf("mdscli_get_results failed\n");
213 goto fail_free_messaging;
216 if (ncnids == 0) {
217 break;
220 for (i = 0; i < ncnids; i++) {
221 char *path = NULL;
223 status = mdscli_get_path(frame,
224 mdscli_ctx,
225 cnids[i],
226 &path);
227 if (!NT_STATUS_IS_OK(status)) {
228 printf("Get path for CNID 0x%"PRIx64" failed\n",
229 cnids[i]);
230 goto fail_free_messaging;
232 printf("%s\n", path);
233 TALLOC_FREE(path);
237 status = mdscli_close_search(&search);
238 if (!NT_STATUS_IS_OK(status)) {
239 printf("mdscli_close_search failed\n");
240 goto fail_free_messaging;
243 status = mdscli_disconnect(mdscli_ctx);
244 if (!NT_STATUS_IS_OK(status)) {
245 printf("mdscli_disconnect failed\n");
246 goto fail_free_messaging;
249 cmdline_messaging_context_free();
250 TALLOC_FREE(frame);
251 poptFreeContext(pc);
252 return 0;
254 fail_free_messaging:
255 cmdline_messaging_context_free();
256 fail:
257 poptFreeContext(pc);
258 TALLOC_FREE(frame);
259 return 1;