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