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 2001.
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.
25 /* This is the interface to the srvsvc pipe. */
29 /*******************************************************************
30 api_srv_net_srv_get_info
31 ********************************************************************/
33 static BOOL
api_srv_net_srv_get_info(pipes_struct
*p
)
35 SRV_Q_NET_SRV_GET_INFO q_u
;
36 SRV_R_NET_SRV_GET_INFO r_u
;
37 prs_struct
*data
= &p
->in_data
.data
;
38 prs_struct
*rdata
= &p
->out_data
.rdata
;
43 /* grab the net server get info */
44 if (!srv_io_q_net_srv_get_info("", &q_u
, data
, 0))
47 r_u
.status
= _srv_net_srv_get_info(p
, &q_u
, &r_u
);
49 /* store the response in the SMB stream */
50 if (!srv_io_r_net_srv_get_info("", &r_u
, rdata
, 0))
56 /*******************************************************************
57 api_srv_net_srv_get_info
58 ********************************************************************/
60 static BOOL
api_srv_net_srv_set_info(pipes_struct
*p
)
62 SRV_Q_NET_SRV_SET_INFO q_u
;
63 SRV_R_NET_SRV_SET_INFO r_u
;
64 prs_struct
*data
= &p
->in_data
.data
;
65 prs_struct
*rdata
= &p
->out_data
.rdata
;
70 /* grab the net server set info */
71 if (!srv_io_q_net_srv_set_info("", &q_u
, data
, 0))
74 r_u
.status
= _srv_net_srv_set_info(p
, &q_u
, &r_u
);
76 /* store the response in the SMB stream */
77 if (!srv_io_r_net_srv_set_info("", &r_u
, rdata
, 0))
83 /*******************************************************************
85 ********************************************************************/
87 static BOOL
api_srv_net_file_enum(pipes_struct
*p
)
89 SRV_Q_NET_FILE_ENUM q_u
;
90 SRV_R_NET_FILE_ENUM r_u
;
91 prs_struct
*data
= &p
->in_data
.data
;
92 prs_struct
*rdata
= &p
->out_data
.rdata
;
97 /* grab the net file enum */
98 if (!srv_io_q_net_file_enum("", &q_u
, data
, 0))
101 r_u
.status
= _srv_net_file_enum(p
, &q_u
, &r_u
);
103 /* store the response in the SMB stream */
104 if(!srv_io_r_net_file_enum("", &r_u
, rdata
, 0))
110 /*******************************************************************
111 api_srv_net_conn_enum
112 ********************************************************************/
114 static BOOL
api_srv_net_conn_enum(pipes_struct
*p
)
116 SRV_Q_NET_CONN_ENUM q_u
;
117 SRV_R_NET_CONN_ENUM r_u
;
118 prs_struct
*data
= &p
->in_data
.data
;
119 prs_struct
*rdata
= &p
->out_data
.rdata
;
124 /* grab the net server get enum */
125 if (!srv_io_q_net_conn_enum("", &q_u
, data
, 0))
128 r_u
.status
= _srv_net_conn_enum(p
, &q_u
, &r_u
);
130 /* store the response in the SMB stream */
131 if (!srv_io_r_net_conn_enum("", &r_u
, rdata
, 0))
137 /*******************************************************************
139 ********************************************************************/
141 static BOOL
api_srv_net_sess_enum(pipes_struct
*p
)
143 SRV_Q_NET_SESS_ENUM q_u
;
144 SRV_R_NET_SESS_ENUM r_u
;
145 prs_struct
*data
= &p
->in_data
.data
;
146 prs_struct
*rdata
= &p
->out_data
.rdata
;
151 /* grab the net server get enum */
152 if (!srv_io_q_net_sess_enum("", &q_u
, data
, 0))
155 /* construct reply. always indicate success */
156 r_u
.status
= _srv_net_sess_enum(p
, &q_u
, &r_u
);
158 /* store the response in the SMB stream */
159 if (!srv_io_r_net_sess_enum("", &r_u
, rdata
, 0))
165 /*******************************************************************
166 RPC to enumerate shares.
167 ********************************************************************/
169 static BOOL
api_srv_net_share_enum_all(pipes_struct
*p
)
171 SRV_Q_NET_SHARE_ENUM q_u
;
172 SRV_R_NET_SHARE_ENUM r_u
;
173 prs_struct
*data
= &p
->in_data
.data
;
174 prs_struct
*rdata
= &p
->out_data
.rdata
;
179 /* Unmarshall the net server get enum. */
180 if(!srv_io_q_net_share_enum("", &q_u
, data
, 0)) {
181 DEBUG(0,("api_srv_net_share_enum_all: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
185 r_u
.status
= _srv_net_share_enum_all(p
, &q_u
, &r_u
);
187 if (!srv_io_r_net_share_enum("", &r_u
, rdata
, 0)) {
188 DEBUG(0,("api_srv_net_share_enum_all: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
195 /*******************************************************************
196 RPC to enumerate shares.
197 ********************************************************************/
199 static BOOL
api_srv_net_share_enum(pipes_struct
*p
)
201 SRV_Q_NET_SHARE_ENUM q_u
;
202 SRV_R_NET_SHARE_ENUM r_u
;
203 prs_struct
*data
= &p
->in_data
.data
;
204 prs_struct
*rdata
= &p
->out_data
.rdata
;
209 /* Unmarshall the net server get enum. */
210 if(!srv_io_q_net_share_enum("", &q_u
, data
, 0)) {
211 DEBUG(0,("api_srv_net_share_enum: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
215 r_u
.status
= _srv_net_share_enum(p
, &q_u
, &r_u
);
217 if (!srv_io_r_net_share_enum("", &r_u
, rdata
, 0)) {
218 DEBUG(0,("api_srv_net_share_enum: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
225 /*******************************************************************
226 RPC to return share information.
227 ********************************************************************/
229 static BOOL
api_srv_net_share_get_info(pipes_struct
*p
)
231 SRV_Q_NET_SHARE_GET_INFO q_u
;
232 SRV_R_NET_SHARE_GET_INFO r_u
;
233 prs_struct
*data
= &p
->in_data
.data
;
234 prs_struct
*rdata
= &p
->out_data
.rdata
;
239 /* Unmarshall the net server get info. */
240 if(!srv_io_q_net_share_get_info("", &q_u
, data
, 0)) {
241 DEBUG(0,("api_srv_net_share_get_info: Failed to unmarshall SRV_Q_NET_SHARE_GET_INFO.\n"));
245 r_u
.status
= _srv_net_share_get_info(p
, &q_u
, &r_u
);
247 if(!srv_io_r_net_share_get_info("", &r_u
, rdata
, 0)) {
248 DEBUG(0,("api_srv_net_share_get_info: Failed to marshall SRV_R_NET_SHARE_GET_INFO.\n"));
255 /*******************************************************************
256 RPC to set share information.
257 ********************************************************************/
259 static BOOL
api_srv_net_share_set_info(pipes_struct
*p
)
261 SRV_Q_NET_SHARE_SET_INFO q_u
;
262 SRV_R_NET_SHARE_SET_INFO r_u
;
263 prs_struct
*data
= &p
->in_data
.data
;
264 prs_struct
*rdata
= &p
->out_data
.rdata
;
269 /* Unmarshall the net server set info. */
270 if(!srv_io_q_net_share_set_info("", &q_u
, data
, 0)) {
271 DEBUG(0,("api_srv_net_share_set_info: Failed to unmarshall SRV_Q_NET_SHARE_SET_INFO.\n"));
275 r_u
.status
= _srv_net_share_set_info(p
, &q_u
, &r_u
);
277 if(!srv_io_r_net_share_set_info("", &r_u
, rdata
, 0)) {
278 DEBUG(0,("api_srv_net_share_set_info: Failed to marshall SRV_R_NET_SHARE_SET_INFO.\n"));
285 /*******************************************************************
286 RPC to add share information.
287 ********************************************************************/
289 static BOOL
api_srv_net_share_add(pipes_struct
*p
)
291 SRV_Q_NET_SHARE_ADD q_u
;
292 SRV_R_NET_SHARE_ADD r_u
;
293 prs_struct
*data
= &p
->in_data
.data
;
294 prs_struct
*rdata
= &p
->out_data
.rdata
;
299 /* Unmarshall the net server add info. */
300 if(!srv_io_q_net_share_add("", &q_u
, data
, 0)) {
301 DEBUG(0,("api_srv_net_share_add: Failed to unmarshall SRV_Q_NET_SHARE_ADD.\n"));
305 r_u
.status
= _srv_net_share_add(p
, &q_u
, &r_u
);
307 if(!srv_io_r_net_share_add("", &r_u
, rdata
, 0)) {
308 DEBUG(0,("api_srv_net_share_add: Failed to marshall SRV_R_NET_SHARE_ADD.\n"));
315 /*******************************************************************
316 RPC to delete share information.
317 ********************************************************************/
319 static BOOL
api_srv_net_share_del(pipes_struct
*p
)
321 SRV_Q_NET_SHARE_DEL q_u
;
322 SRV_R_NET_SHARE_DEL r_u
;
323 prs_struct
*data
= &p
->in_data
.data
;
324 prs_struct
*rdata
= &p
->out_data
.rdata
;
329 /* Unmarshall the net server del info. */
330 if(!srv_io_q_net_share_del("", &q_u
, data
, 0)) {
331 DEBUG(0,("api_srv_net_share_del: Failed to unmarshall SRV_Q_NET_SHARE_DEL.\n"));
335 r_u
.status
= _srv_net_share_del(p
, &q_u
, &r_u
);
337 if(!srv_io_r_net_share_del("", &r_u
, rdata
, 0)) {
338 DEBUG(0,("api_srv_net_share_del: Failed to marshall SRV_R_NET_SHARE_DEL.\n"));
345 /*******************************************************************
346 api_srv_net_remote_tod
347 ********************************************************************/
349 static BOOL
api_srv_net_remote_tod(pipes_struct
*p
)
351 SRV_Q_NET_REMOTE_TOD q_u
;
352 SRV_R_NET_REMOTE_TOD r_u
;
353 prs_struct
*data
= &p
->in_data
.data
;
354 prs_struct
*rdata
= &p
->out_data
.rdata
;
359 /* grab the net server get enum */
360 if(!srv_io_q_net_remote_tod("", &q_u
, data
, 0))
363 r_u
.status
= _srv_net_remote_tod(p
, &q_u
, &r_u
);
365 /* store the response in the SMB stream */
366 if(!srv_io_r_net_remote_tod("", &r_u
, rdata
, 0))
372 /*******************************************************************
373 RPC to enumerate disks available on a server e.g. C:, D: ...
374 *******************************************************************/
376 static BOOL
api_srv_net_disk_enum(pipes_struct
*p
)
378 SRV_Q_NET_DISK_ENUM q_u
;
379 SRV_R_NET_DISK_ENUM r_u
;
380 prs_struct
*data
= &p
->in_data
.data
;
381 prs_struct
*rdata
= &p
->out_data
.rdata
;
386 /* Unmarshall the net server disk enum. */
387 if(!srv_io_q_net_disk_enum("", &q_u
, data
, 0)) {
388 DEBUG(0,("api_srv_net_disk_enum: Failed to unmarshall SRV_Q_NET_DISK_ENUM.\n"));
392 r_u
.status
= _srv_net_disk_enum(p
, &q_u
, &r_u
);
394 if(!srv_io_r_net_disk_enum("", &r_u
, rdata
, 0)) {
395 DEBUG(0,("api_srv_net_disk_enum: Failed to marshall SRV_R_NET_DISK_ENUM.\n"));
402 /*******************************************************************
403 NetValidateName (opnum 0x21)
404 *******************************************************************/
406 static BOOL
api_srv_net_name_validate(pipes_struct
*p
)
408 SRV_Q_NET_NAME_VALIDATE q_u
;
409 SRV_R_NET_NAME_VALIDATE r_u
;
410 prs_struct
*data
= &p
->in_data
.data
;
411 prs_struct
*rdata
= &p
->out_data
.rdata
;
416 /* Unmarshall the net server disk enum. */
417 if(!srv_io_q_net_name_validate("", &q_u
, data
, 0)) {
418 DEBUG(0,("api_srv_net_name_validate: Failed to unmarshall SRV_Q_NET_NAME_VALIDATE.\n"));
422 r_u
.status
= _srv_net_name_validate(p
, &q_u
, &r_u
);
424 if(!srv_io_r_net_name_validate("", &r_u
, rdata
, 0)) {
425 DEBUG(0,("api_srv_net_name_validate: Failed to marshall SRV_R_NET_NAME_VALIDATE.\n"));
432 /*******************************************************************
433 NetFileQuerySecdesc (opnum 0x27)
434 *******************************************************************/
436 static BOOL
api_srv_net_file_query_secdesc(pipes_struct
*p
)
438 SRV_Q_NET_FILE_QUERY_SECDESC q_u
;
439 SRV_R_NET_FILE_QUERY_SECDESC r_u
;
440 prs_struct
*data
= &p
->in_data
.data
;
441 prs_struct
*rdata
= &p
->out_data
.rdata
;
446 /* Unmarshall the net file get info from Win9x */
447 if(!srv_io_q_net_file_query_secdesc("", &q_u
, data
, 0)) {
448 DEBUG(0,("api_srv_net_file_query_secdesc: Failed to unmarshall SRV_Q_NET_FILE_QUERY_SECDESC.\n"));
452 r_u
.status
= _srv_net_file_query_secdesc(p
, &q_u
, &r_u
);
454 if(!srv_io_r_net_file_query_secdesc("", &r_u
, rdata
, 0)) {
455 DEBUG(0,("api_srv_net_file_query_secdesc: Failed to marshall SRV_R_NET_FILE_QUERY_SECDESC.\n"));
462 /*******************************************************************
463 NetFileSetSecdesc (opnum 0x28)
464 *******************************************************************/
466 static BOOL
api_srv_net_file_set_secdesc(pipes_struct
*p
)
468 SRV_Q_NET_FILE_SET_SECDESC q_u
;
469 SRV_R_NET_FILE_SET_SECDESC r_u
;
470 prs_struct
*data
= &p
->in_data
.data
;
471 prs_struct
*rdata
= &p
->out_data
.rdata
;
476 /* Unmarshall the net file set info from Win9x */
477 if(!srv_io_q_net_file_set_secdesc("", &q_u
, data
, 0)) {
478 DEBUG(0,("api_srv_net_file_set_secdesc: Failed to unmarshall SRV_Q_NET_FILE_SET_SECDESC.\n"));
482 r_u
.status
= _srv_net_file_set_secdesc(p
, &q_u
, &r_u
);
484 if(!srv_io_r_net_file_set_secdesc("", &r_u
, rdata
, 0)) {
485 DEBUG(0,("api_srv_net_file_set_secdesc: Failed to marshall SRV_R_NET_FILE_SET_SECDESC.\n"));
492 /*******************************************************************
493 \PIPE\srvsvc commands
494 ********************************************************************/
496 struct api_struct api_srv_cmds
[] =
498 { "SRV_NETCONNENUM" , SRV_NETCONNENUM
, api_srv_net_conn_enum
},
499 { "SRV_NETSESSENUM" , SRV_NETSESSENUM
, api_srv_net_sess_enum
},
500 { "SRV_NETSHAREENUM_ALL" , SRV_NETSHAREENUM_ALL
, api_srv_net_share_enum_all
},
501 { "SRV_NETSHAREENUM" , SRV_NETSHAREENUM
, api_srv_net_share_enum
},
502 { "SRV_NET_SHARE_ADD" , SRV_NET_SHARE_ADD
, api_srv_net_share_add
},
503 { "SRV_NET_SHARE_DEL" , SRV_NET_SHARE_DEL
, api_srv_net_share_del
},
504 { "SRV_NET_SHARE_GET_INFO", SRV_NET_SHARE_GET_INFO
, api_srv_net_share_get_info
},
505 { "SRV_NET_SHARE_SET_INFO", SRV_NET_SHARE_SET_INFO
, api_srv_net_share_set_info
},
506 { "SRV_NETFILEENUM" , SRV_NETFILEENUM
, api_srv_net_file_enum
},
507 { "SRV_NET_SRV_GET_INFO" , SRV_NET_SRV_GET_INFO
, api_srv_net_srv_get_info
},
508 { "SRV_NET_SRV_SET_INFO" , SRV_NET_SRV_SET_INFO
, api_srv_net_srv_set_info
},
509 { "SRV_NET_REMOTE_TOD" , SRV_NET_REMOTE_TOD
, api_srv_net_remote_tod
},
510 { "SRV_NET_DISK_ENUM" , SRV_NET_DISK_ENUM
, api_srv_net_disk_enum
},
511 { "SRV_NET_NAME_VALIDATE" , SRV_NET_NAME_VALIDATE
, api_srv_net_name_validate
},
512 { "SRV_NETFILEQUERYSECDESC",SRV_NETFILEQUERYSECDESC
,api_srv_net_file_query_secdesc
},
513 { "SRV_NETFILESETSECDESC" , SRV_NETFILESETSECDESC
, api_srv_net_file_set_secdesc
},
517 /*******************************************************************
518 receives a srvsvc pipe and responds.
519 ********************************************************************/
520 BOOL
api_srvsvc_rpc(pipes_struct
*p
)
522 return api_rpcTNP(p
, "api_srvsvc_rpc", api_srv_cmds
);