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.
31 /****************************************************************************
32 do a server net conn enum
33 ****************************************************************************/
34 BOOL do_srv_net_srv_conn_enum(struct cli_state *cli,
35 char *server_name, char *qual_name,
36 uint32 switch_value, SRV_CONN_INFO_CTR *ctr,
42 SRV_Q_NET_CONN_ENUM q_o;
43 SRV_R_NET_CONN_ENUM r_o;
45 if (server_name == NULL || ctr == NULL || preferred_len == 0)
48 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
49 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
51 /* create and send a MSRPC command with api SRV_NETCONNENUM */
53 DEBUG(4,("SRV Net Server Connection Enum(%s, %s), level %d, enum:%8x\n",
54 server_name, qual_name, switch_value, get_enum_hnd(hnd)));
56 ctr->switch_value = switch_value;
57 ctr->ptr_conn_ctr = 1;
58 ctr->conn.info0.num_entries_read = 0;
59 ctr->conn.info0.ptr_conn_info = 1;
61 /* store the parameters */
62 init_srv_q_net_conn_enum(&q_o, server_name, qual_name,
67 /* turn parameters into data stream */
68 if(!srv_io_q_net_conn_enum("", &q_o, &data, 0)) {
74 /* send the data on \PIPE\ */
75 if(!rpc_api_pipe_req(cli, SRV_NETCONNENUM, &data, &rdata)) {
85 if(!srv_io_r_net_conn_enum("", &r_o, &rdata, 0)) {
90 if (r_o.status != 0) {
91 /* report error code */
92 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: %s\n", get_nt_error_msg(r_o.status)));
97 if (r_o.ctr->switch_value != switch_value) {
98 /* different switch levels. oops. */
99 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: info class %d does not match request %d\n",
100 r_o.ctr->switch_value, switch_value));
101 prs_mem_free(&rdata);
105 prs_mem_free(&rdata);
110 /****************************************************************************
111 do a server net sess enum
112 ****************************************************************************/
114 BOOL do_srv_net_srv_sess_enum(struct cli_state *cli,
115 char *server_name, char *qual_name,
116 uint32 switch_value, SRV_SESS_INFO_CTR *ctr,
117 uint32 preferred_len,
122 SRV_Q_NET_SESS_ENUM q_o;
123 SRV_R_NET_SESS_ENUM r_o;
125 if (server_name == NULL || ctr == NULL || preferred_len == 0)
128 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
129 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
131 /* create and send a MSRPC command with api SRV_NETSESSENUM */
133 DEBUG(4,("SRV Net Session Enum (%s), level %d, enum:%8x\n",
134 server_name, switch_value, get_enum_hnd(hnd)));
136 ctr->switch_value = switch_value;
137 ctr->ptr_sess_ctr = 1;
138 ctr->sess.info0.num_entries_read = 0;
139 ctr->sess.info0.ptr_sess_info = 1;
141 /* store the parameters */
142 init_srv_q_net_sess_enum(&q_o, server_name, qual_name,
147 /* turn parameters into data stream */
148 if(!srv_io_q_net_sess_enum("", &q_o, &data, 0)) {
150 prs_mem_free(&rdata);
154 /* send the data on \PIPE\ */
155 if (!rpc_api_pipe_req(cli, SRV_NETSESSENUM, &data, &rdata)) {
157 prs_mem_free(&rdata);
165 if(!srv_io_r_net_sess_enum("", &r_o, &rdata, 0)) {
166 prs_mem_free(&rdata);
170 if (r_o.status != 0) {
171 /* report error code */
172 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", get_nt_error_msg(r_o.status)));
173 prs_mem_free(&rdata);
177 if (r_o.ctr->switch_value != switch_value) {
178 /* different switch levels. oops. */
179 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: info class %d does not match request %d\n",
180 r_o.ctr->switch_value, switch_value));
181 prs_mem_free(&rdata);
185 prs_mem_free(&rdata);
190 /****************************************************************************
191 do a server net share enum
192 ****************************************************************************/
193 BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
195 uint32 switch_value, SRV_R_NET_SHARE_ENUM *r_o,
196 uint32 preferred_len, ENUM_HND *hnd)
200 SRV_Q_NET_SHARE_ENUM q_o;
202 if (server_name == NULL || preferred_len == 0)
205 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
206 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
208 /* create and send a MSRPC command with api SRV_NETSHAREENUM */
210 DEBUG(4,("SRV Get Share Info (%s), level %d, enum:%8x\n",
211 server_name, switch_value, get_enum_hnd(hnd)));
213 /* store the parameters */
214 init_srv_q_net_share_enum(&q_o, server_name, switch_value,
217 /* turn parameters into data stream */
218 if(!srv_io_q_net_share_enum("", &q_o, &data, 0)) {
220 prs_mem_free(&rdata);
224 /* send the data on \PIPE\ */
225 if (!rpc_api_pipe_req(cli, SRV_NETSHAREENUM, &data, &rdata)) {
227 prs_mem_free(&rdata);
233 if(!srv_io_r_net_share_enum("", r_o, &rdata, 0)) {
234 prs_mem_free(&rdata);
238 if (r_o->status != 0) {
239 /* report error code */
240 DEBUG(0,("SRV_R_NET_SHARE_ENUM: %s\n", get_nt_error_msg(r_o->status)));
241 prs_mem_free(&rdata);
245 if (r_o->ctr.switch_value != switch_value) {
246 /* different switch levels. oops. */
247 DEBUG(0,("SRV_R_NET_SHARE_ENUM: info class %d does not match request %d\n",
248 r_o->ctr.switch_value, switch_value));
249 prs_mem_free(&rdata);
253 prs_mem_free(&rdata);
258 /****************************************************************************
259 do a server net file enum
260 ****************************************************************************/
262 BOOL do_srv_net_srv_file_enum(struct cli_state *cli,
263 char *server_name, char *qual_name,
264 uint32 switch_value, SRV_FILE_INFO_CTR *ctr,
265 uint32 preferred_len,
270 SRV_Q_NET_FILE_ENUM q_o;
271 SRV_R_NET_FILE_ENUM r_o;
273 if (server_name == NULL || ctr == NULL || preferred_len == 0)
276 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
277 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
279 /* create and send a MSRPC command with api SRV_NETFILEENUM */
281 DEBUG(4,("SRV Get File Info (%s), level %d, enum:%8x\n",
282 server_name, switch_value, get_enum_hnd(hnd)));
284 q_o.file_level = switch_value;
286 ctr->switch_value = switch_value;
287 ctr->ptr_file_ctr = 1;
288 ctr->file.info3.num_entries_read = 0;
289 ctr->file.info3.ptr_file_info = 1;
291 /* store the parameters */
292 init_srv_q_net_file_enum(&q_o, server_name, qual_name,
297 /* turn parameters into data stream */
298 if(!srv_io_q_net_file_enum("", &q_o, &data, 0)) {
300 prs_mem_free(&rdata);
304 /* send the data on \PIPE\ */
305 if (!rpc_api_pipe_req(cli, SRV_NETFILEENUM, &data, &rdata)) {
307 prs_mem_free(&rdata);
315 if(!srv_io_r_net_file_enum("", &r_o, &rdata, 0)) {
316 prs_mem_free(&rdata);
320 if (r_o.status != 0) {
321 /* report error code */
322 DEBUG(0,("SRV_R_NET_FILE_ENUM: %s\n", get_nt_error_msg(r_o.status)));
323 prs_mem_free(&rdata);
327 if (r_o.ctr->switch_value != switch_value) {
328 /* different switch levels. oops. */
329 DEBUG(0,("SRV_R_NET_FILE_ENUM: info class %d does not match request %d\n",
330 r_o.ctr->switch_value, switch_value));
331 prs_mem_free(&rdata);
335 prs_mem_free(&rdata);
340 /****************************************************************************
342 ****************************************************************************/
343 BOOL do_srv_net_srv_get_info(struct cli_state *cli,
344 char *server_name, uint32 switch_value, SRV_INFO_CTR *ctr)
348 SRV_Q_NET_SRV_GET_INFO q_o;
349 SRV_R_NET_SRV_GET_INFO r_o;
351 if (server_name == NULL || switch_value == 0 || ctr == NULL)
354 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
355 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
357 /* create and send a MSRPC command with api SRV_NET_SRV_GET_INFO */
359 DEBUG(4,("SRV Get Server Info (%s), level %d\n", server_name, switch_value));
361 /* store the parameters */
362 init_srv_q_net_srv_get_info(&q_o, server_name, switch_value);
364 /* turn parameters into data stream */
365 if(!srv_io_q_net_srv_get_info("", &q_o, &data, 0)) {
367 prs_mem_free(&rdata);
371 /* send the data on \PIPE\ */
372 if (!rpc_api_pipe_req(cli, SRV_NET_SRV_GET_INFO, &data, &rdata)) {
374 prs_mem_free(&rdata);
382 if(!srv_io_r_net_srv_get_info("", &r_o, &rdata, 0)) {
383 prs_mem_free(&rdata);
387 if (r_o.status != 0) {
388 /* report error code */
389 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
390 prs_mem_free(&rdata);
394 if (r_o.ctr->switch_value != q_o.switch_value) {
395 /* different switch levels. oops. */
396 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: info class %d does not match request %d\n",
397 r_o.ctr->switch_value, q_o.switch_value));
398 prs_mem_free(&rdata);
402 prs_mem_free(&rdata);