Removed 'extern int DEBUGLEVEL' as it is now in the smb.h header.
[samba.git] / source3 / rpc_server / srv_srvsvc.c
1 /* 
2  *  Unix SMB/Netbios implementation.
3  *  Version 1.9.
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.
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 /*******************************************************************
30  api_srv_net_srv_get_info
31 ********************************************************************/
32
33 static BOOL api_srv_net_srv_get_info(pipes_struct *p)
34 {
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;
39
40         ZERO_STRUCT(q_u);
41         ZERO_STRUCT(r_u);
42
43         /* grab the net server get info */
44         if (!srv_io_q_net_srv_get_info("", &q_u, data, 0))
45                 return False;
46
47         r_u.status = _srv_net_srv_get_info(p, &q_u, &r_u);
48
49         /* store the response in the SMB stream */
50         if (!srv_io_r_net_srv_get_info("", &r_u, rdata, 0))
51                 return False;
52
53         return True;
54 }
55
56 /*******************************************************************
57  api_srv_net_srv_get_info
58 ********************************************************************/
59
60 static BOOL api_srv_net_srv_set_info(pipes_struct *p)
61 {
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;
66
67         ZERO_STRUCT(q_u);
68         ZERO_STRUCT(r_u);
69
70         /* grab the net server set info */
71         if (!srv_io_q_net_srv_set_info("", &q_u, data, 0))
72                 return False;
73
74         r_u.status = _srv_net_srv_set_info(p, &q_u, &r_u);
75
76         /* store the response in the SMB stream */
77         if (!srv_io_r_net_srv_set_info("", &r_u, rdata, 0))
78                 return False;
79
80         return True;
81 }
82
83 /*******************************************************************
84  api_srv_net_file_enum
85 ********************************************************************/
86
87 static BOOL api_srv_net_file_enum(pipes_struct *p)
88 {
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;
93
94         ZERO_STRUCT(q_u);
95         ZERO_STRUCT(r_u);
96
97         /* grab the net file enum */
98         if (!srv_io_q_net_file_enum("", &q_u, data, 0))
99                 return False;
100
101         r_u.status = _srv_net_file_enum(p, &q_u, &r_u);
102
103         /* store the response in the SMB stream */
104         if(!srv_io_r_net_file_enum("", &r_u, rdata, 0))
105                 return False;
106
107         return True;
108 }
109
110 /*******************************************************************
111  api_srv_net_conn_enum
112 ********************************************************************/
113
114 static BOOL api_srv_net_conn_enum(pipes_struct *p)
115 {
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;
120
121         ZERO_STRUCT(q_u);
122         ZERO_STRUCT(r_u);
123
124         /* grab the net server get enum */
125         if (!srv_io_q_net_conn_enum("", &q_u, data, 0))
126                 return False;
127
128         r_u.status = _srv_net_conn_enum(p, &q_u, &r_u);
129
130         /* store the response in the SMB stream */
131         if (!srv_io_r_net_conn_enum("", &r_u, rdata, 0))
132                 return False;
133
134         return True;
135 }
136
137 /*******************************************************************
138  Enumerate sessions.
139 ********************************************************************/
140
141 static BOOL api_srv_net_sess_enum(pipes_struct *p)
142 {
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;
147
148         ZERO_STRUCT(q_u);
149         ZERO_STRUCT(r_u);
150
151         /* grab the net server get enum */
152         if (!srv_io_q_net_sess_enum("", &q_u, data, 0))
153                 return False;
154
155         /* construct reply.  always indicate success */
156         r_u.status = _srv_net_sess_enum(p, &q_u, &r_u);
157
158         /* store the response in the SMB stream */
159         if (!srv_io_r_net_sess_enum("", &r_u, rdata, 0))
160                 return False;
161
162         return True;
163 }
164
165 /*******************************************************************
166  RPC to enumerate shares.
167 ********************************************************************/
168
169 static BOOL api_srv_net_share_enum_all(pipes_struct *p)
170 {
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;
175
176         ZERO_STRUCT(q_u);
177         ZERO_STRUCT(r_u);
178
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"));
182                 return False;
183         }
184
185         r_u.status = _srv_net_share_enum_all(p, &q_u, &r_u);
186
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"));
189                 return False;
190         }
191
192         return True;
193 }
194
195 /*******************************************************************
196  RPC to enumerate shares.
197 ********************************************************************/
198
199 static BOOL api_srv_net_share_enum(pipes_struct *p)
200 {
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;
205
206         ZERO_STRUCT(q_u);
207         ZERO_STRUCT(r_u);
208
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"));
212                 return False;
213         }
214
215         r_u.status = _srv_net_share_enum(p, &q_u, &r_u);
216
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"));
219                 return False;
220         }
221
222         return True;
223 }
224
225 /*******************************************************************
226  RPC to return share information.
227 ********************************************************************/
228
229 static BOOL api_srv_net_share_get_info(pipes_struct *p)
230 {
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;
235
236         ZERO_STRUCT(q_u);
237         ZERO_STRUCT(r_u);
238
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"));
242                 return False;
243         }
244
245         r_u.status = _srv_net_share_get_info(p, &q_u, &r_u);
246
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"));
249                 return False;
250         }
251
252         return True;
253 }
254
255 /*******************************************************************
256  RPC to set share information.
257 ********************************************************************/
258
259 static BOOL api_srv_net_share_set_info(pipes_struct *p)
260 {
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;
265
266         ZERO_STRUCT(q_u);
267         ZERO_STRUCT(r_u);
268
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"));
272                 return False;
273         }
274
275         r_u.status = _srv_net_share_set_info(p, &q_u, &r_u);
276
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"));
279                 return False;
280         }
281
282         return True;
283 }
284
285 /*******************************************************************
286  RPC to add share information.
287 ********************************************************************/
288
289 static BOOL api_srv_net_share_add(pipes_struct *p)
290 {
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;
295
296         ZERO_STRUCT(q_u);
297         ZERO_STRUCT(r_u);
298
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"));
302                 return False;
303         }
304
305         r_u.status = _srv_net_share_add(p, &q_u, &r_u);
306
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"));
309                 return False;
310         }
311
312         return True;
313 }
314
315 /*******************************************************************
316  RPC to delete share information.
317 ********************************************************************/
318
319 static BOOL api_srv_net_share_del(pipes_struct *p)
320 {
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;
325
326         ZERO_STRUCT(q_u);
327         ZERO_STRUCT(r_u);
328
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"));
332                 return False;
333         }
334
335         r_u.status = _srv_net_share_del(p, &q_u, &r_u);
336
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"));
339                 return False;
340         }
341
342         return True;
343 }
344
345 /*******************************************************************
346  api_srv_net_remote_tod
347 ********************************************************************/
348
349 static BOOL api_srv_net_remote_tod(pipes_struct *p)
350 {
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;
355
356         ZERO_STRUCT(q_u);
357         ZERO_STRUCT(r_u);
358
359         /* grab the net server get enum */
360         if(!srv_io_q_net_remote_tod("", &q_u, data, 0))
361                 return False;
362
363         r_u.status = _srv_net_remote_tod(p, &q_u, &r_u);
364
365         /* store the response in the SMB stream */
366         if(!srv_io_r_net_remote_tod("", &r_u, rdata, 0))
367                 return False;
368
369         return True;
370 }
371
372 /*******************************************************************
373  RPC to enumerate disks available on a server e.g. C:, D: ...
374 *******************************************************************/
375
376 static BOOL api_srv_net_disk_enum(pipes_struct *p) 
377 {
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;
382
383         ZERO_STRUCT(q_u);
384         ZERO_STRUCT(r_u);
385
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"));
389                 return False;
390         }
391
392         r_u.status = _srv_net_disk_enum(p, &q_u, &r_u);
393
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"));
396                 return False;
397         }
398
399         return True;
400 }
401
402 /*******************************************************************
403  NetValidateName (opnum 0x21) 
404 *******************************************************************/
405
406 static BOOL api_srv_net_name_validate(pipes_struct *p) 
407 {
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;
412  
413         ZERO_STRUCT(q_u);
414         ZERO_STRUCT(r_u);
415   
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"));
419                 return False;
420         }
421
422         r_u.status = _srv_net_name_validate(p, &q_u, &r_u);
423
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"));
426                 return False;
427         }
428
429         return True;
430 }
431
432 /*******************************************************************
433  NetFileQuerySecdesc (opnum 0x27)
434 *******************************************************************/
435
436 static BOOL api_srv_net_file_query_secdesc(pipes_struct *p)
437 {
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;
442
443         ZERO_STRUCT(q_u);
444         ZERO_STRUCT(r_u);
445
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"));
449                 return False;
450         }
451
452         r_u.status = _srv_net_file_query_secdesc(p, &q_u, &r_u);
453
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"));
456                 return False;
457         }
458
459         return True;
460 }
461
462 /*******************************************************************
463  NetFileSetSecdesc (opnum 0x28)
464 *******************************************************************/
465
466 static BOOL api_srv_net_file_set_secdesc(pipes_struct *p)
467 {
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;
472
473         ZERO_STRUCT(q_u);
474         ZERO_STRUCT(r_u);
475
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"));
479                 return False;
480         }
481
482         r_u.status = _srv_net_file_set_secdesc(p, &q_u, &r_u);
483
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"));
486                 return False;
487         }
488
489         return True;
490 }
491
492 /*******************************************************************
493 \PIPE\srvsvc commands
494 ********************************************************************/
495
496 struct api_struct api_srv_cmds[] =
497 {
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},
514         { NULL                    , 0                     , NULL                     }
515 };
516
517 /*******************************************************************
518 receives a srvsvc pipe and responds.
519 ********************************************************************/
520 BOOL api_srvsvc_rpc(pipes_struct *p)
521 {
522         return api_rpcTNP(p, "api_srvsvc_rpc", api_srv_cmds);
523 }