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
);
112 memset(ctr
->share
.info1
, 0, sizeof(SRV_SHARE_INFO_1
));
114 for (i
= 0; i
< ctr
->num_entries
; i
++) {
115 SRV_SHARE_INFO_1
*info1
= &ctr
->share
.info1
[i
];
118 /* Copy pointer crap */
120 memcpy(&info1
->info_1
, &r
.ctr
.share
.info1
[i
].info_1
,
123 /* Duplicate strings */
125 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info1
[i
].info_1_str
.uni_netname
);
127 init_unistr2(&info1
->info_1_str
.uni_netname
, s
, UNI_STR_TERMINATE
);
129 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info1
[i
].info_1_str
.uni_remark
);
131 init_unistr2(&info1
->info_1_str
.uni_remark
, s
, UNI_STR_TERMINATE
);
137 ctr
->share
.info2
= TALLOC_ARRAY(mem_ctx
, SRV_SHARE_INFO_2
, ctr
->num_entries
);
139 memset(ctr
->share
.info2
, 0, sizeof(SRV_SHARE_INFO_2
));
141 for (i
= 0; i
< ctr
->num_entries
; i
++) {
142 SRV_SHARE_INFO_2
*info2
= &ctr
->share
.info2
[i
];
145 /* Copy pointer crap */
147 memcpy(&info2
->info_2
, &r
.ctr
.share
.info2
[i
].info_2
,
150 /* Duplicate strings */
152 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_netname
);
154 init_unistr2(&info2
->info_2_str
.uni_netname
, s
, UNI_STR_TERMINATE
);
156 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_remark
);
158 init_unistr2(&info2
->info_2_str
.uni_remark
, s
, UNI_STR_TERMINATE
);
160 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_path
);
162 init_unistr2(&info2
->info_2_str
.uni_path
, s
, UNI_STR_TERMINATE
);
164 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_passwd
);
166 init_unistr2(&info2
->info_2_str
.uni_passwd
, s
, UNI_STR_TERMINATE
);
169 /* adding info-level 502 here */
171 ctr
->share
.info502
= TALLOC_ARRAY(mem_ctx
, SRV_SHARE_INFO_502
, ctr
->num_entries
);
173 memset(ctr
->share
.info502
, 0, sizeof(SRV_SHARE_INFO_502
));
175 for (i
= 0; i
< ctr
->num_entries
; i
++) {
176 SRV_SHARE_INFO_502
*info502
= &ctr
->share
.info502
[i
];
179 /* Copy pointer crap */
180 memcpy(&info502
->info_502
, &r
.ctr
.share
.info502
[i
].info_502
,
181 sizeof(SH_INFO_502
));
183 /* Duplicate strings */
185 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_netname
);
187 init_unistr2(&info502
->info_502_str
.uni_netname
, s
, UNI_STR_TERMINATE
);
189 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_remark
);
191 init_unistr2(&info502
->info_502_str
.uni_remark
, s
, UNI_STR_TERMINATE
);
193 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_path
);
195 init_unistr2(&info502
->info_502_str
.uni_path
, s
, UNI_STR_TERMINATE
);
197 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info502
[i
].info_502_str
.uni_passwd
);
199 init_unistr2(&info502
->info_502_str
.uni_passwd
, s
, UNI_STR_TERMINATE
);
201 info502
->info_502_str
.sd
= dup_sec_desc(mem_ctx
, r
.ctr
.share
.info502
[i
].info_502_str
.sd
);
211 WERROR
rpccli_srvsvc_net_share_get_info(struct rpc_pipe_client
*cli
,
213 const char *sharename
,
215 SRV_SHARE_INFO
*info
)
217 prs_struct qbuf
, rbuf
;
218 SRV_Q_NET_SHARE_GET_INFO q
;
219 SRV_R_NET_SHARE_GET_INFO r
;
220 WERROR result
= W_ERROR(ERRgeneral
);
226 /* Initialise input parameters */
228 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
231 init_srv_q_net_share_get_info(&q
, server
, sharename
, info_level
);
233 /* Marshall data and send request */
235 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_GET_INFO
,
238 srv_io_q_net_share_get_info
,
239 srv_io_r_net_share_get_info
,
240 WERR_GENERAL_FAILURE
);
244 if (!W_ERROR_IS_OK(result
))
249 info
->switch_value
= info_level
;
254 SRV_SHARE_INFO_1
*info1
= &info
->share
.info1
;
255 SH_INFO_1_STR
*info1_str
= &info1
->info_1_str
;
259 info
->share
.info1
= r
.info
.share
.info1
;
261 /* Duplicate strings */
263 s
= unistr2_tdup(mem_ctx
, &info1_str
->uni_netname
);
265 init_unistr2(&info1_str
->uni_netname
,
266 s
, UNI_STR_TERMINATE
);
268 s
= unistr2_tdup(mem_ctx
, &info1_str
->uni_remark
);
270 init_unistr2(&info1_str
->uni_remark
,
271 s
, UNI_STR_TERMINATE
);
277 SRV_SHARE_INFO_2
*info2
= &info
->share
.info2
;
278 SH_INFO_2_STR
*info2_str
= &info2
->info_2_str
;
282 info
->share
.info2
= r
.info
.share
.info2
;
284 /* Duplicate strings */
286 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_netname
);
288 init_unistr2(&info2_str
->uni_netname
,
289 s
, UNI_STR_TERMINATE
);
291 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_remark
);
293 init_unistr2(&info2_str
->uni_remark
,
294 s
, UNI_STR_TERMINATE
);
296 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_path
);
298 init_unistr2(&info2_str
->uni_path
,
299 s
, UNI_STR_TERMINATE
);
301 s
= unistr2_tdup(mem_ctx
, &info2_str
->uni_passwd
);
303 init_unistr2(&info2_str
->uni_passwd
,
304 s
, UNI_STR_TERMINATE
);
311 SRV_SHARE_INFO_502
*info502
= &info
->share
.info502
;
312 SH_INFO_502_STR
*info502_str
= &info502
->info_502_str
;
316 info
->share
.info502
= r
.info
.share
.info502
;
318 /* Duplicate strings */
320 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_netname
);
322 init_unistr2(&info502_str
->uni_netname
,
323 s
, UNI_STR_TERMINATE
);
325 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_remark
);
327 init_unistr2(&info502_str
->uni_remark
,
328 s
, UNI_STR_TERMINATE
);
330 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_path
);
332 init_unistr2(&info502_str
->uni_path
,
333 s
, UNI_STR_TERMINATE
);
335 s
= unistr2_tdup(mem_ctx
, &info502_str
->uni_passwd
);
337 init_unistr2(&info502_str
->uni_passwd
,
338 s
, UNI_STR_TERMINATE
);
340 info502_str
->sd
= dup_sec_desc(mem_ctx
, info502_str
->sd
);
344 DEBUG(0,("unimplemented info-level: %d\n", info_level
));
353 WERROR
rpccli_srvsvc_net_share_set_info(struct rpc_pipe_client
*cli
,
355 const char *sharename
,
357 SRV_SHARE_INFO
*info
)
359 prs_struct qbuf
, rbuf
;
360 SRV_Q_NET_SHARE_SET_INFO q
;
361 SRV_R_NET_SHARE_SET_INFO r
;
362 WERROR result
= W_ERROR(ERRgeneral
);
368 /* Initialise input parameters */
370 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
373 init_srv_q_net_share_set_info(&q
, server
, sharename
, info_level
, info
);
375 /* Marshall data and send request */
377 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_SET_INFO
,
380 srv_io_q_net_share_set_info
,
381 srv_io_r_net_share_set_info
,
382 WERR_GENERAL_FAILURE
);
388 WERROR
rpccli_srvsvc_net_share_del(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
389 const char *sharename
)
391 prs_struct qbuf
, rbuf
;
392 SRV_Q_NET_SHARE_DEL q
;
393 SRV_R_NET_SHARE_DEL r
;
394 WERROR result
= W_ERROR(ERRgeneral
);
400 /* Initialise input parameters */
402 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
405 init_srv_q_net_share_del(&q
, server
, sharename
);
407 /* Marshall data and send request */
409 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_DEL
,
412 srv_io_q_net_share_del
,
413 srv_io_r_net_share_del
,
414 WERR_GENERAL_FAILURE
);
420 WERROR
rpccli_srvsvc_net_share_add(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
421 const char *netname
, uint32 type
,
422 const char *remark
, uint32 perms
,
423 uint32 max_uses
, uint32 num_uses
,
424 const char *path
, const char *passwd
,
425 int level
, SEC_DESC
*sd
)
427 prs_struct qbuf
, rbuf
;
428 SRV_Q_NET_SHARE_ADD q
;
429 SRV_R_NET_SHARE_ADD r
;
430 WERROR result
= W_ERROR(ERRgeneral
);
436 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
439 init_srv_q_net_share_add(&q
,server
, netname
, type
, remark
,
440 perms
, max_uses
, num_uses
, path
, passwd
,
443 /* Marshall data and send request */
445 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_SHARE_ADD
,
448 srv_io_q_net_share_add
,
449 srv_io_r_net_share_add
,
450 WERR_GENERAL_FAILURE
);
456 WERROR
rpccli_srvsvc_net_remote_tod(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
457 char *server
, TIME_OF_DAY_INFO
*tod
)
459 prs_struct qbuf
, rbuf
;
460 SRV_Q_NET_REMOTE_TOD q
;
461 SRV_R_NET_REMOTE_TOD r
;
462 WERROR result
= W_ERROR(ERRgeneral
);
463 fstring server_slash
;
468 /* Initialise input parameters */
470 slprintf(server_slash
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
471 strupper_m(server_slash
);
473 init_srv_q_net_remote_tod(&q
, server_slash
);
476 /* Marshall data and send request */
478 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_REMOTE_TOD
,
481 srv_io_q_net_remote_tod
,
482 srv_io_r_net_remote_tod
,
483 WERR_GENERAL_FAILURE
);
489 WERROR
rpccli_srvsvc_net_file_enum(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
490 uint32 file_level
, const char *user_name
,
491 SRV_FILE_INFO_CTR
*ctr
, int preferred_len
,
494 prs_struct qbuf
, rbuf
;
495 SRV_Q_NET_FILE_ENUM q
;
496 SRV_R_NET_FILE_ENUM r
;
497 WERROR result
= W_ERROR(ERRgeneral
);
504 /* Initialise input parameters */
506 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
509 init_srv_q_net_file_enum(&q
, server
, NULL
, user_name
,
510 file_level
, ctr
, preferred_len
, hnd
);
512 /* Marshall data and send request */
514 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_FILE_ENUM
,
517 srv_io_q_net_file_enum
,
518 srv_io_r_net_file_enum
,
519 WERR_GENERAL_FAILURE
);
523 if (!W_ERROR_IS_OK(result
))
526 /* copy the data over to the ctr */
530 ctr
->switch_value
= file_level
;
532 ctr
->num_entries
= ctr
->num_entries2
= r
.ctr
.num_entries
;
536 ctr
->file
.info3
= TALLOC_ARRAY(mem_ctx
, SRV_FILE_INFO_3
, ctr
->num_entries
);
538 memset(ctr
->file
.info3
, 0,
539 sizeof(SRV_FILE_INFO_3
) * ctr
->num_entries
);
541 for (i
= 0; i
< r
.ctr
.num_entries
; i
++) {
542 SRV_FILE_INFO_3
*info3
= &ctr
->file
.info3
[i
];
545 /* Copy pointer crap */
547 memcpy(&info3
->info_3
, &r
.ctr
.file
.info3
[i
].info_3
,
548 sizeof(FILE_INFO_3
));
550 /* Duplicate strings */
552 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.file
.info3
[i
].info_3_str
.uni_path_name
);
554 init_unistr2(&info3
->info_3_str
.uni_path_name
, s
, UNI_STR_TERMINATE
);
556 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.file
.info3
[i
].info_3_str
.uni_user_name
);
558 init_unistr2(&info3
->info_3_str
.uni_user_name
, s
, UNI_STR_TERMINATE
);
569 WERROR
rpccli_srvsvc_net_file_close(struct rpc_pipe_client
*cli
, TALLOC_CTX
*mem_ctx
,
572 prs_struct qbuf
, rbuf
;
573 SRV_Q_NET_FILE_CLOSE q
;
574 SRV_R_NET_FILE_CLOSE r
;
575 WERROR result
= W_ERROR(ERRgeneral
);
581 /* Initialise input parameters */
583 slprintf(server
, sizeof(fstring
)-1, "\\\\%s", cli
->cli
->desthost
);
586 init_srv_q_net_file_close(&q
, server
, file_id
);
588 /* Marshall data and send request */
590 CLI_DO_RPC_WERR(cli
, mem_ctx
, PI_SRVSVC
, SRV_NET_FILE_CLOSE
,
593 srv_io_q_net_file_close
,
594 srv_io_r_net_file_close
,
595 WERR_GENERAL_FAILURE
);