Removed version number from file header.
[kai/samba.git] / source3 / rpc_server / srv_srvsvc.c
1 /* 
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                                        2001.
8  *  
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.
13  *  
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.
18  *  
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.
22  */
23
24 /* This is the interface to the srvsvc pipe. */
25
26 #include "includes.h"
27
28 /*******************************************************************
29  api_srv_net_srv_get_info
30 ********************************************************************/
31
32 static BOOL api_srv_net_srv_get_info(pipes_struct *p)
33 {
34         SRV_Q_NET_SRV_GET_INFO q_u;
35         SRV_R_NET_SRV_GET_INFO r_u;
36         prs_struct *data = &p->in_data.data;
37         prs_struct *rdata = &p->out_data.rdata;
38
39         ZERO_STRUCT(q_u);
40         ZERO_STRUCT(r_u);
41
42         /* grab the net server get info */
43         if (!srv_io_q_net_srv_get_info("", &q_u, data, 0))
44                 return False;
45
46         r_u.status = _srv_net_srv_get_info(p, &q_u, &r_u);
47
48         /* store the response in the SMB stream */
49         if (!srv_io_r_net_srv_get_info("", &r_u, rdata, 0))
50                 return False;
51
52         return True;
53 }
54
55 /*******************************************************************
56  api_srv_net_srv_get_info
57 ********************************************************************/
58
59 static BOOL api_srv_net_srv_set_info(pipes_struct *p)
60 {
61         SRV_Q_NET_SRV_SET_INFO q_u;
62         SRV_R_NET_SRV_SET_INFO r_u;
63         prs_struct *data = &p->in_data.data;
64         prs_struct *rdata = &p->out_data.rdata;
65
66         ZERO_STRUCT(q_u);
67         ZERO_STRUCT(r_u);
68
69         /* grab the net server set info */
70         if (!srv_io_q_net_srv_set_info("", &q_u, data, 0))
71                 return False;
72
73         r_u.status = _srv_net_srv_set_info(p, &q_u, &r_u);
74
75         /* store the response in the SMB stream */
76         if (!srv_io_r_net_srv_set_info("", &r_u, rdata, 0))
77                 return False;
78
79         return True;
80 }
81
82 /*******************************************************************
83  api_srv_net_file_enum
84 ********************************************************************/
85
86 static BOOL api_srv_net_file_enum(pipes_struct *p)
87 {
88         SRV_Q_NET_FILE_ENUM q_u;
89         SRV_R_NET_FILE_ENUM r_u;
90         prs_struct *data = &p->in_data.data;
91         prs_struct *rdata = &p->out_data.rdata;
92
93         ZERO_STRUCT(q_u);
94         ZERO_STRUCT(r_u);
95
96         /* grab the net file enum */
97         if (!srv_io_q_net_file_enum("", &q_u, data, 0))
98                 return False;
99
100         r_u.status = _srv_net_file_enum(p, &q_u, &r_u);
101
102         /* store the response in the SMB stream */
103         if(!srv_io_r_net_file_enum("", &r_u, rdata, 0))
104                 return False;
105
106         return True;
107 }
108
109 /*******************************************************************
110  api_srv_net_conn_enum
111 ********************************************************************/
112
113 static BOOL api_srv_net_conn_enum(pipes_struct *p)
114 {
115         SRV_Q_NET_CONN_ENUM q_u;
116         SRV_R_NET_CONN_ENUM r_u;
117         prs_struct *data = &p->in_data.data;
118         prs_struct *rdata = &p->out_data.rdata;
119
120         ZERO_STRUCT(q_u);
121         ZERO_STRUCT(r_u);
122
123         /* grab the net server get enum */
124         if (!srv_io_q_net_conn_enum("", &q_u, data, 0))
125                 return False;
126
127         r_u.status = _srv_net_conn_enum(p, &q_u, &r_u);
128
129         /* store the response in the SMB stream */
130         if (!srv_io_r_net_conn_enum("", &r_u, rdata, 0))
131                 return False;
132
133         return True;
134 }
135
136 /*******************************************************************
137  Enumerate sessions.
138 ********************************************************************/
139
140 static BOOL api_srv_net_sess_enum(pipes_struct *p)
141 {
142         SRV_Q_NET_SESS_ENUM q_u;
143         SRV_R_NET_SESS_ENUM r_u;
144         prs_struct *data = &p->in_data.data;
145         prs_struct *rdata = &p->out_data.rdata;
146
147         ZERO_STRUCT(q_u);
148         ZERO_STRUCT(r_u);
149
150         /* grab the net server get enum */
151         if (!srv_io_q_net_sess_enum("", &q_u, data, 0))
152                 return False;
153
154         /* construct reply.  always indicate success */
155         r_u.status = _srv_net_sess_enum(p, &q_u, &r_u);
156
157         /* store the response in the SMB stream */
158         if (!srv_io_r_net_sess_enum("", &r_u, rdata, 0))
159                 return False;
160
161         return True;
162 }
163
164 /*******************************************************************
165  RPC to enumerate shares.
166 ********************************************************************/
167
168 static BOOL api_srv_net_share_enum_all(pipes_struct *p)
169 {
170         SRV_Q_NET_SHARE_ENUM q_u;
171         SRV_R_NET_SHARE_ENUM r_u;
172         prs_struct *data = &p->in_data.data;
173         prs_struct *rdata = &p->out_data.rdata;
174
175         ZERO_STRUCT(q_u);
176         ZERO_STRUCT(r_u);
177
178         /* Unmarshall the net server get enum. */
179         if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
180                 DEBUG(0,("api_srv_net_share_enum_all: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
181                 return False;
182         }
183
184         r_u.status = _srv_net_share_enum_all(p, &q_u, &r_u);
185
186         if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
187                 DEBUG(0,("api_srv_net_share_enum_all: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
188                 return False;
189         }
190
191         return True;
192 }
193
194 /*******************************************************************
195  RPC to enumerate shares.
196 ********************************************************************/
197
198 static BOOL api_srv_net_share_enum(pipes_struct *p)
199 {
200         SRV_Q_NET_SHARE_ENUM q_u;
201         SRV_R_NET_SHARE_ENUM r_u;
202         prs_struct *data = &p->in_data.data;
203         prs_struct *rdata = &p->out_data.rdata;
204
205         ZERO_STRUCT(q_u);
206         ZERO_STRUCT(r_u);
207
208         /* Unmarshall the net server get enum. */
209         if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
210                 DEBUG(0,("api_srv_net_share_enum: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
211                 return False;
212         }
213
214         r_u.status = _srv_net_share_enum(p, &q_u, &r_u);
215
216         if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
217                 DEBUG(0,("api_srv_net_share_enum: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
218                 return False;
219         }
220
221         return True;
222 }
223
224 /*******************************************************************
225  RPC to return share information.
226 ********************************************************************/
227
228 static BOOL api_srv_net_share_get_info(pipes_struct *p)
229 {
230         SRV_Q_NET_SHARE_GET_INFO q_u;
231         SRV_R_NET_SHARE_GET_INFO r_u;
232         prs_struct *data = &p->in_data.data;
233         prs_struct *rdata = &p->out_data.rdata;
234
235         ZERO_STRUCT(q_u);
236         ZERO_STRUCT(r_u);
237
238         /* Unmarshall the net server get info. */
239         if(!srv_io_q_net_share_get_info("", &q_u, data, 0)) {
240                 DEBUG(0,("api_srv_net_share_get_info: Failed to unmarshall SRV_Q_NET_SHARE_GET_INFO.\n"));
241                 return False;
242         }
243
244         r_u.status = _srv_net_share_get_info(p, &q_u, &r_u);
245
246         if(!srv_io_r_net_share_get_info("", &r_u, rdata, 0)) {
247                 DEBUG(0,("api_srv_net_share_get_info: Failed to marshall SRV_R_NET_SHARE_GET_INFO.\n"));
248                 return False;
249         }
250
251         return True;
252 }
253
254 /*******************************************************************
255  RPC to set share information.
256 ********************************************************************/
257
258 static BOOL api_srv_net_share_set_info(pipes_struct *p)
259 {
260         SRV_Q_NET_SHARE_SET_INFO q_u;
261         SRV_R_NET_SHARE_SET_INFO r_u;
262         prs_struct *data = &p->in_data.data;
263         prs_struct *rdata = &p->out_data.rdata;
264
265         ZERO_STRUCT(q_u);
266         ZERO_STRUCT(r_u);
267
268         /* Unmarshall the net server set info. */
269         if(!srv_io_q_net_share_set_info("", &q_u, data, 0)) {
270                 DEBUG(0,("api_srv_net_share_set_info: Failed to unmarshall SRV_Q_NET_SHARE_SET_INFO.\n"));
271                 return False;
272         }
273
274         r_u.status = _srv_net_share_set_info(p, &q_u, &r_u);
275
276         if(!srv_io_r_net_share_set_info("", &r_u, rdata, 0)) {
277                 DEBUG(0,("api_srv_net_share_set_info: Failed to marshall SRV_R_NET_SHARE_SET_INFO.\n"));
278                 return False;
279         }
280
281         return True;
282 }
283
284 /*******************************************************************
285  RPC to add share information.
286 ********************************************************************/
287
288 static BOOL api_srv_net_share_add(pipes_struct *p)
289 {
290         SRV_Q_NET_SHARE_ADD q_u;
291         SRV_R_NET_SHARE_ADD r_u;
292         prs_struct *data = &p->in_data.data;
293         prs_struct *rdata = &p->out_data.rdata;
294
295         ZERO_STRUCT(q_u);
296         ZERO_STRUCT(r_u);
297
298         /* Unmarshall the net server add info. */
299         if(!srv_io_q_net_share_add("", &q_u, data, 0)) {
300                 DEBUG(0,("api_srv_net_share_add: Failed to unmarshall SRV_Q_NET_SHARE_ADD.\n"));
301                 return False;
302         }
303
304         r_u.status = _srv_net_share_add(p, &q_u, &r_u);
305
306         if(!srv_io_r_net_share_add("", &r_u, rdata, 0)) {
307                 DEBUG(0,("api_srv_net_share_add: Failed to marshall SRV_R_NET_SHARE_ADD.\n"));
308                 return False;
309         }
310
311         return True;
312 }
313
314 /*******************************************************************
315  RPC to delete share information.
316 ********************************************************************/
317
318 static BOOL api_srv_net_share_del(pipes_struct *p)
319 {
320         SRV_Q_NET_SHARE_DEL q_u;
321         SRV_R_NET_SHARE_DEL r_u;
322         prs_struct *data = &p->in_data.data;
323         prs_struct *rdata = &p->out_data.rdata;
324
325         ZERO_STRUCT(q_u);
326         ZERO_STRUCT(r_u);
327
328         /* Unmarshall the net server del info. */
329         if(!srv_io_q_net_share_del("", &q_u, data, 0)) {
330                 DEBUG(0,("api_srv_net_share_del: Failed to unmarshall SRV_Q_NET_SHARE_DEL.\n"));
331                 return False;
332         }
333
334         r_u.status = _srv_net_share_del(p, &q_u, &r_u);
335
336         if(!srv_io_r_net_share_del("", &r_u, rdata, 0)) {
337                 DEBUG(0,("api_srv_net_share_del: Failed to marshall SRV_R_NET_SHARE_DEL.\n"));
338                 return False;
339         }
340
341         return True;
342 }
343
344 /*******************************************************************
345  api_srv_net_remote_tod
346 ********************************************************************/
347
348 static BOOL api_srv_net_remote_tod(pipes_struct *p)
349 {
350         SRV_Q_NET_REMOTE_TOD q_u;
351         SRV_R_NET_REMOTE_TOD r_u;
352         prs_struct *data = &p->in_data.data;
353         prs_struct *rdata = &p->out_data.rdata;
354
355         ZERO_STRUCT(q_u);
356         ZERO_STRUCT(r_u);
357
358         /* grab the net server get enum */
359         if(!srv_io_q_net_remote_tod("", &q_u, data, 0))
360                 return False;
361
362         r_u.status = _srv_net_remote_tod(p, &q_u, &r_u);
363
364         /* store the response in the SMB stream */
365         if(!srv_io_r_net_remote_tod("", &r_u, rdata, 0))
366                 return False;
367
368         return True;
369 }
370
371 /*******************************************************************
372  RPC to enumerate disks available on a server e.g. C:, D: ...
373 *******************************************************************/
374
375 static BOOL api_srv_net_disk_enum(pipes_struct *p) 
376 {
377         SRV_Q_NET_DISK_ENUM q_u;
378         SRV_R_NET_DISK_ENUM r_u;
379         prs_struct *data = &p->in_data.data;
380         prs_struct *rdata = &p->out_data.rdata;
381
382         ZERO_STRUCT(q_u);
383         ZERO_STRUCT(r_u);
384
385         /* Unmarshall the net server disk enum. */
386         if(!srv_io_q_net_disk_enum("", &q_u, data, 0)) {
387                 DEBUG(0,("api_srv_net_disk_enum: Failed to unmarshall SRV_Q_NET_DISK_ENUM.\n"));
388                 return False;
389         }
390
391         r_u.status = _srv_net_disk_enum(p, &q_u, &r_u);
392
393         if(!srv_io_r_net_disk_enum("", &r_u, rdata, 0)) {
394                 DEBUG(0,("api_srv_net_disk_enum: Failed to marshall SRV_R_NET_DISK_ENUM.\n"));
395                 return False;
396         }
397
398         return True;
399 }
400
401 /*******************************************************************
402  NetValidateName (opnum 0x21) 
403 *******************************************************************/
404
405 static BOOL api_srv_net_name_validate(pipes_struct *p) 
406 {
407         SRV_Q_NET_NAME_VALIDATE q_u;
408         SRV_R_NET_NAME_VALIDATE r_u;
409         prs_struct *data = &p->in_data.data;
410         prs_struct *rdata = &p->out_data.rdata;
411  
412         ZERO_STRUCT(q_u);
413         ZERO_STRUCT(r_u);
414   
415         /* Unmarshall the net server disk enum. */
416         if(!srv_io_q_net_name_validate("", &q_u, data, 0)) {
417                 DEBUG(0,("api_srv_net_name_validate: Failed to unmarshall SRV_Q_NET_NAME_VALIDATE.\n"));
418                 return False;
419         }
420
421         r_u.status = _srv_net_name_validate(p, &q_u, &r_u);
422
423         if(!srv_io_r_net_name_validate("", &r_u, rdata, 0)) {
424                 DEBUG(0,("api_srv_net_name_validate: Failed to marshall SRV_R_NET_NAME_VALIDATE.\n"));
425                 return False;
426         }
427
428         return True;
429 }
430
431 /*******************************************************************
432  NetFileQuerySecdesc (opnum 0x27)
433 *******************************************************************/
434
435 static BOOL api_srv_net_file_query_secdesc(pipes_struct *p)
436 {
437         SRV_Q_NET_FILE_QUERY_SECDESC q_u;
438         SRV_R_NET_FILE_QUERY_SECDESC r_u;
439         prs_struct *data = &p->in_data.data;
440         prs_struct *rdata = &p->out_data.rdata;
441
442         ZERO_STRUCT(q_u);
443         ZERO_STRUCT(r_u);
444
445         /* Unmarshall the net file get info from Win9x */
446         if(!srv_io_q_net_file_query_secdesc("", &q_u, data, 0)) {
447                 DEBUG(0,("api_srv_net_file_query_secdesc: Failed to unmarshall SRV_Q_NET_FILE_QUERY_SECDESC.\n"));
448                 return False;
449         }
450
451         r_u.status = _srv_net_file_query_secdesc(p, &q_u, &r_u);
452
453         if(!srv_io_r_net_file_query_secdesc("", &r_u, rdata, 0)) {
454                 DEBUG(0,("api_srv_net_file_query_secdesc: Failed to marshall SRV_R_NET_FILE_QUERY_SECDESC.\n"));
455                 return False;
456         }
457
458         return True;
459 }
460
461 /*******************************************************************
462  NetFileSetSecdesc (opnum 0x28)
463 *******************************************************************/
464
465 static BOOL api_srv_net_file_set_secdesc(pipes_struct *p)
466 {
467         SRV_Q_NET_FILE_SET_SECDESC q_u;
468         SRV_R_NET_FILE_SET_SECDESC r_u;
469         prs_struct *data = &p->in_data.data;
470         prs_struct *rdata = &p->out_data.rdata;
471
472         ZERO_STRUCT(q_u);
473         ZERO_STRUCT(r_u);
474
475         /* Unmarshall the net file set info from Win9x */
476         if(!srv_io_q_net_file_set_secdesc("", &q_u, data, 0)) {
477                 DEBUG(0,("api_srv_net_file_set_secdesc: Failed to unmarshall SRV_Q_NET_FILE_SET_SECDESC.\n"));
478                 return False;
479         }
480
481         r_u.status = _srv_net_file_set_secdesc(p, &q_u, &r_u);
482
483         if(!srv_io_r_net_file_set_secdesc("", &r_u, rdata, 0)) {
484                 DEBUG(0,("api_srv_net_file_set_secdesc: Failed to marshall SRV_R_NET_FILE_SET_SECDESC.\n"));
485                 return False;
486         }
487
488         return True;
489 }
490
491 /*******************************************************************
492 \PIPE\srvsvc commands
493 ********************************************************************/
494
495 struct api_struct api_srv_cmds[] =
496 {
497         { "SRV_NETCONNENUM"       , SRV_NETCONNENUM       , api_srv_net_conn_enum    },
498         { "SRV_NETSESSENUM"       , SRV_NETSESSENUM       , api_srv_net_sess_enum    },
499         { "SRV_NETSHAREENUM_ALL"  , SRV_NETSHAREENUM_ALL  , api_srv_net_share_enum_all   },
500         { "SRV_NETSHAREENUM"      , SRV_NETSHAREENUM      , api_srv_net_share_enum   },
501         { "SRV_NET_SHARE_ADD"     , SRV_NET_SHARE_ADD     , api_srv_net_share_add },
502         { "SRV_NET_SHARE_DEL"     , SRV_NET_SHARE_DEL     , api_srv_net_share_del },
503         { "SRV_NET_SHARE_GET_INFO", SRV_NET_SHARE_GET_INFO, api_srv_net_share_get_info },
504         { "SRV_NET_SHARE_SET_INFO", SRV_NET_SHARE_SET_INFO, api_srv_net_share_set_info },
505         { "SRV_NETFILEENUM"       , SRV_NETFILEENUM       , api_srv_net_file_enum    },
506         { "SRV_NET_SRV_GET_INFO"  , SRV_NET_SRV_GET_INFO  , api_srv_net_srv_get_info },
507         { "SRV_NET_SRV_SET_INFO"  , SRV_NET_SRV_SET_INFO  , api_srv_net_srv_set_info },
508         { "SRV_NET_REMOTE_TOD"    , SRV_NET_REMOTE_TOD    , api_srv_net_remote_tod   },
509         { "SRV_NET_DISK_ENUM"     , SRV_NET_DISK_ENUM     , api_srv_net_disk_enum    },
510         { "SRV_NET_NAME_VALIDATE" , SRV_NET_NAME_VALIDATE , api_srv_net_name_validate},
511         { "SRV_NETFILEQUERYSECDESC",SRV_NETFILEQUERYSECDESC,api_srv_net_file_query_secdesc},
512         { "SRV_NETFILESETSECDESC" , SRV_NETFILESETSECDESC , api_srv_net_file_set_secdesc},
513         { NULL                    , 0                     , NULL                     }
514 };
515
516 /*******************************************************************
517 receives a srvsvc pipe and responds.
518 ********************************************************************/
519 BOOL api_srvsvc_rpc(pipes_struct *p)
520 {
521         return api_rpcTNP(p, "api_srvsvc_rpc", api_srv_cmds);
522 }