3 * Unix SMB/Netbios implementation.
5 * RPC Pipe client / server routines
6 * Copyright (C) Andrew Tridgell 1992-1997,
7 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
8 * Copyright (C) Paul Ashton 1997.
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.
32 extern int DEBUGLEVEL;
34 /****************************************************************************
35 do a server net tprt enum
36 ****************************************************************************/
37 BOOL do_srv_net_srv_tprt_enum(struct cli_state *cli, uint16 fnum,
39 uint32 switch_value, SRV_TPRT_INFO_CTR *ctr,
45 SRV_Q_NET_TPRT_ENUM q_o;
46 BOOL valid_enum = False;
48 if (server_name == NULL || ctr == NULL || preferred_len == 0) return False;
50 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
51 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
53 /* create and send a MSRPC command with api SRV_NETTPRTENUM */
55 DEBUG(4,("SRV Net Server Transport Enum(%s), level %d, enum:%8x\n",
56 server_name, switch_value, get_enum_hnd(hnd)));
58 ctr->switch_value = switch_value;
59 ctr->ptr_tprt_ctr = 1;
60 ctr->tprt.info0.num_entries_read = 0;
61 ctr->tprt.info0.ptr_tprt_info = 1;
63 /* store the parameters */
64 make_srv_q_net_tprt_enum(&q_o, server_name,
69 /* turn parameters into data stream */
70 srv_io_q_net_tprt_enum("", &q_o, &data, 0);
72 /* send the data on \PIPE\ */
73 if (rpc_api_pipe_req(cli, fnum, SRV_NETTRANSPORTENUM, &data, &rdata))
75 SRV_R_NET_TPRT_ENUM r_o;
80 srv_io_r_net_tprt_enum("", &r_o, &rdata, 0);
81 p = rdata.offset != 0;
83 if (p && r_o.status != 0)
85 /* report error code */
86 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
90 if (p && r_o.ctr->switch_value != switch_value)
92 /* different switch levels. oops. */
93 DEBUG(0,("SRV_R_NET_SRV_TPRT_ENUM: info class %d does not match request %d\n",
94 r_o.ctr->switch_value, switch_value));
100 /* ok, at last: we're happy. */
105 prs_mem_free(&data );
106 prs_mem_free(&rdata );
111 /****************************************************************************
112 do a server net conn enum
113 ****************************************************************************/
114 BOOL do_srv_net_srv_conn_enum(struct cli_state *cli, uint16 fnum,
115 char *server_name, char *qual_name,
116 uint32 switch_value, SRV_CONN_INFO_CTR *ctr,
117 uint32 preferred_len,
122 SRV_Q_NET_CONN_ENUM q_o;
123 BOOL valid_enum = False;
125 if (server_name == NULL || ctr == NULL || preferred_len == 0) return False;
127 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
128 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
130 /* create and send a MSRPC command with api SRV_NETCONNENUM */
132 DEBUG(4,("SRV Net Server Connection Enum(%s, %s), level %d, enum:%8x\n",
133 server_name, qual_name, switch_value, get_enum_hnd(hnd)));
135 ctr->switch_value = switch_value;
136 ctr->ptr_conn_ctr = 1;
137 ctr->conn.info0.num_entries_read = 0;
138 ctr->conn.info0.ptr_conn_info = 1;
140 /* store the parameters */
141 make_srv_q_net_conn_enum(&q_o, server_name, qual_name,
146 /* turn parameters into data stream */
147 srv_io_q_net_conn_enum("", &q_o, &data, 0);
149 /* send the data on \PIPE\ */
150 if (rpc_api_pipe_req(cli, fnum, SRV_NETCONNENUM, &data, &rdata))
152 SRV_R_NET_CONN_ENUM r_o;
157 srv_io_r_net_conn_enum("", &r_o, &rdata, 0);
158 p = rdata.offset != 0;
160 if (p && r_o.status != 0)
162 /* report error code */
163 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
167 if (p && r_o.ctr->switch_value != switch_value)
169 /* different switch levels. oops. */
170 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: info class %d does not match request %d\n",
171 r_o.ctr->switch_value, switch_value));
177 /* ok, at last: we're happy. */
182 prs_mem_free(&data );
183 prs_mem_free(&rdata );
188 /****************************************************************************
189 do a server net sess enum
190 ****************************************************************************/
191 BOOL do_srv_net_srv_sess_enum(struct cli_state *cli, uint16 fnum,
192 char *server_name, char *qual_name, char *user_name,
193 uint32 switch_value, SRV_SESS_INFO_CTR *ctr,
194 uint32 preferred_len,
199 SRV_Q_NET_SESS_ENUM q_o;
200 BOOL valid_enum = False;
202 if (server_name == NULL || ctr == NULL || preferred_len == 0) return False;
204 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
205 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
207 /* create and send a MSRPC command with api SRV_NETSESSENUM */
209 DEBUG(4,("SRV Net Session Enum (%s), level %d, enum:%8x\n",
210 server_name, switch_value, get_enum_hnd(hnd)));
212 ctr->switch_value = switch_value;
213 ctr->ptr_sess_ctr = 1;
214 ctr->sess.info0.num_entries_read = 0;
215 ctr->sess.info0.ptr_sess_info = 1;
217 /* store the parameters */
218 make_srv_q_net_sess_enum(&q_o, server_name, qual_name, user_name,
223 /* turn parameters into data stream */
224 srv_io_q_net_sess_enum("", &q_o, &data, 0);
226 /* send the data on \PIPE\ */
227 if (rpc_api_pipe_req(cli, fnum, SRV_NETSESSENUM, &data, &rdata))
229 SRV_R_NET_SESS_ENUM r_o;
234 srv_io_r_net_sess_enum("", &r_o, &rdata, 0);
235 p = rdata.offset != 0;
237 if (p && r_o.status != 0)
239 /* report error code */
240 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", get_nt_error_msg(r_o.status)));
244 if (p && r_o.ctr->switch_value != switch_value)
246 /* different switch levels. oops. */
247 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: info class %d does not match request %d\n",
248 r_o.ctr->switch_value, switch_value));
254 /* ok, at last: we're happy. */
259 prs_mem_free(&data );
260 prs_mem_free(&rdata );
265 /****************************************************************************
266 do a server net share enum
267 ****************************************************************************/
268 BOOL do_srv_net_srv_share_enum(struct cli_state *cli, uint16 fnum,
270 uint32 switch_value, SRV_SHARE_INFO_CTR *ctr,
271 uint32 preferred_len,
276 SRV_Q_NET_SHARE_ENUM q_o;
277 BOOL valid_enum = False;
279 if (server_name == NULL || ctr == NULL || preferred_len == 0) return False;
281 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
282 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
284 /* create and send a MSRPC command with api SRV_NETSHAREENUM */
286 DEBUG(4,("SRV Get Share Info (%s), level %d, enum:%8x\n",
287 server_name, switch_value, get_enum_hnd(hnd)));
289 q_o.share_level = switch_value;
291 ctr->switch_value = switch_value;
292 ctr->ptr_share_ctr = 1;
293 ctr->share.info1.num_entries_read = 0;
294 ctr->share.info1.ptr_share_info = 1;
296 /* store the parameters */
297 make_srv_q_net_share_enum(&q_o, server_name,
302 /* turn parameters into data stream */
303 srv_io_q_net_share_enum("", &q_o, &data, 0);
305 /* send the data on \PIPE\ */
306 if (rpc_api_pipe_req(cli, fnum, SRV_NETSHAREENUM, &data, &rdata))
308 SRV_R_NET_SHARE_ENUM r_o;
313 srv_io_r_net_share_enum("", &r_o, &rdata, 0);
314 p = rdata.offset != 0;
316 if (p && r_o.status != 0)
318 /* report error code */
319 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
323 if (p && r_o.ctr->switch_value != switch_value)
325 /* different switch levels. oops. */
326 DEBUG(0,("SRV_R_NET_SRV_SHARE_ENUM: info class %d does not match request %d\n",
327 r_o.ctr->switch_value, switch_value));
333 /* ok, at last: we're happy. */
338 prs_mem_free(&data );
339 prs_mem_free(&rdata );
344 /****************************************************************************
345 do a server net file enum
346 ****************************************************************************/
347 BOOL do_srv_net_srv_file_enum(struct cli_state *cli, uint16 fnum,
348 char *server_name, char *qual_name, uint32 file_id,
349 uint32 switch_value, SRV_FILE_INFO_CTR *ctr,
350 uint32 preferred_len,
355 SRV_Q_NET_FILE_ENUM q_o;
356 BOOL valid_enum = False;
358 if (server_name == NULL || ctr == NULL || preferred_len == 0) return False;
360 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
361 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
363 /* create and send a MSRPC command with api SRV_NETFILEENUM */
365 DEBUG(4,("SRV Get File Info (%s), level %d, enum:%8x\n",
366 server_name, switch_value, get_enum_hnd(hnd)));
368 q_o.file_level = switch_value;
370 ctr->switch_value = switch_value;
371 ctr->ptr_file_ctr = 1;
372 ctr->file.info3.num_entries_read = 0;
373 ctr->file.info3.ptr_file_info = 1;
375 /* store the parameters */
376 make_srv_q_net_file_enum(&q_o, server_name, qual_name, file_id,
381 /* turn parameters into data stream */
382 srv_io_q_net_file_enum("", &q_o, &data, 0);
384 /* send the data on \PIPE\ */
385 if (rpc_api_pipe_req(cli, fnum, SRV_NETFILEENUM, &data, &rdata))
387 SRV_R_NET_FILE_ENUM r_o;
392 srv_io_r_net_file_enum("", &r_o, &rdata, 0);
393 p = rdata.offset != 0;
395 if (p && r_o.status != 0)
397 /* report error code */
398 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
402 if (p && r_o.ctr->switch_value != switch_value)
404 /* different switch levels. oops. */
405 DEBUG(0,("SRV_R_NET_SRV_FILE_ENUM: info class %d does not match request %d\n",
406 r_o.ctr->switch_value, switch_value));
412 /* ok, at last: we're happy. */
417 prs_mem_free(&data );
418 prs_mem_free(&rdata );
423 /****************************************************************************
425 ****************************************************************************/
426 BOOL do_srv_net_srv_get_info(struct cli_state *cli, uint16 fnum,
427 char *server_name, uint32 switch_value, SRV_INFO_CTR *ctr)
431 SRV_Q_NET_SRV_GET_INFO q_o;
432 BOOL valid_info = False;
434 if (server_name == NULL || switch_value == 0 || ctr == NULL) return False;
436 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
437 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
439 /* create and send a MSRPC command with api SRV_NET_SRV_GET_INFO */
441 DEBUG(4,("SRV Get Server Info (%s), level %d\n", server_name, switch_value));
443 /* store the parameters */
444 make_srv_q_net_srv_get_info(&q_o, server_name, switch_value);
446 /* turn parameters into data stream */
447 srv_io_q_net_srv_get_info("", &q_o, &data, 0);
449 /* send the data on \PIPE\ */
450 if (rpc_api_pipe_req(cli, fnum, SRV_NET_SRV_GET_INFO, &data, &rdata))
452 SRV_R_NET_SRV_GET_INFO r_o;
457 srv_io_r_net_srv_get_info("", &r_o, &rdata, 0);
458 p = rdata.offset != 0;
459 p = rdata.offset != 0;
461 if (p && r_o.status != 0)
463 /* report error code */
464 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
468 if (p && r_o.ctr->switch_value != q_o.switch_value)
470 /* different switch levels. oops. */
471 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: info class %d does not match request %d\n",
472 r_o.ctr->switch_value, q_o.switch_value));
478 /* ok, at last: we're happy. */
483 prs_mem_free(&data );
484 prs_mem_free(&rdata );
489 /****************************************************************************
491 ****************************************************************************/
492 BOOL do_srv_net_remote_tod(struct cli_state *cli, uint16 fnum,
493 char *server_name, TIME_OF_DAY_INFO *tod)
497 SRV_Q_NET_REMOTE_TOD q_t;
498 BOOL valid_info = False;
500 if (server_name == NULL || tod == NULL) return False;
502 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
503 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
505 /* create and send a MSRPC command with api SRV_NET_REMOTE_TOD */
507 DEBUG(4,("SRV Remote TOD (%s)\n", server_name));
509 /* store the parameters */
510 make_srv_q_net_remote_tod(&q_t, server_name);
512 /* turn parameters into data stream */
513 srv_io_q_net_remote_tod("", &q_t, &data, 0);
515 /* send the data on \PIPE\ */
516 if (rpc_api_pipe_req(cli, fnum, SRV_NET_REMOTE_TOD, &data, &rdata))
518 SRV_R_NET_REMOTE_TOD r_t;
523 srv_io_r_net_remote_tod("", &r_t, &rdata, 0);
524 p = rdata.offset != 0;
525 p = rdata.offset != 0;
527 if (p && r_t.status != 0)
529 /* report error code */
530 DEBUG(0,("SRV_R_NET_REMOTE_TOD: %s\n", get_nt_error_msg(r_t.status)));
540 prs_mem_free(&data );
541 prs_mem_free(&rdata );