2 Unix SMB/CIFS implementation.
3 NT Domain Authentication SMB / MSRPC client
4 Copyright (C) Andrew Tridgell 1994-2000
5 Copyright (C) Luke Kenneth Casson Leighton 1996-2000
6 Copyright (C) Tim Potter 2001
7 Copyright (C) Jim McDonough 2002
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 NTSTATUS
cli_srvsvc_net_srv_get_info(struct cli_state
*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
;
38 /* Initialise parse structures */
40 prs_init(&qbuf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
41 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
43 /* Initialise input parameters */
45 init_srv_q_net_srv_get_info(&q
, cli
->srv_name_slash
, switch_value
);
47 /* Marshall data and send request */
49 if (!srv_io_q_net_srv_get_info("", &q
, &qbuf
, 0) ||
50 !rpc_api_pipe_req(cli
, SRV_NET_SRV_GET_INFO
, &qbuf
, &rbuf
)) {
51 result
= NT_STATUS_UNSUCCESSFUL
;
55 /* Unmarshall response */
59 if (!srv_io_r_net_srv_get_info("", &r
, &rbuf
, 0)) {
60 result
= NT_STATUS_UNSUCCESSFUL
;
64 result
= werror_to_ntstatus(r
.status
);
73 WERROR
cli_srvsvc_net_share_enum(struct cli_state
*cli
, TALLOC_CTX
*mem_ctx
,
74 uint32 info_level
, SRV_SHARE_INFO_CTR
*ctr
,
75 int preferred_len
, ENUM_HND
*hnd
)
77 prs_struct qbuf
, rbuf
;
78 SRV_Q_NET_SHARE_ENUM q
;
79 SRV_R_NET_SHARE_ENUM r
;
80 WERROR result
= W_ERROR(ERRgeneral
);
86 /* Initialise parse structures */
88 prs_init(&qbuf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
89 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
91 /* Initialise input parameters */
93 init_srv_q_net_share_enum(
94 &q
, cli
->srv_name_slash
, info_level
, preferred_len
, hnd
);
96 /* Marshall data and send request */
98 if (!srv_io_q_net_share_enum("", &q
, &qbuf
, 0) ||
99 !rpc_api_pipe_req(cli
, SRV_NET_SHARE_ENUM_ALL
, &qbuf
, &rbuf
))
102 /* Unmarshall response */
104 if (!srv_io_r_net_share_enum("", &r
, &rbuf
, 0))
109 if (!W_ERROR_IS_OK(result
))
112 /* Oh yuck yuck yuck - we have to copy all the info out of the
113 SRV_SHARE_INFO_CTR in the SRV_R_NET_SHARE_ENUM as when we do a
114 prs_mem_free() it will all be invalidated. The various share
115 info structures suck badly too. This really is gross. */
119 if (!r
.ctr
.num_entries
)
122 ctr
->info_level
= info_level
;
123 ctr
->num_entries
= r
.ctr
.num_entries
;
127 ctr
->share
.info1
= (SRV_SHARE_INFO_1
*)talloc(
128 mem_ctx
, sizeof(SRV_SHARE_INFO_1
) * ctr
->num_entries
);
130 memset(ctr
->share
.info1
, 0, sizeof(SRV_SHARE_INFO_1
));
132 for (i
= 0; i
< ctr
->num_entries
; i
++) {
133 SRV_SHARE_INFO_1
*info1
= &ctr
->share
.info1
[i
];
136 /* Copy pointer crap */
138 memcpy(&info1
->info_1
, &r
.ctr
.share
.info1
[i
].info_1
,
141 /* Duplicate strings */
143 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info1
[i
].info_1_str
.uni_netname
);
145 init_unistr2(&info1
->info_1_str
.uni_netname
, s
, strlen(s
) + 1);
147 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info1
[i
].info_1_str
.uni_remark
);
149 init_unistr2(&info1
->info_1_str
.uni_remark
, s
, strlen(s
) + 1);
155 ctr
->share
.info2
= (SRV_SHARE_INFO_2
*)talloc(
156 mem_ctx
, sizeof(SRV_SHARE_INFO_2
) * ctr
->num_entries
);
158 memset(ctr
->share
.info2
, 0, sizeof(SRV_SHARE_INFO_2
));
160 for (i
= 0; i
< ctr
->num_entries
; i
++) {
161 SRV_SHARE_INFO_2
*info2
= &ctr
->share
.info2
[i
];
164 /* Copy pointer crap */
166 memcpy(&info2
->info_2
, &r
.ctr
.share
.info2
[i
].info_2
,
169 /* Duplicate strings */
171 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_netname
);
173 init_unistr2(&info2
->info_2_str
.uni_netname
, s
, strlen(s
) + 1);
175 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_remark
);
177 init_unistr2(&info2
->info_2_str
.uni_remark
, s
, strlen(s
) + 1);
179 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_path
);
181 init_unistr2(&info2
->info_2_str
.uni_path
, s
, strlen(s
) + 1);
183 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.share
.info2
[i
].info_2_str
.uni_passwd
);
185 init_unistr2(&info2
->info_2_str
.uni_passwd
, s
, strlen(s
) + 1);
196 WERROR
cli_srvsvc_net_share_del(struct cli_state
*cli
, TALLOC_CTX
*mem_ctx
,
197 const char *sharename
)
199 prs_struct qbuf
, rbuf
;
200 SRV_Q_NET_SHARE_DEL q
;
201 SRV_R_NET_SHARE_DEL r
;
202 WERROR result
= W_ERROR(ERRgeneral
);
207 /* Initialise parse structures */
209 prs_init(&qbuf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
210 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
212 /* Initialise input parameters */
214 init_srv_q_net_share_del(&q
, cli
->srv_name_slash
, sharename
);
216 /* Marshall data and send request */
218 if (!srv_io_q_net_share_del("", &q
, &qbuf
, 0) ||
219 !rpc_api_pipe_req(cli
, SRV_NET_SHARE_DEL
, &qbuf
, &rbuf
))
222 /* Unmarshall response */
224 if (!srv_io_r_net_share_del("", &r
, &rbuf
, 0))
236 WERROR
cli_srvsvc_net_share_add(struct cli_state
*cli
, TALLOC_CTX
*mem_ctx
,
237 char *netname
, uint32 type
, char *remark
,
238 uint32 perms
, uint32 max_uses
, uint32 num_uses
,
239 char *path
, char *passwd
)
241 prs_struct qbuf
, rbuf
;
242 SRV_Q_NET_SHARE_ADD q
;
243 SRV_R_NET_SHARE_ADD r
;
244 WERROR result
= W_ERROR(ERRgeneral
);
249 /* Initialise parse structures */
251 prs_init(&qbuf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
252 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
254 init_srv_q_net_share_add(&q
,cli
->srv_name_slash
, netname
, type
, remark
,
255 perms
, max_uses
, num_uses
, path
, passwd
);
257 /* Marshall data and send request */
259 if (!srv_io_q_net_share_add("", &q
, &qbuf
, 0) ||
260 !rpc_api_pipe_req(cli
, SRV_NET_SHARE_ADD
, &qbuf
, &rbuf
))
263 /* Unmarshall response */
265 if (!srv_io_r_net_share_add("", &r
, &rbuf
, 0))
277 WERROR
cli_srvsvc_net_remote_tod(struct cli_state
*cli
, TALLOC_CTX
*mem_ctx
,
278 char *server
, TIME_OF_DAY_INFO
*tod
)
280 prs_struct qbuf
, rbuf
;
281 SRV_Q_NET_REMOTE_TOD q
;
282 SRV_R_NET_REMOTE_TOD r
;
283 WERROR result
= W_ERROR(ERRgeneral
);
288 /* Initialise parse structures */
290 prs_init(&qbuf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
291 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
293 /* Initialise input parameters */
295 init_srv_q_net_remote_tod(&q
, cli
->srv_name_slash
);
297 /* Marshall data and send request */
299 if (!srv_io_q_net_remote_tod("", &q
, &qbuf
, 0) ||
300 !rpc_api_pipe_req(cli
, SRV_NET_REMOTE_TOD
, &qbuf
, &rbuf
))
303 /* Unmarshall response */
307 if (!srv_io_r_net_remote_tod("", &r
, &rbuf
, 0))
312 if (!W_ERROR_IS_OK(result
))
322 WERROR
cli_srvsvc_net_file_enum(struct cli_state
*cli
, TALLOC_CTX
*mem_ctx
,
323 uint32 file_level
, const char *user_name
,
324 SRV_FILE_INFO_CTR
*ctr
, int preferred_len
,
327 prs_struct qbuf
, rbuf
;
328 SRV_Q_NET_FILE_ENUM q
;
329 SRV_R_NET_FILE_ENUM r
;
330 WERROR result
= W_ERROR(ERRgeneral
);
336 /* Initialise parse structures */
338 prs_init(&qbuf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
339 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
341 /* Initialise input parameters */
343 init_srv_q_net_file_enum(&q
, cli
->srv_name_slash
, NULL
, user_name
,
344 file_level
, ctr
, preferred_len
, hnd
);
346 /* Marshall data and send request */
348 if (!srv_io_q_net_file_enum("", &q
, &qbuf
, 0) ||
349 !rpc_api_pipe_req(cli
, SRV_NET_FILE_ENUM
, &qbuf
, &rbuf
))
352 /* Unmarshall response */
354 if (!srv_io_r_net_file_enum("", &r
, &rbuf
, 0))
359 if (!W_ERROR_IS_OK(result
))
362 /* copy the data over to the ctr */
366 ctr
->switch_value
= file_level
;
368 ctr
->num_entries
= ctr
->num_entries2
= r
.ctr
.num_entries
;
372 ctr
->file
.info3
= (SRV_FILE_INFO_3
*)talloc(
373 mem_ctx
, sizeof(SRV_FILE_INFO_3
) * ctr
->num_entries
);
375 memset(ctr
->file
.info3
, 0,
376 sizeof(SRV_FILE_INFO_3
) * ctr
->num_entries
);
378 for (i
= 0; i
< r
.ctr
.num_entries
; i
++) {
379 SRV_FILE_INFO_3
*info3
= &ctr
->file
.info3
[i
];
382 /* Copy pointer crap */
384 memcpy(&info3
->info_3
, &r
.ctr
.file
.info3
[i
].info_3
,
385 sizeof(FILE_INFO_3
));
387 /* Duplicate strings */
389 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.file
.info3
[i
].info_3_str
.uni_path_name
);
391 init_unistr2(&info3
->info_3_str
.uni_path_name
, s
, strlen(s
) + 1);
393 s
= unistr2_tdup(mem_ctx
, &r
.ctr
.file
.info3
[i
].info_3_str
.uni_user_name
);
395 init_unistr2(&info3
->info_3_str
.uni_user_name
, s
, strlen(s
) + 1);
409 WERROR
cli_srvsvc_net_file_close(struct cli_state
*cli
, TALLOC_CTX
*mem_ctx
,
412 prs_struct qbuf
, rbuf
;
413 SRV_Q_NET_FILE_CLOSE q
;
414 SRV_R_NET_FILE_CLOSE r
;
415 WERROR result
= W_ERROR(ERRgeneral
);
420 /* Initialise parse structures */
422 prs_init(&qbuf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
423 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
425 /* Initialise input parameters */
427 init_srv_q_net_file_close(&q
, cli
->srv_name_slash
, file_id
);
429 /* Marshall data and send request */
431 if (!srv_io_q_net_file_close("", &q
, &qbuf
, 0) ||
432 !rpc_api_pipe_req(cli
, SRV_NET_FILE_CLOSE
, &qbuf
, &rbuf
))
435 /* Unmarshall response */
437 if (!srv_io_r_net_file_close("", &r
, &rbuf
, 0))