2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Jeremy Allison 1999.
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.
27 #define DBGC_CLASS DBGC_RPC_CLI
29 /****************************************************************************
30 do a server net conn enum
31 ****************************************************************************/
32 BOOL do_srv_net_srv_conn_enum(struct cli_state *cli,
33 char *server_name, char *qual_name,
34 uint32 switch_value, SRV_CONN_INFO_CTR *ctr,
40 SRV_Q_NET_CONN_ENUM q_o;
41 SRV_R_NET_CONN_ENUM r_o;
43 if (server_name == NULL || ctr == NULL || preferred_len == 0)
46 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
47 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
49 /* create and send a MSRPC command with api SRV_NET_CONN_ENUM */
51 DEBUG(4,("SRV Net Server Connection Enum(%s, %s), level %d, enum:%8x\n",
52 server_name, qual_name, switch_value, get_enum_hnd(hnd)));
54 ctr->switch_value = switch_value;
55 ctr->ptr_conn_ctr = 1;
56 ctr->conn.info0.num_entries_read = 0;
57 ctr->conn.info0.ptr_conn_info = 1;
59 /* store the parameters */
60 init_srv_q_net_conn_enum(&q_o, server_name, qual_name,
65 /* turn parameters into data stream */
66 if(!srv_io_q_net_conn_enum("", &q_o, &data, 0)) {
72 /* send the data on \PIPE\ */
73 if(!rpc_api_pipe_req(cli, SRV_NET_CONN_ENUM, &data, &rdata)) {
83 if(!srv_io_r_net_conn_enum("", &r_o, &rdata, 0)) {
88 if (r_o.status != 0) {
89 /* report error code */
90 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: %s\n", nt_errstr(r_o.status)));
95 if (r_o.ctr->switch_value != switch_value) {
96 /* different switch levels. oops. */
97 DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: info class %d does not match request %d\n",
98 r_o.ctr->switch_value, switch_value));
103 prs_mem_free(&rdata);
108 /****************************************************************************
109 do a server net sess enum
110 ****************************************************************************/
112 BOOL do_srv_net_srv_sess_enum(struct cli_state *cli,
113 char *server_name, char *qual_name,
115 uint32 switch_value, SRV_SESS_INFO_CTR *ctr,
116 uint32 preferred_len,
121 SRV_Q_NET_SESS_ENUM q_o;
122 SRV_R_NET_SESS_ENUM r_o;
124 if (server_name == NULL || ctr == NULL || preferred_len == 0)
127 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
128 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
130 /* create and send a MSRPC command with api SRV_NET_SESS_ENUM */
132 DEBUG(4,("SRV Net Session Enum (%s), level %d, enum:%8x\n",
133 server_name, switch_value, get_enum_hnd(hnd)));
135 ctr->switch_value = switch_value;
136 ctr->ptr_sess_ctr = 1;
137 ctr->sess.info0.num_entries_read = 0;
138 ctr->sess.info0.ptr_sess_info = 1;
140 /* store the parameters */
141 init_srv_q_net_sess_enum(&q_o, server_name, qual_name, user_name,
146 /* turn parameters into data stream */
147 if(!srv_io_q_net_sess_enum("", &q_o, &data, 0)) {
149 prs_mem_free(&rdata);
153 /* send the data on \PIPE\ */
154 if (!rpc_api_pipe_req(cli, SRV_NET_SESS_ENUM, &data, &rdata)) {
156 prs_mem_free(&rdata);
164 if(!srv_io_r_net_sess_enum("", &r_o, &rdata, 0)) {
165 prs_mem_free(&rdata);
169 if (r_o.status != 0) {
170 /* report error code */
171 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", nt_errstr(r_o.status)));
172 prs_mem_free(&rdata);
176 if (r_o.ctr->switch_value != switch_value) {
177 /* different switch levels. oops. */
178 DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: info class %d does not match request %d\n",
179 r_o.ctr->switch_value, switch_value));
180 prs_mem_free(&rdata);
184 prs_mem_free(&rdata);
189 /****************************************************************************
190 do a server net share enum
191 ****************************************************************************/
192 BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
194 uint32 switch_value, SRV_R_NET_SHARE_ENUM *r_o,
195 uint32 preferred_len, ENUM_HND *hnd)
199 SRV_Q_NET_SHARE_ENUM q_o;
201 if (server_name == NULL || preferred_len == 0)
204 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
205 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
207 /* create and send a MSRPC command with api SRV_NET_SHARE_ENUM */
209 DEBUG(4,("SRV Get Share Info (%s), level %d, enum:%8x\n",
210 server_name, switch_value, get_enum_hnd(hnd)));
212 /* store the parameters */
213 init_srv_q_net_share_enum(&q_o, server_name, switch_value,
216 /* turn parameters into data stream */
217 if(!srv_io_q_net_share_enum("", &q_o, &data, 0)) {
219 prs_mem_free(&rdata);
223 /* send the data on \PIPE\ */
224 if (!rpc_api_pipe_req(cli, SRV_NET_SHARE_ENUM, &data, &rdata)) {
226 prs_mem_free(&rdata);
232 if(!srv_io_r_net_share_enum("", r_o, &rdata, 0)) {
233 prs_mem_free(&rdata);
237 if (r_o->status != 0) {
238 /* report error code */
239 DEBUG(0,("SRV_R_NET_SHARE_ENUM: %s\n", nt_errstr(r_o->status)));
240 prs_mem_free(&rdata);
244 if (r_o->ctr.switch_value != switch_value) {
245 /* different switch levels. oops. */
246 DEBUG(0,("SRV_R_NET_SHARE_ENUM: info class %d does not match request %d\n",
247 r_o->ctr.switch_value, switch_value));
248 prs_mem_free(&rdata);
252 prs_mem_free(&rdata);
257 /****************************************************************************
258 do a server net file enum
259 ****************************************************************************/
261 BOOL do_srv_net_srv_file_enum(struct cli_state *cli,
262 char *server_name, char *qual_name,
263 uint32 switch_value, SRV_FILE_INFO_CTR *ctr,
264 uint32 preferred_len,
269 SRV_Q_NET_FILE_ENUM q_o;
270 SRV_R_NET_FILE_ENUM r_o;
272 if (server_name == NULL || ctr == NULL || preferred_len == 0)
275 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
276 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
278 /* create and send a MSRPC command with api SRV_NET_FILE_ENUM */
280 DEBUG(4,("SRV Get File Info (%s), level %d, enum:%8x\n",
281 server_name, switch_value, get_enum_hnd(hnd)));
283 q_o.file_level = switch_value;
285 ctr->switch_value = switch_value;
286 ctr->ptr_file_ctr = 1;
287 ctr->file.info3.num_entries_read = 0;
288 ctr->file.info3.ptr_file_info = 1;
290 /* store the parameters */
291 init_srv_q_net_file_enum(&q_o, server_name, qual_name,
296 /* turn parameters into data stream */
297 if(!srv_io_q_net_file_enum("", &q_o, &data, 0)) {
299 prs_mem_free(&rdata);
303 /* send the data on \PIPE\ */
304 if (!rpc_api_pipe_req(cli, SRV_NET_FILE_ENUM, &data, &rdata)) {
306 prs_mem_free(&rdata);
314 if(!srv_io_r_net_file_enum("", &r_o, &rdata, 0)) {
315 prs_mem_free(&rdata);
319 if (r_o.status != 0) {
320 /* report error code */
321 DEBUG(0,("SRV_R_NET_FILE_ENUM: %s\n", nt_errstr(r_o.status)));
322 prs_mem_free(&rdata);
326 if (r_o.ctr->switch_value != switch_value) {
327 /* different switch levels. oops. */
328 DEBUG(0,("SRV_R_NET_FILE_ENUM: info class %d does not match request %d\n",
329 r_o.ctr->switch_value, switch_value));
330 prs_mem_free(&rdata);
334 prs_mem_free(&rdata);
339 /****************************************************************************
341 ****************************************************************************/
342 BOOL do_srv_net_srv_get_info(struct cli_state *cli,
343 char *server_name, uint32 switch_value, SRV_INFO_CTR *ctr)
347 SRV_Q_NET_SRV_GET_INFO q_o;
348 SRV_R_NET_SRV_GET_INFO r_o;
350 if (server_name == NULL || switch_value == 0 || ctr == NULL)
353 prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
354 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
356 /* create and send a MSRPC command with api SRV_NET_SRV_GET_INFO */
358 DEBUG(4,("SRV Get Server Info (%s), level %d\n", server_name, switch_value));
360 /* store the parameters */
361 init_srv_q_net_srv_get_info(&q_o, server_name, switch_value);
363 /* turn parameters into data stream */
364 if(!srv_io_q_net_srv_get_info("", &q_o, &data, 0)) {
366 prs_mem_free(&rdata);
370 /* send the data on \PIPE\ */
371 if (!rpc_api_pipe_req(cli, SRV_NET_SRV_GET_INFO, &data, &rdata)) {
373 prs_mem_free(&rdata);
381 if(!srv_io_r_net_srv_get_info("", &r_o, &rdata, 0)) {
382 prs_mem_free(&rdata);
386 if (r_o.status != 0) {
387 /* report error code */
388 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", nt_errstr(r_o.status)));
389 prs_mem_free(&rdata);
393 if (r_o.ctr->switch_value != q_o.switch_value) {
394 /* different switch levels. oops. */
395 DEBUG(0,("SRV_R_NET_SRV_GET_INFO: info class %d does not match request %d\n",
396 r_o.ctr->switch_value, q_o.switch_value));
397 prs_mem_free(&rdata);
401 prs_mem_free(&rdata);