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(
39 uint32 switch_value, SRV_TPRT_INFO_CTR *ctr,
45 SRV_Q_NET_TPRT_ENUM q_o;
46 BOOL valid_enum = False;
47 struct cli_connection *con = NULL;
49 if (ctr == NULL || preferred_len == 0) return False;
51 if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
56 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
57 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
59 /* create and send a MSRPC command with api SRV_NETTPRTENUM */
61 DEBUG(4,("SRV Net Server Transport Enum, level %d, enum:%8x\n",
62 switch_value, get_enum_hnd(hnd)));
64 ctr->switch_value = switch_value;
65 ctr->ptr_tprt_ctr = 1;
66 ctr->tprt.info0.num_entries_read = 0;
67 ctr->tprt.info0.ptr_tprt_info = 1;
69 /* store the parameters */
70 make_srv_q_net_tprt_enum(&q_o, srv_name,
75 /* turn parameters into data stream */
76 srv_io_q_net_tprt_enum("", &q_o, &data, 0);
78 /* send the data on \PIPE\ */
79 if (rpc_con_pipe_req(con, SRV_NETTRANSPORTENUM, &data, &rdata))
81 SRV_R_NET_TPRT_ENUM r_o;
86 srv_io_r_net_tprt_enum("", &r_o, &rdata, 0);
87 p = rdata.offset != 0;
89 if (p && r_o.status != 0)
91 /* report error code */
92 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
96 if (p && r_o.ctr->switch_value != switch_value)
98 /* different switch levels. oops. */
99 DEBUG(0,("SRV_R_NET_SRV_TPRT_ENUM: info class %d does not match request %d\n",
100 r_o.ctr->switch_value, switch_value));
106 /* ok, at last: we're happy. */
111 prs_mem_free(&data );
112 prs_mem_free(&rdata );
114 cli_connection_unlink(con);
119 /****************************************************************************
120 do a server net conn enum
121 ****************************************************************************/
122 BOOL do_srv_net_srv_conn_enum( char *srv_name, char *qual_name,
123 uint32 switch_value, SRV_CONN_INFO_CTR *ctr,
124 uint32 preferred_len,
129 SRV_Q_NET_CONN_ENUM q_o;
130 BOOL valid_enum = False;
131 struct cli_connection *con = NULL;
133 if (ctr == NULL || preferred_len == 0) return False;
135 if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
140 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
141 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
143 /* create and send a MSRPC command with api SRV_NETCONNENUM */
145 DEBUG(4,("SRV Net Server Connection Enum %s), level %d, enum:%8x\n",
146 qual_name, switch_value, get_enum_hnd(hnd)));
148 ctr->switch_value = switch_value;
149 ctr->ptr_conn_ctr = 1;
150 ctr->conn.info0.num_entries_read = 0;
151 ctr->conn.info0.ptr_conn_info = 1;
153 /* store the parameters */
154 make_srv_q_net_conn_enum(&q_o, srv_name, qual_name,
159 /* turn parameters into data stream */
160 srv_io_q_net_conn_enum("", &q_o, &data, 0);
162 /* send the data on \PIPE\ */
163 if (rpc_con_pipe_req(con, SRV_NETCONNENUM, &data, &rdata))
165 SRV_R_NET_CONN_ENUM r_o;
170 srv_io_r_net_conn_enum("", &r_o, &rdata, 0);
171 p = rdata.offset != 0;
173 if (p && r_o.status != 0)
175 /* report error code */
176 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
180 if (p && r_o.ctr->switch_value != switch_value)
182 /* different switch levels. oops. */
183 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: info class %d does not match request %d\n",
184 r_o.ctr->switch_value, switch_value));
190 /* ok, at last: we're happy. */
195 prs_mem_free(&data );
196 prs_mem_free(&rdata );
198 cli_connection_unlink(con);
203 /****************************************************************************
204 do a server net sess enum
205 ****************************************************************************/
206 BOOL do_srv_net_srv_sess_enum( char *srv_name, char *qual_name, char *user_name,
207 uint32 switch_value, SRV_SESS_INFO_CTR *ctr,
208 uint32 preferred_len,
213 SRV_Q_NET_SESS_ENUM q_o;
214 BOOL valid_enum = False;
215 struct cli_connection *con = NULL;
217 if (ctr == NULL || preferred_len == 0) return False;
219 if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
224 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
225 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
227 /* create and send a MSRPC command with api SRV_NETSESSENUM */
229 DEBUG(4,("SRV Net Session Enum, level %d, enum:%8x\n",
230 switch_value, get_enum_hnd(hnd)));
232 ctr->switch_value = switch_value;
233 ctr->ptr_sess_ctr = 1;
234 ctr->sess.info0.num_entries_read = 0;
235 ctr->sess.info0.ptr_sess_info = 1;
237 /* store the parameters */
238 make_srv_q_net_sess_enum(&q_o, srv_name, qual_name, user_name,
243 /* turn parameters into data stream */
244 srv_io_q_net_sess_enum("", &q_o, &data, 0);
246 /* send the data on \PIPE\ */
247 if (rpc_con_pipe_req(con, SRV_NETSESSENUM, &data, &rdata))
249 SRV_R_NET_SESS_ENUM r_o;
254 srv_io_r_net_sess_enum("", &r_o, &rdata, 0);
255 p = rdata.offset != 0;
257 if (p && r_o.status != 0)
259 /* report error code */
260 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", get_nt_error_msg(r_o.status)));
264 if (p && r_o.ctr->switch_value != switch_value)
266 /* different switch levels. oops. */
267 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: info class %d does not match request %d\n",
268 r_o.ctr->switch_value, switch_value));
274 /* ok, at last: we're happy. */
279 prs_mem_free(&data );
280 prs_mem_free(&rdata );
282 cli_connection_unlink(con);
287 /****************************************************************************
288 do a server net share enum
289 ****************************************************************************/
290 BOOL do_srv_net_srv_share_enum( char *srv_name,
291 uint32 switch_value, SRV_SHARE_INFO_CTR *ctr,
292 uint32 preferred_len,
297 SRV_Q_NET_SHARE_ENUM q_o;
298 BOOL valid_enum = False;
299 struct cli_connection *con = NULL;
301 if (ctr == NULL || preferred_len == 0) return False;
303 if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
308 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
309 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
311 /* create and send a MSRPC command with api SRV_NETSHAREENUM */
313 DEBUG(4,("SRV Get Share Info, level %d, enum:%8x\n",
314 switch_value, get_enum_hnd(hnd)));
316 q_o.share_level = switch_value;
318 ctr->switch_value = switch_value;
319 ctr->ptr_share_ctr = 1;
320 ctr->share.info1.num_entries_read = 0;
321 ctr->share.info1.ptr_share_info = 1;
323 /* store the parameters */
324 make_srv_q_net_share_enum(&q_o, srv_name,
329 /* turn parameters into data stream */
330 srv_io_q_net_share_enum("", &q_o, &data, 0);
332 /* send the data on \PIPE\ */
333 if (rpc_con_pipe_req(con, SRV_NETSHAREENUM, &data, &rdata))
335 SRV_R_NET_SHARE_ENUM r_o;
340 srv_io_r_net_share_enum("", &r_o, &rdata, 0);
341 p = rdata.offset != 0;
343 if (p && r_o.status != 0)
345 /* report error code */
346 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
350 if (p && r_o.ctr->switch_value != switch_value)
352 /* different switch levels. oops. */
353 DEBUG(0,("SRV_R_NET_SRV_SHARE_ENUM: info class %d does not match request %d\n",
354 r_o.ctr->switch_value, switch_value));
360 /* ok, at last: we're happy. */
365 prs_mem_free(&data );
366 prs_mem_free(&rdata );
368 cli_connection_unlink(con);
373 /****************************************************************************
374 do a server net file enum
375 ****************************************************************************/
376 BOOL do_srv_net_srv_file_enum( char *srv_name, char *qual_name, uint32 file_id,
377 uint32 switch_value, SRV_FILE_INFO_CTR *ctr,
378 uint32 preferred_len,
383 SRV_Q_NET_FILE_ENUM q_o;
384 BOOL valid_enum = False;
385 struct cli_connection *con = NULL;
387 if (ctr == NULL || preferred_len == 0) return False;
389 if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
394 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
395 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
397 /* create and send a MSRPC command with api SRV_NETFILEENUM */
399 DEBUG(4,("SRV Get File Info level %d, enum:%8x\n",
400 switch_value, get_enum_hnd(hnd)));
402 q_o.file_level = switch_value;
404 ctr->switch_value = switch_value;
405 ctr->ptr_file_ctr = 1;
406 ctr->file.info3.num_entries_read = 0;
407 ctr->file.info3.ptr_file_info = 1;
409 /* store the parameters */
410 make_srv_q_net_file_enum(&q_o, srv_name, qual_name, file_id,
415 /* turn parameters into data stream */
416 srv_io_q_net_file_enum("", &q_o, &data, 0);
418 /* send the data on \PIPE\ */
419 if (rpc_con_pipe_req(con, SRV_NETFILEENUM, &data, &rdata))
421 SRV_R_NET_FILE_ENUM r_o;
426 srv_io_r_net_file_enum("", &r_o, &rdata, 0);
427 p = rdata.offset != 0;
429 if (p && r_o.status != 0)
431 /* report error code */
432 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
436 if (p && r_o.ctr->switch_value != switch_value)
438 /* different switch levels. oops. */
439 DEBUG(0,("SRV_R_NET_SRV_FILE_ENUM: info class %d does not match request %d\n",
440 r_o.ctr->switch_value, switch_value));
446 /* ok, at last: we're happy. */
451 prs_mem_free(&data );
452 prs_mem_free(&rdata );
454 cli_connection_unlink(con);
459 /****************************************************************************
461 ****************************************************************************/
462 BOOL do_srv_net_srv_get_info( char *srv_name, uint32 switch_value,
467 SRV_Q_NET_SRV_GET_INFO q_o;
468 BOOL valid_info = False;
469 struct cli_connection *con = NULL;
471 if (switch_value == 0 || ctr == NULL) return False;
473 if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
478 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
479 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
481 /* create and send a MSRPC command with api SRV_NET_SRV_GET_INFO */
483 DEBUG(4,("SRV Get Server Info level %d\n", switch_value));
485 /* store the parameters */
486 make_srv_q_net_srv_get_info(&q_o, srv_name, switch_value);
488 /* turn parameters into data stream */
489 srv_io_q_net_srv_get_info("", &q_o, &data, 0);
491 /* send the data on \PIPE\ */
492 if (rpc_con_pipe_req(con, SRV_NET_SRV_GET_INFO, &data, &rdata))
494 SRV_R_NET_SRV_GET_INFO r_o;
499 srv_io_r_net_srv_get_info("", &r_o, &rdata, 0);
500 p = rdata.offset != 0;
501 p = rdata.offset != 0;
503 if (p && r_o.status != 0)
505 /* report error code */
506 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
510 if (p && r_o.ctr->switch_value != q_o.switch_value)
512 /* different switch levels. oops. */
513 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: info class %d does not match request %d\n",
514 r_o.ctr->switch_value, q_o.switch_value));
520 /* ok, at last: we're happy. */
525 prs_mem_free(&data );
526 prs_mem_free(&rdata );
528 cli_connection_unlink(con);
533 /****************************************************************************
535 ****************************************************************************/
536 BOOL do_srv_net_remote_tod( char *srv_name, TIME_OF_DAY_INFO *tod)
540 SRV_Q_NET_REMOTE_TOD q_t;
541 BOOL valid_info = False;
542 struct cli_connection *con = NULL;
544 if (tod == NULL) return False;
546 if (!cli_connection_init(srv_name, PIPE_SRVSVC, &con))
551 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
552 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
554 /* create and send a MSRPC command with api SRV_NET_REMOTE_TOD */
556 DEBUG(4,("SRV Remote TOD (%s)\n", srv_name));
558 /* store the parameters */
559 make_srv_q_net_remote_tod(&q_t, srv_name);
561 /* turn parameters into data stream */
562 srv_io_q_net_remote_tod("", &q_t, &data, 0);
564 /* send the data on \PIPE\ */
565 if (rpc_con_pipe_req(con, SRV_NET_REMOTE_TOD, &data, &rdata))
567 SRV_R_NET_REMOTE_TOD r_t;
572 srv_io_r_net_remote_tod("", &r_t, &rdata, 0);
573 p = rdata.offset != 0;
574 p = rdata.offset != 0;
576 if (p && r_t.status != 0)
578 /* report error code */
579 DEBUG(0,("SRV_R_NET_REMOTE_TOD: %s\n", get_nt_error_msg(r_t.status)));
589 prs_mem_free(&data );
590 prs_mem_free(&rdata );
592 cli_connection_unlink(con);