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.
21 #include "lib/util/debug.h"
22 #include "lib/cmdline/cmdline.h"
23 #include "lib/cmdline_contexts.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
;
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
;
59 struct poptOption long_options
[] = {
64 .argInfo
= POPT_ARG_STRING
,
66 .descrip
= "Server-relative search path",
71 .argInfo
= POPT_ARG_NONE
,
73 .descrip
= "live query",
76 POPT_COMMON_CREDENTIALS
84 ok
= samba_cmdline_init(frame
,
85 SAMBA_CMDLINE_CONFIG_CLIENT
,
86 false /* require_smbconf */);
88 DBG_ERR("Failed to init cmdline parser!\n");
92 lp_ctx
= samba_cmdline_get_lp_ctx();
93 lpcfg_set_cmdline(lp_ctx
, "log level", "1");
95 pc
= samba_popt_get_context(getprogname(),
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),
107 poptPrintHelp(pc
, stderr
, 0);
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);
121 samba_cmdline_burn(argc
, argv
);
123 if ((server
[0] == '/' && server
[1] == '/') ||
124 (server
[0] == '\\' && server
[1] == '\\'))
129 ev
= samba_tevent_context_init(frame
);
134 cmdline_messaging_context(get_dyn_CONFIGFILE());
136 creds
= samba_cmdline_get_creds();
138 status
= cli_full_connection_creds(&cli
,
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
,
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
);
170 basepath
= talloc_strdup(frame
, opt_path
);
172 if (basepath
== NULL
) {
173 goto fail_free_messaging
;
176 status
= mdscli_search(frame
,
180 opt_live
== 1 ? true : false,
182 if (!NT_STATUS_IS_OK(status
)) {
183 printf("mdscli_search failed\n");
184 goto fail_free_messaging
;
192 status
= mdscli_get_results(frame
,
195 if (NT_STATUS_EQUAL(status
, NT_STATUS_NO_MORE_MATCHES
)) {
203 ncnids
= talloc_array_length(cnids
);
205 if (NT_STATUS_EQUAL(status
, NT_STATUS_PENDING
) &&
211 if (!NT_STATUS_IS_OK(status
)) {
212 printf("mdscli_get_results failed\n");
213 goto fail_free_messaging
;
220 for (i
= 0; i
< ncnids
; i
++) {
223 status
= mdscli_get_path(frame
,
227 if (!NT_STATUS_IS_OK(status
)) {
228 printf("Get path for CNID 0x%"PRIx64
" failed\n",
230 goto fail_free_messaging
;
232 printf("%s\n", 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();
255 cmdline_messaging_context_free();