2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1997,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
7 * Copyright (C) Paul Ashton 1997.
8 * Copyright (C) Jeremy Allison 1999.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 /****************************************************************************
28 do a server net conn enum
29 ****************************************************************************/
30 BOOL do_srv_net_srv_conn_enum(struct cli_state *cli,
31 char *server_name, char *qual_name,
32 uint32 switch_value, SRV_CONN_INFO_CTR *ctr,
38 SRV_Q_NET_CONN_ENUM q_o;
39 SRV_R_NET_CONN_ENUM r_o;
41 if (server_name == NULL || ctr == NULL || preferred_len == 0)
44 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
45 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
47 /* create and send a MSRPC command with api SRV_NETCONNENUM */
49 DEBUG(4,("SRV Net Server Connection Enum(%s, %s), level %d, enum:%8x\n",
50 server_name, qual_name, switch_value, get_enum_hnd(hnd)));
52 ctr->switch_value = switch_value;
53 ctr->ptr_conn_ctr = 1;
54 ctr->conn.info0.num_entries_read = 0;
55 ctr->conn.info0.ptr_conn_info = 1;
57 /* store the parameters */
58 init_srv_q_net_conn_enum(&q_o, server_name, qual_name,
63 /* turn parameters into data stream */
64 if(!srv_io_q_net_conn_enum("", &q_o, &data, 0)) {
70 /* send the data on \PIPE\ */
71 if(!rpc_api_pipe_req(cli, SRV_NETCONNENUM, &data, &rdata)) {
81 if(!srv_io_r_net_conn_enum("", &r_o, &rdata, 0)) {
86 if (r_o.status != 0) {
87 /* report error code */
88 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: %s\n", get_nt_error_msg(r_o.status)));
93 if (r_o.ctr->switch_value != switch_value) {
94 /* different switch levels. oops. */
95 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: info class %d does not match request %d\n",
96 r_o.ctr->switch_value, switch_value));
101 prs_mem_free(&rdata);
106 /****************************************************************************
107 do a server net sess enum
108 ****************************************************************************/
110 BOOL do_srv_net_srv_sess_enum(struct cli_state *cli,
111 char *server_name, char *qual_name,
112 uint32 switch_value, SRV_SESS_INFO_CTR *ctr,
113 uint32 preferred_len,
118 SRV_Q_NET_SESS_ENUM q_o;
119 SRV_R_NET_SESS_ENUM r_o;
121 if (server_name == NULL || ctr == NULL || preferred_len == 0)
124 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
125 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
127 /* create and send a MSRPC command with api SRV_NETSESSENUM */
129 DEBUG(4,("SRV Net Session Enum (%s), level %d, enum:%8x\n",
130 server_name, switch_value, get_enum_hnd(hnd)));
132 ctr->switch_value = switch_value;
133 ctr->ptr_sess_ctr = 1;
134 ctr->sess.info0.num_entries_read = 0;
135 ctr->sess.info0.ptr_sess_info = 1;
137 /* store the parameters */
138 init_srv_q_net_sess_enum(&q_o, server_name, qual_name,
143 /* turn parameters into data stream */
144 if(!srv_io_q_net_sess_enum("", &q_o, &data, 0)) {
146 prs_mem_free(&rdata);
150 /* send the data on \PIPE\ */
151 if (!rpc_api_pipe_req(cli, SRV_NETSESSENUM, &data, &rdata)) {
153 prs_mem_free(&rdata);
161 if(!srv_io_r_net_sess_enum("", &r_o, &rdata, 0)) {
162 prs_mem_free(&rdata);
166 if (r_o.status != 0) {
167 /* report error code */
168 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", get_nt_error_msg(r_o.status)));
169 prs_mem_free(&rdata);
173 if (r_o.ctr->switch_value != switch_value) {
174 /* different switch levels. oops. */
175 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: info class %d does not match request %d\n",
176 r_o.ctr->switch_value, switch_value));
177 prs_mem_free(&rdata);
181 prs_mem_free(&rdata);
186 /****************************************************************************
187 do a server net share enum
188 ****************************************************************************/
189 BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
191 uint32 switch_value, SRV_R_NET_SHARE_ENUM *r_o,
192 uint32 preferred_len, ENUM_HND *hnd)
196 SRV_Q_NET_SHARE_ENUM q_o;
198 if (server_name == NULL || preferred_len == 0)
201 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
202 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
204 /* create and send a MSRPC command with api SRV_NETSHAREENUM */
206 DEBUG(4,("SRV Get Share Info (%s), level %d, enum:%8x\n",
207 server_name, switch_value, get_enum_hnd(hnd)));
209 /* store the parameters */
210 init_srv_q_net_share_enum(&q_o, server_name, switch_value,
213 /* turn parameters into data stream */
214 if(!srv_io_q_net_share_enum("", &q_o, &data, 0)) {
216 prs_mem_free(&rdata);
220 /* send the data on \PIPE\ */
221 if (!rpc_api_pipe_req(cli, SRV_NETSHAREENUM, &data, &rdata)) {
223 prs_mem_free(&rdata);
229 if(!srv_io_r_net_share_enum("", r_o, &rdata, 0)) {
230 prs_mem_free(&rdata);
234 if (r_o->status != 0) {
235 /* report error code */
236 DEBUG(0,("SRV_R_NET_SHARE_ENUM: %s\n", get_nt_error_msg(r_o->status)));
237 prs_mem_free(&rdata);
241 if (r_o->ctr.switch_value != switch_value) {
242 /* different switch levels. oops. */
243 DEBUG(0,("SRV_R_NET_SHARE_ENUM: info class %d does not match request %d\n",
244 r_o->ctr.switch_value, switch_value));
245 prs_mem_free(&rdata);
249 prs_mem_free(&rdata);
254 /****************************************************************************
255 do a server net file enum
256 ****************************************************************************/
258 BOOL do_srv_net_srv_file_enum(struct cli_state *cli,
259 char *server_name, char *qual_name,
260 uint32 switch_value, SRV_FILE_INFO_CTR *ctr,
261 uint32 preferred_len,
266 SRV_Q_NET_FILE_ENUM q_o;
267 SRV_R_NET_FILE_ENUM r_o;
269 if (server_name == NULL || ctr == NULL || preferred_len == 0)
272 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
273 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
275 /* create and send a MSRPC command with api SRV_NETFILEENUM */
277 DEBUG(4,("SRV Get File Info (%s), level %d, enum:%8x\n",
278 server_name, switch_value, get_enum_hnd(hnd)));
280 q_o.file_level = switch_value;
282 ctr->switch_value = switch_value;
283 ctr->ptr_file_ctr = 1;
284 ctr->file.info3.num_entries_read = 0;
285 ctr->file.info3.ptr_file_info = 1;
287 /* store the parameters */
288 init_srv_q_net_file_enum(&q_o, server_name, qual_name,
293 /* turn parameters into data stream */
294 if(!srv_io_q_net_file_enum("", &q_o, &data, 0)) {
296 prs_mem_free(&rdata);
300 /* send the data on \PIPE\ */
301 if (!rpc_api_pipe_req(cli, SRV_NETFILEENUM, &data, &rdata)) {
303 prs_mem_free(&rdata);
311 if(!srv_io_r_net_file_enum("", &r_o, &rdata, 0)) {
312 prs_mem_free(&rdata);
316 if (r_o.status != 0) {
317 /* report error code */
318 DEBUG(0,("SRV_R_NET_FILE_ENUM: %s\n", get_nt_error_msg(r_o.status)));
319 prs_mem_free(&rdata);
323 if (r_o.ctr->switch_value != switch_value) {
324 /* different switch levels. oops. */
325 DEBUG(0,("SRV_R_NET_FILE_ENUM: info class %d does not match request %d\n",
326 r_o.ctr->switch_value, switch_value));
327 prs_mem_free(&rdata);
331 prs_mem_free(&rdata);
336 /****************************************************************************
338 ****************************************************************************/
339 BOOL do_srv_net_srv_get_info(struct cli_state *cli,
340 char *server_name, uint32 switch_value, SRV_INFO_CTR *ctr)
344 SRV_Q_NET_SRV_GET_INFO q_o;
345 SRV_R_NET_SRV_GET_INFO r_o;
347 if (server_name == NULL || switch_value == 0 || ctr == NULL)
350 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
351 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
353 /* create and send a MSRPC command with api SRV_NET_SRV_GET_INFO */
355 DEBUG(4,("SRV Get Server Info (%s), level %d\n", server_name, switch_value));
357 /* store the parameters */
358 init_srv_q_net_srv_get_info(&q_o, server_name, switch_value);
360 /* turn parameters into data stream */
361 if(!srv_io_q_net_srv_get_info("", &q_o, &data, 0)) {
363 prs_mem_free(&rdata);
367 /* send the data on \PIPE\ */
368 if (!rpc_api_pipe_req(cli, SRV_NET_SRV_GET_INFO, &data, &rdata)) {
370 prs_mem_free(&rdata);
378 if(!srv_io_r_net_srv_get_info("", &r_o, &rdata, 0)) {
379 prs_mem_free(&rdata);
383 if (r_o.status != 0) {
384 /* report error code */
385 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
386 prs_mem_free(&rdata);
390 if (r_o.ctr->switch_value != q_o.switch_value) {
391 /* different switch levels. oops. */
392 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: info class %d does not match request %d\n",
393 r_o.ctr->switch_value, q_o.switch_value));
394 prs_mem_free(&rdata);
398 prs_mem_free(&rdata);