Initial import
[samba] / 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  Delete session.
170 ********************************************************************/
171
172 static BOOL api_srv_net_sess_del(pipes_struct *p)
173 {
174         SRV_Q_NET_SESS_DEL q_u;
175         SRV_R_NET_SESS_DEL 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         /* grab the net server get enum */
183         if (!srv_io_q_net_sess_del("", &q_u, data, 0))
184                 return False;
185
186         /* construct reply.  always indicate success */
187         r_u.status = _srv_net_sess_del(p, &q_u, &r_u);
188
189         /* store the response in the SMB stream */
190         if (!srv_io_r_net_sess_del("", &r_u, rdata, 0))
191                 return False;
192
193         return True;
194 }
195
196 /*******************************************************************
197  RPC to enumerate shares.
198 ********************************************************************/
199
200 static BOOL api_srv_net_share_enum_all(pipes_struct *p)
201 {
202         SRV_Q_NET_SHARE_ENUM q_u;
203         SRV_R_NET_SHARE_ENUM r_u;
204         prs_struct *data = &p->in_data.data;
205         prs_struct *rdata = &p->out_data.rdata;
206
207         ZERO_STRUCT(q_u);
208         ZERO_STRUCT(r_u);
209
210         /* Unmarshall the net server get enum. */
211         if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
212                 DEBUG(0,("api_srv_net_share_enum_all: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
213                 return False;
214         }
215
216         r_u.status = _srv_net_share_enum_all(p, &q_u, &r_u);
217
218         if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
219                 DEBUG(0,("api_srv_net_share_enum_all: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
220                 return False;
221         }
222
223         return True;
224 }
225
226 /*******************************************************************
227  RPC to enumerate shares.
228 ********************************************************************/
229
230 static BOOL api_srv_net_share_enum(pipes_struct *p)
231 {
232         SRV_Q_NET_SHARE_ENUM q_u;
233         SRV_R_NET_SHARE_ENUM r_u;
234         prs_struct *data = &p->in_data.data;
235         prs_struct *rdata = &p->out_data.rdata;
236
237         ZERO_STRUCT(q_u);
238         ZERO_STRUCT(r_u);
239
240         /* Unmarshall the net server get enum. */
241         if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
242                 DEBUG(0,("api_srv_net_share_enum: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
243                 return False;
244         }
245
246         r_u.status = _srv_net_share_enum(p, &q_u, &r_u);
247
248         if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
249                 DEBUG(0,("api_srv_net_share_enum: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
250                 return False;
251         }
252
253         return True;
254 }
255
256 /*******************************************************************
257  RPC to return share information.
258 ********************************************************************/
259
260 static BOOL api_srv_net_share_get_info(pipes_struct *p)
261 {
262         SRV_Q_NET_SHARE_GET_INFO q_u;
263         SRV_R_NET_SHARE_GET_INFO r_u;
264         prs_struct *data = &p->in_data.data;
265         prs_struct *rdata = &p->out_data.rdata;
266
267         ZERO_STRUCT(q_u);
268         ZERO_STRUCT(r_u);
269
270         /* Unmarshall the net server get info. */
271         if(!srv_io_q_net_share_get_info("", &q_u, data, 0)) {
272                 DEBUG(0,("api_srv_net_share_get_info: Failed to unmarshall SRV_Q_NET_SHARE_GET_INFO.\n"));
273                 return False;
274         }
275
276         r_u.status = _srv_net_share_get_info(p, &q_u, &r_u);
277
278         if(!srv_io_r_net_share_get_info("", &r_u, rdata, 0)) {
279                 DEBUG(0,("api_srv_net_share_get_info: Failed to marshall SRV_R_NET_SHARE_GET_INFO.\n"));
280                 return False;
281         }
282
283         return True;
284 }
285
286 /*******************************************************************
287  RPC to set share information.
288 ********************************************************************/
289
290 static BOOL api_srv_net_share_set_info(pipes_struct *p)
291 {
292         SRV_Q_NET_SHARE_SET_INFO q_u;
293         SRV_R_NET_SHARE_SET_INFO r_u;
294         prs_struct *data = &p->in_data.data;
295         prs_struct *rdata = &p->out_data.rdata;
296
297         ZERO_STRUCT(q_u);
298         ZERO_STRUCT(r_u);
299
300         /* Unmarshall the net server set info. */
301         if(!srv_io_q_net_share_set_info("", &q_u, data, 0)) {
302                 DEBUG(0,("api_srv_net_share_set_info: Failed to unmarshall SRV_Q_NET_SHARE_SET_INFO.\n"));
303                 return False;
304         }
305
306         r_u.status = _srv_net_share_set_info(p, &q_u, &r_u);
307
308         if(!srv_io_r_net_share_set_info("", &r_u, rdata, 0)) {
309                 DEBUG(0,("api_srv_net_share_set_info: Failed to marshall SRV_R_NET_SHARE_SET_INFO.\n"));
310                 return False;
311         }
312
313         return True;
314 }
315
316 /*******************************************************************
317  RPC to add share information.
318 ********************************************************************/
319
320 static BOOL api_srv_net_share_add(pipes_struct *p)
321 {
322         SRV_Q_NET_SHARE_ADD q_u;
323         SRV_R_NET_SHARE_ADD r_u;
324         prs_struct *data = &p->in_data.data;
325         prs_struct *rdata = &p->out_data.rdata;
326
327         ZERO_STRUCT(q_u);
328         ZERO_STRUCT(r_u);
329
330         /* Unmarshall the net server add info. */
331         if(!srv_io_q_net_share_add("", &q_u, data, 0)) {
332                 DEBUG(0,("api_srv_net_share_add: Failed to unmarshall SRV_Q_NET_SHARE_ADD.\n"));
333                 return False;
334         }
335
336         r_u.status = _srv_net_share_add(p, &q_u, &r_u);
337
338         if(!srv_io_r_net_share_add("", &r_u, rdata, 0)) {
339                 DEBUG(0,("api_srv_net_share_add: Failed to marshall SRV_R_NET_SHARE_ADD.\n"));
340                 return False;
341         }
342
343         return True;
344 }
345
346 /*******************************************************************
347  RPC to delete share information.
348 ********************************************************************/
349
350 static BOOL api_srv_net_share_del(pipes_struct *p)
351 {
352         SRV_Q_NET_SHARE_DEL q_u;
353         SRV_R_NET_SHARE_DEL r_u;
354         prs_struct *data = &p->in_data.data;
355         prs_struct *rdata = &p->out_data.rdata;
356
357         ZERO_STRUCT(q_u);
358         ZERO_STRUCT(r_u);
359
360         /* Unmarshall the net server del info. */
361         if(!srv_io_q_net_share_del("", &q_u, data, 0)) {
362                 DEBUG(0,("api_srv_net_share_del: Failed to unmarshall SRV_Q_NET_SHARE_DEL.\n"));
363                 return False;
364         }
365
366         r_u.status = _srv_net_share_del(p, &q_u, &r_u);
367
368         if(!srv_io_r_net_share_del("", &r_u, rdata, 0)) {
369                 DEBUG(0,("api_srv_net_share_del: Failed to marshall SRV_R_NET_SHARE_DEL.\n"));
370                 return False;
371         }
372
373         return True;
374 }
375
376 /*******************************************************************
377  RPC to delete share information.
378 ********************************************************************/
379
380 static BOOL api_srv_net_share_del_sticky(pipes_struct *p)
381 {
382         SRV_Q_NET_SHARE_DEL q_u;
383         SRV_R_NET_SHARE_DEL r_u;
384         prs_struct *data = &p->in_data.data;
385         prs_struct *rdata = &p->out_data.rdata;
386
387         ZERO_STRUCT(q_u);
388         ZERO_STRUCT(r_u);
389
390         /* Unmarshall the net server del info. */
391         if(!srv_io_q_net_share_del("", &q_u, data, 0)) {
392                 DEBUG(0,("api_srv_net_share_del_sticky: Failed to unmarshall SRV_Q_NET_SHARE_DEL.\n"));
393                 return False;
394         }
395
396         r_u.status = _srv_net_share_del_sticky(p, &q_u, &r_u);
397
398         if(!srv_io_r_net_share_del("", &r_u, rdata, 0)) {
399                 DEBUG(0,("api_srv_net_share_del_sticky: Failed to marshall SRV_R_NET_SHARE_DEL.\n"));
400                 return False;
401         }
402
403         return True;
404 }
405
406 /*******************************************************************
407  api_srv_net_remote_tod
408 ********************************************************************/
409
410 static BOOL api_srv_net_remote_tod(pipes_struct *p)
411 {
412         SRV_Q_NET_REMOTE_TOD q_u;
413         SRV_R_NET_REMOTE_TOD r_u;
414         prs_struct *data = &p->in_data.data;
415         prs_struct *rdata = &p->out_data.rdata;
416
417         ZERO_STRUCT(q_u);
418         ZERO_STRUCT(r_u);
419
420         /* grab the net server get enum */
421         if(!srv_io_q_net_remote_tod("", &q_u, data, 0))
422                 return False;
423
424         r_u.status = _srv_net_remote_tod(p, &q_u, &r_u);
425
426         /* store the response in the SMB stream */
427         if(!srv_io_r_net_remote_tod("", &r_u, rdata, 0))
428                 return False;
429
430         return True;
431 }
432
433 /*******************************************************************
434  RPC to enumerate disks available on a server e.g. C:, D: ...
435 *******************************************************************/
436
437 static BOOL api_srv_net_disk_enum(pipes_struct *p) 
438 {
439         SRV_Q_NET_DISK_ENUM q_u;
440         SRV_R_NET_DISK_ENUM r_u;
441         prs_struct *data = &p->in_data.data;
442         prs_struct *rdata = &p->out_data.rdata;
443
444         ZERO_STRUCT(q_u);
445         ZERO_STRUCT(r_u);
446
447         /* Unmarshall the net server disk enum. */
448         if(!srv_io_q_net_disk_enum("", &q_u, data, 0)) {
449                 DEBUG(0,("api_srv_net_disk_enum: Failed to unmarshall SRV_Q_NET_DISK_ENUM.\n"));
450                 return False;
451         }
452
453         r_u.status = _srv_net_disk_enum(p, &q_u, &r_u);
454
455         if(!srv_io_r_net_disk_enum("", &r_u, rdata, 0)) {
456                 DEBUG(0,("api_srv_net_disk_enum: Failed to marshall SRV_R_NET_DISK_ENUM.\n"));
457                 return False;
458         }
459
460         return True;
461 }
462
463 /*******************************************************************
464  NetValidateName (opnum 0x21) 
465 *******************************************************************/
466
467 static BOOL api_srv_net_name_validate(pipes_struct *p) 
468 {
469         SRV_Q_NET_NAME_VALIDATE q_u;
470         SRV_R_NET_NAME_VALIDATE r_u;
471         prs_struct *data = &p->in_data.data;
472         prs_struct *rdata = &p->out_data.rdata;
473  
474         ZERO_STRUCT(q_u);
475         ZERO_STRUCT(r_u);
476   
477         /* Unmarshall the net server disk enum. */
478         if(!srv_io_q_net_name_validate("", &q_u, data, 0)) {
479                 DEBUG(0,("api_srv_net_name_validate: Failed to unmarshall SRV_Q_NET_NAME_VALIDATE.\n"));
480                 return False;
481         }
482
483         r_u.status = _srv_net_name_validate(p, &q_u, &r_u);
484
485         if(!srv_io_r_net_name_validate("", &r_u, rdata, 0)) {
486                 DEBUG(0,("api_srv_net_name_validate: Failed to marshall SRV_R_NET_NAME_VALIDATE.\n"));
487                 return False;
488         }
489
490         return True;
491 }
492
493 /*******************************************************************
494  NetFileQuerySecdesc (opnum 0x27)
495 *******************************************************************/
496
497 static BOOL api_srv_net_file_query_secdesc(pipes_struct *p)
498 {
499         SRV_Q_NET_FILE_QUERY_SECDESC q_u;
500         SRV_R_NET_FILE_QUERY_SECDESC r_u;
501         prs_struct *data = &p->in_data.data;
502         prs_struct *rdata = &p->out_data.rdata;
503
504         ZERO_STRUCT(q_u);
505         ZERO_STRUCT(r_u);
506
507         /* Unmarshall the net file get info from Win9x */
508         if(!srv_io_q_net_file_query_secdesc("", &q_u, data, 0)) {
509                 DEBUG(0,("api_srv_net_file_query_secdesc: Failed to unmarshall SRV_Q_NET_FILE_QUERY_SECDESC.\n"));
510                 return False;
511         }
512
513         r_u.status = _srv_net_file_query_secdesc(p, &q_u, &r_u);
514
515         if(!srv_io_r_net_file_query_secdesc("", &r_u, rdata, 0)) {
516                 DEBUG(0,("api_srv_net_file_query_secdesc: Failed to marshall SRV_R_NET_FILE_QUERY_SECDESC.\n"));
517                 return False;
518         }
519
520         return True;
521 }
522
523 /*******************************************************************
524  NetFileSetSecdesc (opnum 0x28)
525 *******************************************************************/
526
527 static BOOL api_srv_net_file_set_secdesc(pipes_struct *p)
528 {
529         SRV_Q_NET_FILE_SET_SECDESC q_u;
530         SRV_R_NET_FILE_SET_SECDESC r_u;
531         prs_struct *data = &p->in_data.data;
532         prs_struct *rdata = &p->out_data.rdata;
533
534         ZERO_STRUCT(q_u);
535         ZERO_STRUCT(r_u);
536
537         /* Unmarshall the net file set info from Win9x */
538         if(!srv_io_q_net_file_set_secdesc("", &q_u, data, 0)) {
539                 DEBUG(0,("api_srv_net_file_set_secdesc: Failed to unmarshall SRV_Q_NET_FILE_SET_SECDESC.\n"));
540                 return False;
541         }
542
543         r_u.status = _srv_net_file_set_secdesc(p, &q_u, &r_u);
544
545         if(!srv_io_r_net_file_set_secdesc("", &r_u, rdata, 0)) {
546                 DEBUG(0,("api_srv_net_file_set_secdesc: Failed to marshall SRV_R_NET_FILE_SET_SECDESC.\n"));
547                 return False;
548         }
549
550         return True;
551 }
552
553 /*******************************************************************
554 \PIPE\srvsvc commands
555 ********************************************************************/
556
557 static struct api_struct api_srv_cmds[] =
558 {
559       { "SRV_NET_CONN_ENUM"         , SRV_NET_CONN_ENUM         , api_srv_net_conn_enum          },
560       { "SRV_NET_SESS_ENUM"         , SRV_NET_SESS_ENUM         , api_srv_net_sess_enum          },
561       { "SRV_NET_SESS_DEL"          , SRV_NET_SESS_DEL          , api_srv_net_sess_del           },
562       { "SRV_NET_SHARE_ENUM_ALL"    , SRV_NET_SHARE_ENUM_ALL    , api_srv_net_share_enum_all     },
563       { "SRV_NET_SHARE_ENUM"        , SRV_NET_SHARE_ENUM        , api_srv_net_share_enum         },
564       { "SRV_NET_SHARE_ADD"         , SRV_NET_SHARE_ADD         , api_srv_net_share_add          },
565       { "SRV_NET_SHARE_DEL"         , SRV_NET_SHARE_DEL         , api_srv_net_share_del          },
566       { "SRV_NET_SHARE_DEL_STICKY"  , SRV_NET_SHARE_DEL_STICKY  , api_srv_net_share_del_sticky   },
567       { "SRV_NET_SHARE_GET_INFO"    , SRV_NET_SHARE_GET_INFO    , api_srv_net_share_get_info     },
568       { "SRV_NET_SHARE_SET_INFO"    , SRV_NET_SHARE_SET_INFO    , api_srv_net_share_set_info     },
569       { "SRV_NET_FILE_ENUM"         , SRV_NET_FILE_ENUM         , api_srv_net_file_enum          },
570       { "SRV_NET_SRV_GET_INFO"      , SRV_NET_SRV_GET_INFO      , api_srv_net_srv_get_info       },
571       { "SRV_NET_SRV_SET_INFO"      , SRV_NET_SRV_SET_INFO      , api_srv_net_srv_set_info       },
572       { "SRV_NET_REMOTE_TOD"        , SRV_NET_REMOTE_TOD        , api_srv_net_remote_tod         },
573       { "SRV_NET_DISK_ENUM"         , SRV_NET_DISK_ENUM         , api_srv_net_disk_enum          },
574       { "SRV_NET_NAME_VALIDATE"     , SRV_NET_NAME_VALIDATE     , api_srv_net_name_validate      },
575       { "SRV_NET_FILE_QUERY_SECDESC", SRV_NET_FILE_QUERY_SECDESC, api_srv_net_file_query_secdesc },
576       { "SRV_NET_FILE_SET_SECDESC"  , SRV_NET_FILE_SET_SECDESC  , api_srv_net_file_set_secdesc   }
577 };
578
579 void srvsvc_get_pipe_fns( struct api_struct **fns, int *n_fns )
580 {
581         *fns = api_srv_cmds;
582         *n_fns = sizeof(api_srv_cmds) / sizeof(struct api_struct);
583 }
584
585
586 NTSTATUS rpc_srv_init(void)
587 {
588   return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "srvsvc", "ntsvcs", api_srv_cmds,
589                                     sizeof(api_srv_cmds) / sizeof(struct api_struct));
590 }