2 Unix SMB/CIFS implementation.
3 NT Domain Authentication SMB / MSRPC client
4 Copyright (C) Andrew Tridgell 1994-2000
5 Copyright (C) Tim Potter 2001
6 Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
7 Copyright (C) Jeremy Allison 2005.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 WERROR rpccli_srvsvc_net_srv_get_info(struct rpc_pipe_client *cli,
28 uint32 switch_value, SRV_INFO_CTR *ctr)
30 prs_struct qbuf, rbuf;
31 SRV_Q_NET_SRV_GET_INFO q;
32 SRV_R_NET_SRV_GET_INFO r;
33 WERROR result = W_ERROR(ERRgeneral);
39 /* Initialise input parameters */
41 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
44 init_srv_q_net_srv_get_info(&q, server, switch_value);
47 /* Marshall data and send request */
49 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SRV_GET_INFO,
52 srv_io_q_net_srv_get_info,
53 srv_io_r_net_srv_get_info,
54 WERR_GENERAL_FAILURE);
60 WERROR rpccli_srvsvc_net_share_enum(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
61 uint32 info_level, SRV_SHARE_INFO_CTR *ctr,
62 int preferred_len, ENUM_HND *hnd)
64 prs_struct qbuf, rbuf;
65 SRV_Q_NET_SHARE_ENUM q;
66 SRV_R_NET_SHARE_ENUM r;
67 WERROR result = W_ERROR(ERRgeneral);
74 /* Initialise input parameters */
76 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
79 init_srv_q_net_share_enum(&q, server, info_level, preferred_len, hnd);
81 /* Marshall data and send request */
83 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_ENUM_ALL,
86 srv_io_q_net_share_enum,
87 srv_io_r_net_share_enum,
88 WERR_GENERAL_FAILURE);
92 if (!W_ERROR_IS_OK(result))
95 /* Oh yuck yuck yuck - we have to copy all the info out of the
96 SRV_SHARE_INFO_CTR in the SRV_R_NET_SHARE_ENUM as when we do a
97 prs_mem_free() it will all be invalidated. The various share
98 info structures suck badly too. This really is gross. */
102 if (!r.ctr.num_entries)
105 ctr->info_level = info_level;
106 ctr->num_entries = r.ctr.num_entries;
110 ctr->share.info1 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_1, ctr->num_entries);
111 if (ctr->share.info1 == NULL) {
115 memset(ctr->share.info1, 0, sizeof(SRV_SHARE_INFO_1));
117 for (i = 0; i < ctr->num_entries; i++) {
118 SRV_SHARE_INFO_1 *info1 = &ctr->share.info1[i];
121 /* Copy pointer crap */
123 memcpy(&info1->info_1, &r.ctr.share.info1[i].info_1,
126 /* Duplicate strings */
128 s = unistr2_tdup(mem_ctx, &r.ctr.share.info1[i].info_1_str.uni_netname);
130 init_unistr2(&info1->info_1_str.uni_netname, s, UNI_STR_TERMINATE);
132 s = unistr2_tdup(mem_ctx, &r.ctr.share.info1[i].info_1_str.uni_remark);
134 init_unistr2(&info1->info_1_str.uni_remark, s, UNI_STR_TERMINATE);
140 ctr->share.info2 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_2, ctr->num_entries);
141 if (ctr->share.info2 == NULL) {
145 memset(ctr->share.info2, 0, sizeof(SRV_SHARE_INFO_2));
147 for (i = 0; i < ctr->num_entries; i++) {
148 SRV_SHARE_INFO_2 *info2 = &ctr->share.info2[i];
151 /* Copy pointer crap */
153 memcpy(&info2->info_2, &r.ctr.share.info2[i].info_2,
156 /* Duplicate strings */
158 s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_netname);
160 init_unistr2(&info2->info_2_str.uni_netname, s, UNI_STR_TERMINATE);
162 s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_remark);
164 init_unistr2(&info2->info_2_str.uni_remark, s, UNI_STR_TERMINATE);
166 s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_path);
168 init_unistr2(&info2->info_2_str.uni_path, s, UNI_STR_TERMINATE);
170 s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_passwd);
172 init_unistr2(&info2->info_2_str.uni_passwd, s, UNI_STR_TERMINATE);
175 /* adding info-level 502 here */
177 ctr->share.info502 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_502, ctr->num_entries);
179 if (ctr->share.info502 == NULL) {
183 memset(ctr->share.info502, 0, sizeof(SRV_SHARE_INFO_502));
185 for (i = 0; i < ctr->num_entries; i++) {
186 SRV_SHARE_INFO_502 *info502 = &ctr->share.info502[i];
189 /* Copy pointer crap */
190 memcpy(&info502->info_502, &r.ctr.share.info502[i].info_502,
191 sizeof(SH_INFO_502));
193 /* Duplicate strings */
195 s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_netname);
197 init_unistr2(&info502->info_502_str.uni_netname, s, UNI_STR_TERMINATE);
199 s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_remark);
201 init_unistr2(&info502->info_502_str.uni_remark, s, UNI_STR_TERMINATE);
203 s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_path);
205 init_unistr2(&info502->info_502_str.uni_path, s, UNI_STR_TERMINATE);
207 s = unistr2_tdup(mem_ctx, &r.ctr.share.info502[i].info_502_str.uni_passwd);
209 init_unistr2(&info502->info_502_str.uni_passwd, s, UNI_STR_TERMINATE);
211 info502->info_502_str.sd = dup_sec_desc(mem_ctx, r.ctr.share.info502[i].info_502_str.sd);
221 WERROR rpccli_srvsvc_net_share_get_info(struct rpc_pipe_client *cli,
223 const char *sharename,
225 SRV_SHARE_INFO *info)
227 prs_struct qbuf, rbuf;
228 SRV_Q_NET_SHARE_GET_INFO q;
229 SRV_R_NET_SHARE_GET_INFO r;
230 WERROR result = W_ERROR(ERRgeneral);
236 /* Initialise input parameters */
238 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
241 init_srv_q_net_share_get_info(&q, server, sharename, info_level);
243 /* Marshall data and send request */
245 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_GET_INFO,
248 srv_io_q_net_share_get_info,
249 srv_io_r_net_share_get_info,
250 WERR_GENERAL_FAILURE);
254 if (!W_ERROR_IS_OK(result))
259 info->switch_value = info_level;
264 SRV_SHARE_INFO_1 *info1 = &info->share.info1;
265 SH_INFO_1_STR *info1_str = &info1->info_1_str;
269 info->share.info1 = r.info.share.info1;
271 /* Duplicate strings */
273 s = unistr2_tdup(mem_ctx, &info1_str->uni_netname);
275 init_unistr2(&info1_str->uni_netname,
276 s, UNI_STR_TERMINATE);
278 s = unistr2_tdup(mem_ctx, &info1_str->uni_remark);
280 init_unistr2(&info1_str->uni_remark,
281 s, UNI_STR_TERMINATE);
287 SRV_SHARE_INFO_2 *info2 = &info->share.info2;
288 SH_INFO_2_STR *info2_str = &info2->info_2_str;
292 info->share.info2 = r.info.share.info2;
294 /* Duplicate strings */
296 s = unistr2_tdup(mem_ctx, &info2_str->uni_netname);
298 init_unistr2(&info2_str->uni_netname,
299 s, UNI_STR_TERMINATE);
301 s = unistr2_tdup(mem_ctx, &info2_str->uni_remark);
303 init_unistr2(&info2_str->uni_remark,
304 s, UNI_STR_TERMINATE);
306 s = unistr2_tdup(mem_ctx, &info2_str->uni_path);
308 init_unistr2(&info2_str->uni_path,
309 s, UNI_STR_TERMINATE);
311 s = unistr2_tdup(mem_ctx, &info2_str->uni_passwd);
313 init_unistr2(&info2_str->uni_passwd,
314 s, UNI_STR_TERMINATE);
321 SRV_SHARE_INFO_502 *info502 = &info->share.info502;
322 SH_INFO_502_STR *info502_str = &info502->info_502_str;
326 info->share.info502 = r.info.share.info502;
328 /* Duplicate strings */
330 s = unistr2_tdup(mem_ctx, &info502_str->uni_netname);
332 init_unistr2(&info502_str->uni_netname,
333 s, UNI_STR_TERMINATE);
335 s = unistr2_tdup(mem_ctx, &info502_str->uni_remark);
337 init_unistr2(&info502_str->uni_remark,
338 s, UNI_STR_TERMINATE);
340 s = unistr2_tdup(mem_ctx, &info502_str->uni_path);
342 init_unistr2(&info502_str->uni_path,
343 s, UNI_STR_TERMINATE);
345 s = unistr2_tdup(mem_ctx, &info502_str->uni_passwd);
347 init_unistr2(&info502_str->uni_passwd,
348 s, UNI_STR_TERMINATE);
350 info502_str->sd = dup_sec_desc(mem_ctx, info502_str->sd);
354 DEBUG(0,("unimplemented info-level: %d\n", info_level));
363 WERROR rpccli_srvsvc_net_share_set_info(struct rpc_pipe_client *cli,
365 const char *sharename,
367 SRV_SHARE_INFO *info)
369 prs_struct qbuf, rbuf;
370 SRV_Q_NET_SHARE_SET_INFO q;
371 SRV_R_NET_SHARE_SET_INFO r;
372 WERROR result = W_ERROR(ERRgeneral);
378 /* Initialise input parameters */
380 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
383 init_srv_q_net_share_set_info(&q, server, sharename, info_level, info);
385 /* Marshall data and send request */
387 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_SET_INFO,
390 srv_io_q_net_share_set_info,
391 srv_io_r_net_share_set_info,
392 WERR_GENERAL_FAILURE);
398 WERROR rpccli_srvsvc_net_share_del(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
399 const char *sharename)
401 prs_struct qbuf, rbuf;
402 SRV_Q_NET_SHARE_DEL q;
403 SRV_R_NET_SHARE_DEL r;
404 WERROR result = W_ERROR(ERRgeneral);
410 /* Initialise input parameters */
412 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
415 init_srv_q_net_share_del(&q, server, sharename);
417 /* Marshall data and send request */
419 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_DEL,
422 srv_io_q_net_share_del,
423 srv_io_r_net_share_del,
424 WERR_GENERAL_FAILURE);
430 WERROR rpccli_srvsvc_net_share_add(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
431 const char *netname, uint32 type,
432 const char *remark, uint32 perms,
433 uint32 max_uses, uint32 num_uses,
434 const char *path, const char *passwd,
435 int level, SEC_DESC *sd)
437 prs_struct qbuf, rbuf;
438 SRV_Q_NET_SHARE_ADD q;
439 SRV_R_NET_SHARE_ADD r;
440 WERROR result = W_ERROR(ERRgeneral);
446 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
449 init_srv_q_net_share_add(&q,server, netname, type, remark,
450 perms, max_uses, num_uses, path, passwd,
453 /* Marshall data and send request */
455 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_SHARE_ADD,
458 srv_io_q_net_share_add,
459 srv_io_r_net_share_add,
460 WERR_GENERAL_FAILURE);
466 WERROR rpccli_srvsvc_net_remote_tod(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
467 char *server, TIME_OF_DAY_INFO *tod)
469 prs_struct qbuf, rbuf;
470 SRV_Q_NET_REMOTE_TOD q;
471 SRV_R_NET_REMOTE_TOD r;
472 WERROR result = W_ERROR(ERRgeneral);
473 fstring server_slash;
478 /* Initialise input parameters */
480 slprintf(server_slash, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
481 strupper_m(server_slash);
483 init_srv_q_net_remote_tod(&q, server_slash);
486 /* Marshall data and send request */
488 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_REMOTE_TOD,
491 srv_io_q_net_remote_tod,
492 srv_io_r_net_remote_tod,
493 WERR_GENERAL_FAILURE);
499 WERROR rpccli_srvsvc_net_file_enum(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
500 uint32 file_level, const char *user_name,
501 SRV_FILE_INFO_CTR *ctr, int preferred_len,
504 prs_struct qbuf, rbuf;
505 SRV_Q_NET_FILE_ENUM q;
506 SRV_R_NET_FILE_ENUM r;
507 WERROR result = W_ERROR(ERRgeneral);
514 /* Initialise input parameters */
516 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
519 init_srv_q_net_file_enum(&q, server, NULL, user_name,
520 file_level, ctr, preferred_len, hnd);
522 /* Marshall data and send request */
524 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_FILE_ENUM,
527 srv_io_q_net_file_enum,
528 srv_io_r_net_file_enum,
529 WERR_GENERAL_FAILURE);
533 if (!W_ERROR_IS_OK(result))
536 /* copy the data over to the ctr */
540 ctr->switch_value = file_level;
542 ctr->num_entries = ctr->num_entries2 = r.ctr.num_entries;
546 ctr->file.info3 = TALLOC_ARRAY(mem_ctx, SRV_FILE_INFO_3, ctr->num_entries);
547 if (ctr->file.info3 == NULL) {
551 memset(ctr->file.info3, 0,
552 sizeof(SRV_FILE_INFO_3) * ctr->num_entries);
554 for (i = 0; i < r.ctr.num_entries; i++) {
555 SRV_FILE_INFO_3 *info3 = &ctr->file.info3[i];
558 /* Copy pointer crap */
560 memcpy(&info3->info_3, &r.ctr.file.info3[i].info_3,
561 sizeof(FILE_INFO_3));
563 /* Duplicate strings */
565 s = unistr2_tdup(mem_ctx, &r.ctr.file.info3[i].info_3_str.uni_path_name);
567 init_unistr2(&info3->info_3_str.uni_path_name, s, UNI_STR_TERMINATE);
569 s = unistr2_tdup(mem_ctx, &r.ctr.file.info3[i].info_3_str.uni_user_name);
571 init_unistr2(&info3->info_3_str.uni_user_name, s, UNI_STR_TERMINATE);
582 WERROR rpccli_srvsvc_net_file_close(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
585 prs_struct qbuf, rbuf;
586 SRV_Q_NET_FILE_CLOSE q;
587 SRV_R_NET_FILE_CLOSE r;
588 WERROR result = W_ERROR(ERRgeneral);
594 /* Initialise input parameters */
596 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
599 init_srv_q_net_file_close(&q, server, file_id);
601 /* Marshall data and send request */
603 CLI_DO_RPC_WERR(cli, mem_ctx, PI_SRVSVC, SRV_NET_FILE_CLOSE,
606 srv_io_q_net_file_close,
607 srv_io_r_net_file_close,
608 WERR_GENERAL_FAILURE);