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.
8 Copyright (C) Gerald (Jerry) Carter 2006.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>.
27 WERROR
rpccli_srvsvc_net_srv_get_info(struct rpc_pipe_client
*cli
,
29 uint32 switch_value
, SRV_INFO_CTR
*ctr
)
31 prs_struct qbuf
, rbuf
;
32 SRV_Q_NET_SRV_GET_INFO q
;
33 SRV_R_NET_SRV_GET_INFO r
;
34 WERROR result
= W_ERROR(ERRgeneral
);
40 /* Initialise input parameters */
42 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
45 init_srv_q_net_srv_get_info(&q
, server
, switch_value
);
48 /* Marshall data and send request */
50 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SRV_GET_INFO
,
53 srv_io_q_net_srv_get_info
,
54 srv_io_r_net_srv_get_info
,
55 WERR_GENERAL_FAILURE
);
61 WERROR
rpccli_srvsvc_net_share_enum(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
62 uint32 info_level
, SRV_SHARE_INFO_CTR
*ctr
,
63 int preferred_len
, ENUM_HND
*hnd
)
65 prs_struct qbuf
, rbuf
;
66 SRV_Q_NET_SHARE_ENUM q
;
67 SRV_R_NET_SHARE_ENUM r
;
68 WERROR result
= W_ERROR(ERRgeneral
);
75 /* Initialise input parameters */
77 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
80 init_srv_q_net_share_enum(&q
, server
, info_level
, preferred_len
, hnd
);
82 /* Marshall data and send request */
84 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_ENUM_ALL
,
87 srv_io_q_net_share_enum
,
88 srv_io_r_net_share_enum
,
89 WERR_GENERAL_FAILURE
);
93 if (!W_ERROR_IS_OK(result
))
96 /* Oh yuck yuck yuck - we have to copy all the info out of the
97 SRV_SHARE_INFO_CTR in the SRV_R_NET_SHARE_ENUM as when we do a
98 prs_mem_free() it will all be invalidated. The various share
99 info structures suck badly too. This really is gross. */
103 if (!r
.ctr
.num_entries
)
106 ctr
->info_level
= info_level
;
107 ctr
->num_entries
= r
.ctr
.num_entries
;
111 ctr
->share
.info1
= TALLOC_ARRAY(mem_ctx
, SRV_SHARE_INFO_1
, ctr
->num_entries
);
112 if (ctr
->share
.info1
== NULL
) {
116 memset(ctr
->share
.info1
, 0, sizeof(SRV_SHARE_INFO_1
));
118 for (i
= 0; i
< ctr
->num_entries
; i
++) {
119 SRV_SHARE_INFO_1
*info1
= &ctr
->share
.info1
[i
];
122 /* Copy pointer crap */
124 memcpy(&info1
->info_1
, &r
.ctr
.share
.info1
[i
].info_1
,
127 /* Duplicate strings */
129 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info1
[i
].info_1_str
.uni_netname
);
131 init_unistr2(&info1
->info_1_str
.uni_netname
, s
, UNI_STR_TERMINATE
);
133 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info1
[i
].info_1_str
.uni_remark
);
135 init_unistr2(&info1
->info_1_str
.uni_remark
, s
, UNI_STR_TERMINATE
);
141 ctr
->share
.info2
= TALLOC_ARRAY(mem_ctx
, SRV_SHARE_INFO_2
, ctr
->num_entries
);
142 if (ctr
->share
.info2
== NULL
) {
146 memset(ctr
->share
.info2
, 0, sizeof(SRV_SHARE_INFO_2
));
148 for (i
= 0; i
< ctr
->num_entries
; i
++) {
149 SRV_SHARE_INFO_2
*info2
= &ctr
->share
.info2
[i
];
152 /* Copy pointer crap */
154 memcpy(&info2
->info_2
, &r
.ctr
.share
.info2
[i
].info_2
,
157 /* Duplicate strings */
159 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_netname
);
161 init_unistr2(&info2
->info_2_str
.uni_netname
, s
, UNI_STR_TERMINATE
);
163 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_remark
);
165 init_unistr2(&info2
->info_2_str
.uni_remark
, s
, UNI_STR_TERMINATE
);
167 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_path
);
169 init_unistr2(&info2
->info_2_str
.uni_path
, s
, UNI_STR_TERMINATE
);
171 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_passwd
);
173 init_unistr2(&info2
->info_2_str
.uni_passwd
, s
, UNI_STR_TERMINATE
);
176 /* adding info-level 502 here */
178 ctr
->share
.info502
= TALLOC_ARRAY(mem_ctx
, SRV_SHARE_INFO_502
, ctr
->num_entries
);
180 if (ctr
->share
.info502
== NULL
) {
184 memset(ctr
->share
.info502
, 0, sizeof(SRV_SHARE_INFO_502
));
186 for (i
= 0; i
< ctr
->num_entries
; i
++) {
187 SRV_SHARE_INFO_502
*info502
= &ctr
->share
.info502
[i
];
190 /* Copy pointer crap */
191 memcpy(&info502
->info_502
, &r
.ctr
.share
.info502
[i
].info_502
,
192 sizeof(SH_INFO_502
));
194 /* Duplicate strings */
196 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_netname
);
198 init_unistr2(&info502
->info_502_str
.uni_netname
, s
, UNI_STR_TERMINATE
);
200 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_remark
);
202 init_unistr2(&info502
->info_502_str
.uni_remark
, s
, UNI_STR_TERMINATE
);
204 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_path
);
206 init_unistr2(&info502
->info_502_str
.uni_path
, s
, UNI_STR_TERMINATE
);
208 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_passwd
);
210 init_unistr2(&info502
->info_502_str
.uni_passwd
, s
, UNI_STR_TERMINATE
);
212 info502
->info_502_str
.sd
= dup_sec_desc(mem_ctx
, r
.ctr
.share
.info502
[i
].info_502_str
.sd
);
222 WERROR
rpccli_srvsvc_net_share_get_info(struct rpc_pipe_client
*cli
,
224 const char *sharename
,
226 SRV_SHARE_INFO
*info
)
228 prs_struct qbuf
, rbuf
;
229 SRV_Q_NET_SHARE_GET_INFO q
;
230 SRV_R_NET_SHARE_GET_INFO r
;
231 WERROR result
= W_ERROR(ERRgeneral
);
237 /* Initialise input parameters */
239 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
242 init_srv_q_net_share_get_info(&q
, server
, sharename
, info_level
);
244 /* Marshall data and send request */
246 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_GET_INFO
,
249 srv_io_q_net_share_get_info
,
250 srv_io_r_net_share_get_info
,
251 WERR_GENERAL_FAILURE
);
255 if (!W_ERROR_IS_OK(result
))
260 info
->switch_value
= info_level
;
265 SRV_SHARE_INFO_1
*info1
= &info
->share
.info1
;
266 SH_INFO_1_STR
*info1_str
= &info1
->info_1_str
;
270 info
->share
.info1
= r
.info
.share
.info1
;
272 /* Duplicate strings */
274 s
= unistr2_tdup(mem_ctx
, &info1_str
->uni_netname
);
276 init_unistr2(&info1_str
->uni_netname
,
277 s
, UNI_STR_TERMINATE
);
279 s
= unistr2_tdup(mem_ctx
, &info1_str
->uni_remark
);
281 init_unistr2(&info1_str
->uni_remark
,
282 s
, UNI_STR_TERMINATE
);
288 SRV_SHARE_INFO_2
*info2
= &info
->share
.info2
;
289 SH_INFO_2_STR
*info2_str
= &info2
->info_2_str
;
293 info
->share
.info2
= r
.info
.share
.info2
;
295 /* Duplicate strings */
297 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_netname
);
299 init_unistr2(&info2_str
->uni_netname
,
300 s
, UNI_STR_TERMINATE
);
302 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_remark
);
304 init_unistr2(&info2_str
->uni_remark
,
305 s
, UNI_STR_TERMINATE
);
307 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_path
);
309 init_unistr2(&info2_str
->uni_path
,
310 s
, UNI_STR_TERMINATE
);
312 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_passwd
);
314 init_unistr2(&info2_str
->uni_passwd
,
315 s
, UNI_STR_TERMINATE
);
322 SRV_SHARE_INFO_502
*info502
= &info
->share
.info502
;
323 SH_INFO_502_STR
*info502_str
= &info502
->info_502_str
;
327 info
->share
.info502
= r
.info
.share
.info502
;
329 /* Duplicate strings */
331 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_netname
);
333 init_unistr2(&info502_str
->uni_netname
,
334 s
, UNI_STR_TERMINATE
);
336 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_remark
);
338 init_unistr2(&info502_str
->uni_remark
,
339 s
, UNI_STR_TERMINATE
);
341 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_path
);
343 init_unistr2(&info502_str
->uni_path
,
344 s
, UNI_STR_TERMINATE
);
346 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_passwd
);
348 init_unistr2(&info502_str
->uni_passwd
,
349 s
, UNI_STR_TERMINATE
);
351 info502_str
->sd
= dup_sec_desc(mem_ctx
, info502_str
->sd
);
355 DEBUG(0,("unimplemented info-level: %d\n", info_level
));
364 WERROR
rpccli_srvsvc_net_share_set_info(struct rpc_pipe_client
*cli
,
366 const char *sharename
,
368 SRV_SHARE_INFO
*info
)
370 prs_struct qbuf
, rbuf
;
371 SRV_Q_NET_SHARE_SET_INFO q
;
372 SRV_R_NET_SHARE_SET_INFO r
;
373 WERROR result
= W_ERROR(ERRgeneral
);
379 /* Initialise input parameters */
381 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
384 init_srv_q_net_share_set_info(&q
, server
, sharename
, info_level
, info
);
386 /* Marshall data and send request */
388 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_SET_INFO
,
391 srv_io_q_net_share_set_info
,
392 srv_io_r_net_share_set_info
,
393 WERR_GENERAL_FAILURE
);
399 WERROR
rpccli_srvsvc_net_share_del(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
400 const char *sharename
)
402 prs_struct qbuf
, rbuf
;
403 SRV_Q_NET_SHARE_DEL q
;
404 SRV_R_NET_SHARE_DEL r
;
405 WERROR result
= W_ERROR(ERRgeneral
);
411 /* Initialise input parameters */
413 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
416 init_srv_q_net_share_del(&q
, server
, sharename
);
418 /* Marshall data and send request */
420 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_DEL
,
423 srv_io_q_net_share_del
,
424 srv_io_r_net_share_del
,
425 WERR_GENERAL_FAILURE
);
431 WERROR
rpccli_srvsvc_net_share_add(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
432 const char *netname
, uint32 type
,
433 const char *remark
, uint32 perms
,
434 uint32 max_uses
, uint32 num_uses
,
435 const char *path
, const char *passwd
,
436 int level
, SEC_DESC
*sd
)
438 prs_struct qbuf
, rbuf
;
439 SRV_Q_NET_SHARE_ADD q
;
440 SRV_R_NET_SHARE_ADD r
;
441 WERROR result
= W_ERROR(ERRgeneral
);
447 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
450 init_srv_q_net_share_add(&q
,server
, netname
, type
, remark
,
451 perms
, max_uses
, num_uses
, path
, passwd
,
454 /* Marshall data and send request */
456 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_ADD
,
459 srv_io_q_net_share_add
,
460 srv_io_r_net_share_add
,
461 WERR_GENERAL_FAILURE
);
467 WERROR
rpccli_srvsvc_net_remote_tod(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
468 char *server
, TIME_OF_DAY_INFO
*tod
)
470 prs_struct qbuf
, rbuf
;
471 SRV_Q_NET_REMOTE_TOD q
;
472 SRV_R_NET_REMOTE_TOD r
;
473 WERROR result
= W_ERROR(ERRgeneral
);
474 fstring server_slash
;
479 /* Initialise input parameters */
481 slprintf(server_slash
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
482 strupper_m(server_slash
);
484 init_srv_q_net_remote_tod(&q
, server_slash
);
487 /* Marshall data and send request */
489 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_REMOTE_TOD
,
492 srv_io_q_net_remote_tod
,
493 srv_io_r_net_remote_tod
,
494 WERR_GENERAL_FAILURE
);
500 WERROR
rpccli_srvsvc_net_file_enum(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
501 uint32 file_level
, const char *user_name
,
502 SRV_FILE_INFO_CTR
*ctr
, int preferred_len
,
505 prs_struct qbuf
, rbuf
;
506 SRV_Q_NET_FILE_ENUM q
;
507 SRV_R_NET_FILE_ENUM r
;
508 WERROR result
= W_ERROR(ERRgeneral
);
515 /* Initialise input parameters */
517 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
520 init_srv_q_net_file_enum(&q
, server
, NULL
, user_name
,
521 file_level
, ctr
, preferred_len
, hnd
);
523 /* Marshall data and send request */
525 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_FILE_ENUM
,
528 srv_io_q_net_file_enum
,
529 srv_io_r_net_file_enum
,
530 WERR_GENERAL_FAILURE
);
534 if (!W_ERROR_IS_OK(result
))
537 /* copy the data over to the ctr */
541 ctr
->level
= file_level
;
543 ctr
->num_entries
= ctr
->num_entries2
= r
.ctr
.num_entries
;
547 if (ctr
->num_entries
) {
548 if ( (ctr
->file
.info3
= TALLOC_ARRAY(mem_ctx
, FILE_INFO_3
, ctr
->num_entries
)) == NULL
) {
552 memset(ctr
->file
.info3
, 0, sizeof(FILE_INFO_3
) * ctr
->num_entries
);
554 ctr
->file
.info3
= NULL
;
557 for (i
= 0; i
< r
.ctr
.num_entries
; i
++) {
558 FILE_INFO_3
*info3
= &ctr
->file
.info3
[i
];
561 /* Copy pointer crap */
563 memcpy(info3
, &r
.ctr
.file
.info3
[i
], sizeof(FILE_INFO_3
));
565 /* Duplicate strings */
567 if ( (s
= unistr2_tdup(mem_ctx
, r
.ctr
.file
.info3
[i
].path
)) != NULL
) {
568 info3
->path
= TALLOC_P( mem_ctx
, UNISTR2
);
569 init_unistr2(info3
->path
, s
, UNI_STR_TERMINATE
);
572 if ( (s
= unistr2_tdup(mem_ctx
, r
.ctr
.file
.info3
[i
].user
)) != NULL
) {
573 info3
->user
= TALLOC_P( mem_ctx
, UNISTR2
);
574 init_unistr2(info3
->user
, s
, UNI_STR_TERMINATE
);