74ae3aaa16fde92f237270f3b1bb1419fb837079
[sfrench/samba-autobuild/.git] / source / rpc_server / srv_svcctl.c
1 /* 
2  *  Unix SMB/CIFS implementation.
3  *  RPC Pipe client / server routines
4  *  Copyright (C) Gerald Carter                   2005.
5  *  
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *  
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *  
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */
20
21 #include "includes.h"
22
23 #undef DBGC_CLASS
24 #define DBGC_CLASS DBGC_RPC_SRV
25
26 /*******************************************************************
27  ********************************************************************/
28
29 static BOOL api_svcctl_close_service(pipes_struct *p)
30 {
31         SVCCTL_Q_CLOSE_SERVICE q_u;
32         SVCCTL_R_CLOSE_SERVICE r_u;
33         prs_struct *data = &p->in_data.data;
34         prs_struct *rdata = &p->out_data.rdata;
35
36         ZERO_STRUCT(q_u);
37         ZERO_STRUCT(r_u);
38
39         if(!svcctl_io_q_close_service("", &q_u, data, 0))
40                 return False;
41
42         r_u.status = _svcctl_close_service(p, &q_u, &r_u);
43
44         if(!svcctl_io_r_close_service("", &r_u, rdata, 0))
45                 return False;
46
47         return True;
48 }
49
50 /*******************************************************************
51  ********************************************************************/
52
53 static BOOL api_svcctl_open_scmanager(pipes_struct *p)
54 {
55         SVCCTL_Q_OPEN_SCMANAGER q_u;
56         SVCCTL_R_OPEN_SCMANAGER r_u;
57         prs_struct *data = &p->in_data.data;
58         prs_struct *rdata = &p->out_data.rdata;
59
60         ZERO_STRUCT(q_u);
61         ZERO_STRUCT(r_u);
62
63         if(!svcctl_io_q_open_scmanager("", &q_u, data, 0))
64                 return False;
65
66         r_u.status = _svcctl_open_scmanager(p, &q_u, &r_u);
67
68         if(!svcctl_io_r_open_scmanager("", &r_u, rdata, 0))
69                 return False;
70
71         return True;
72 }
73
74 /*******************************************************************
75  ********************************************************************/
76
77 static BOOL api_svcctl_open_service(pipes_struct *p)
78 {
79         SVCCTL_Q_OPEN_SERVICE q_u;
80         SVCCTL_R_OPEN_SERVICE r_u;
81         prs_struct *data = &p->in_data.data;
82         prs_struct *rdata = &p->out_data.rdata;
83
84         ZERO_STRUCT(q_u);
85         ZERO_STRUCT(r_u);
86
87         if(!svcctl_io_q_open_service("", &q_u, data, 0))
88                 return False;
89
90         r_u.status = _svcctl_open_service(p, &q_u, &r_u);
91
92         if(!svcctl_io_r_open_service("", &r_u, rdata, 0))
93                 return False;
94
95         return True;
96 }
97
98 /*******************************************************************
99  ********************************************************************/
100
101 static BOOL api_svcctl_get_display_name(pipes_struct *p)
102 {
103         SVCCTL_Q_GET_DISPLAY_NAME q_u;
104         SVCCTL_R_GET_DISPLAY_NAME r_u;
105         prs_struct *data = &p->in_data.data;
106         prs_struct *rdata = &p->out_data.rdata;
107
108         ZERO_STRUCT(q_u);
109         ZERO_STRUCT(r_u);
110
111         if(!svcctl_io_q_get_display_name("", &q_u, data, 0))
112                 return False;
113
114         r_u.status = _svcctl_get_display_name(p, &q_u, &r_u);
115
116         if(!svcctl_io_r_get_display_name("", &r_u, rdata, 0))
117                 return False;
118
119         return True;
120 }
121
122 /*******************************************************************
123  ********************************************************************/
124
125 static BOOL api_svcctl_query_status(pipes_struct *p)
126 {
127         SVCCTL_Q_QUERY_STATUS q_u;
128         SVCCTL_R_QUERY_STATUS r_u;
129         prs_struct *data = &p->in_data.data;
130         prs_struct *rdata = &p->out_data.rdata;
131
132         ZERO_STRUCT(q_u);
133         ZERO_STRUCT(r_u);
134
135         if(!svcctl_io_q_query_status("", &q_u, data, 0))
136                 return False;
137
138         r_u.status = _svcctl_query_status(p, &q_u, &r_u);
139
140         if(!svcctl_io_r_query_status("", &r_u, rdata, 0))
141                 return False;
142
143         return True;
144 }
145
146 /*******************************************************************
147  ********************************************************************/
148
149 static BOOL api_svcctl_enum_services_status(pipes_struct *p)
150 {
151         SVCCTL_Q_ENUM_SERVICES_STATUS q_u;
152         SVCCTL_R_ENUM_SERVICES_STATUS r_u;
153         prs_struct *data = &p->in_data.data;
154         prs_struct *rdata = &p->out_data.rdata;
155
156         ZERO_STRUCT(q_u);
157         ZERO_STRUCT(r_u);
158
159         if(!svcctl_io_q_enum_services_status("", &q_u, data, 0))
160                 return False;
161
162         r_u.status = _svcctl_enum_services_status(p, &q_u, &r_u);
163
164         if(!svcctl_io_r_enum_services_status("", &r_u, rdata, 0))
165                 return False;
166
167         return True;
168 }
169 /*******************************************************************
170  ********************************************************************/
171
172 static BOOL api_svcctl_query_service_status_ex(pipes_struct *p)
173 {
174         SVCCTL_Q_QUERY_SERVICE_STATUSEX q_u;
175         SVCCTL_R_QUERY_SERVICE_STATUSEX 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         if(!svcctl_io_q_query_service_status_ex("", &q_u, data, 0))
183                 return False;
184
185         r_u.status = _svcctl_query_service_status_ex(p, &q_u, &r_u);
186
187         if(!svcctl_io_r_query_service_status_ex("", &r_u, rdata, 0))
188                 return False;
189
190         return True;
191 }
192 /*******************************************************************
193  ********************************************************************/
194
195 static BOOL api_svcctl_enum_dependent_services(pipes_struct *p)
196 {
197         SVCCTL_Q_ENUM_DEPENDENT_SERVICES q_u;
198         SVCCTL_R_ENUM_DEPENDENT_SERVICES r_u;
199         prs_struct *data = &p->in_data.data;
200         prs_struct *rdata = &p->out_data.rdata;
201
202         ZERO_STRUCT(q_u);
203         ZERO_STRUCT(r_u);
204
205         if(!svcctl_io_q_enum_dependent_services("", &q_u, data, 0))
206                 return False;
207
208         r_u.status = _svcctl_enum_dependent_services(p, &q_u, &r_u);
209
210         if(!svcctl_io_r_enum_dependent_services("", &r_u, rdata, 0))
211                 return False;
212
213         return True;
214 }
215
216 /*******************************************************************
217  ********************************************************************/
218
219 static BOOL api_svcctl_start_service(pipes_struct *p)
220 {
221         SVCCTL_Q_START_SERVICE q_u;
222         SVCCTL_R_START_SERVICE r_u;
223         prs_struct *data = &p->in_data.data;
224         prs_struct *rdata = &p->out_data.rdata;
225
226         ZERO_STRUCT(q_u);
227         ZERO_STRUCT(r_u);
228
229         if(!svcctl_io_q_start_service("", &q_u, data, 0))
230                 return False;
231
232         r_u.status = _svcctl_start_service(p, &q_u, &r_u);
233
234         if(!svcctl_io_r_start_service("", &r_u, rdata, 0))
235                 return False;
236
237         return True;
238 }
239
240 /*******************************************************************
241  ********************************************************************/
242
243 static BOOL api_svcctl_control_service(pipes_struct *p)
244 {
245         SVCCTL_Q_CONTROL_SERVICE q_u;
246         SVCCTL_R_CONTROL_SERVICE r_u;
247         prs_struct *data = &p->in_data.data;
248         prs_struct *rdata = &p->out_data.rdata;
249
250         ZERO_STRUCT(q_u);
251         ZERO_STRUCT(r_u);
252
253         if(!svcctl_io_q_control_service("", &q_u, data, 0))
254                 return False;
255
256         r_u.status = _svcctl_control_service(p, &q_u, &r_u);
257
258         if(!svcctl_io_r_control_service("", &r_u, rdata, 0))
259                 return False;
260
261         return True;
262 }
263
264 /*******************************************************************
265  ********************************************************************/
266
267 static BOOL api_svcctl_query_service_config(pipes_struct *p)
268 {
269         SVCCTL_Q_QUERY_SERVICE_CONFIG q_u;
270         SVCCTL_R_QUERY_SERVICE_CONFIG r_u;
271         prs_struct *data = &p->in_data.data;
272         prs_struct *rdata = &p->out_data.rdata;
273
274         ZERO_STRUCT(q_u);
275         ZERO_STRUCT(r_u);
276
277         if(!svcctl_io_q_query_service_config("", &q_u, data, 0))
278                 return False;
279
280         r_u.status = _svcctl_query_service_config(p, &q_u, &r_u);
281
282         if(!svcctl_io_r_query_service_config("", &r_u, rdata, 0))
283                 return False;
284
285         return True;
286 }
287
288 /*******************************************************************
289  ********************************************************************/
290
291 static BOOL api_svcctl_query_service_config2(pipes_struct *p)
292 {
293         SVCCTL_Q_QUERY_SERVICE_CONFIG2 q_u;
294         SVCCTL_R_QUERY_SERVICE_CONFIG2 r_u;
295         prs_struct *data = &p->in_data.data;
296         prs_struct *rdata = &p->out_data.rdata;
297
298         ZERO_STRUCT(q_u);
299         ZERO_STRUCT(r_u);
300
301         if(!svcctl_io_q_query_service_config2("", &q_u, data, 0))
302                 return False;
303
304         r_u.status = _svcctl_query_service_config2(p, &q_u, &r_u);
305
306         if(!svcctl_io_r_query_service_config2("", &r_u, rdata, 0))
307                 return False;
308
309         return True;
310 }
311
312 /*******************************************************************
313  ********************************************************************/
314
315 static BOOL api_svcctl_lock_service_db(pipes_struct *p)
316 {
317         SVCCTL_Q_LOCK_SERVICE_DB q_u;
318         SVCCTL_R_LOCK_SERVICE_DB r_u;
319         prs_struct *data = &p->in_data.data;
320         prs_struct *rdata = &p->out_data.rdata;
321
322         ZERO_STRUCT(q_u);
323         ZERO_STRUCT(r_u);
324
325         if(!svcctl_io_q_lock_service_db("", &q_u, data, 0))
326                 return False;
327
328         r_u.status = _svcctl_lock_service_db(p, &q_u, &r_u);
329
330         if(!svcctl_io_r_lock_service_db("", &r_u, rdata, 0))
331                 return False;
332
333         return True;
334 }
335
336
337 /*******************************************************************
338  ********************************************************************/
339
340 static BOOL api_svcctl_unlock_service_db(pipes_struct *p)
341 {
342         SVCCTL_Q_UNLOCK_SERVICE_DB q_u;
343         SVCCTL_R_UNLOCK_SERVICE_DB r_u;
344         prs_struct *data = &p->in_data.data;
345         prs_struct *rdata = &p->out_data.rdata;
346
347         ZERO_STRUCT(q_u);
348         ZERO_STRUCT(r_u);
349
350         if(!svcctl_io_q_unlock_service_db("", &q_u, data, 0))
351                 return False;
352
353         r_u.status = _svcctl_unlock_service_db(p, &q_u, &r_u);
354
355         if(!svcctl_io_r_unlock_service_db("", &r_u, rdata, 0))
356                 return False;
357
358         return True;
359 }
360
361 /*******************************************************************
362  ********************************************************************/
363
364 static BOOL api_svcctl_query_security_sec(pipes_struct *p)
365 {
366         SVCCTL_Q_QUERY_SERVICE_SEC q_u;
367         SVCCTL_R_QUERY_SERVICE_SEC r_u;
368         prs_struct *data = &p->in_data.data;
369         prs_struct *rdata = &p->out_data.rdata;
370
371         ZERO_STRUCT(q_u);
372         ZERO_STRUCT(r_u);
373
374         if(!svcctl_io_q_query_service_sec("", &q_u, data, 0))
375                 return False;
376
377         r_u.status = _svcctl_query_service_sec(p, &q_u, &r_u);
378
379         if(!svcctl_io_r_query_service_sec("", &r_u, rdata, 0))
380                 return False;
381
382         return True;
383 }
384
385 /*******************************************************************
386  ********************************************************************/
387
388 static BOOL api_svcctl_set_security_sec(pipes_struct *p)
389 {
390         SVCCTL_Q_SET_SERVICE_SEC q_u;
391         SVCCTL_R_SET_SERVICE_SEC r_u;
392         prs_struct *data = &p->in_data.data;
393         prs_struct *rdata = &p->out_data.rdata;
394
395         ZERO_STRUCT(q_u);
396         ZERO_STRUCT(r_u);
397
398         if(!svcctl_io_q_set_service_sec("", &q_u, data, 0))
399                 return False;
400
401         r_u.status = _svcctl_set_service_sec(p, &q_u, &r_u);
402
403         if(!svcctl_io_r_set_service_sec("", &r_u, rdata, 0))
404                 return False;
405
406         return True;
407 }
408
409
410 /*******************************************************************
411  \PIPE\svcctl commands
412  ********************************************************************/
413
414 static struct api_struct api_svcctl_cmds[] =
415 {
416       { "SVCCTL_CLOSE_SERVICE"              , SVCCTL_CLOSE_SERVICE              , api_svcctl_close_service },
417       { "SVCCTL_OPEN_SCMANAGER_W"           , SVCCTL_OPEN_SCMANAGER_W           , api_svcctl_open_scmanager },
418       { "SVCCTL_OPEN_SERVICE_W"             , SVCCTL_OPEN_SERVICE_W             , api_svcctl_open_service },
419       { "SVCCTL_GET_DISPLAY_NAME"           , SVCCTL_GET_DISPLAY_NAME           , api_svcctl_get_display_name },
420       { "SVCCTL_QUERY_STATUS"               , SVCCTL_QUERY_STATUS               , api_svcctl_query_status },
421       { "SVCCTL_QUERY_SERVICE_CONFIG_W"     , SVCCTL_QUERY_SERVICE_CONFIG_W     , api_svcctl_query_service_config },
422       { "SVCCTL_QUERY_SERVICE_CONFIG2_W"    , SVCCTL_QUERY_SERVICE_CONFIG2_W    , api_svcctl_query_service_config2 },
423       { "SVCCTL_ENUM_SERVICES_STATUS_W"     , SVCCTL_ENUM_SERVICES_STATUS_W     , api_svcctl_enum_services_status },
424       { "SVCCTL_ENUM_DEPENDENT_SERVICES_W"  , SVCCTL_ENUM_DEPENDENT_SERVICES_W  , api_svcctl_enum_dependent_services },
425       { "SVCCTL_START_SERVICE_W"            , SVCCTL_START_SERVICE_W            , api_svcctl_start_service },
426       { "SVCCTL_CONTROL_SERVICE"            , SVCCTL_CONTROL_SERVICE            , api_svcctl_control_service },
427       { "SVCCTL_QUERY_SERVICE_STATUSEX_W"   , SVCCTL_QUERY_SERVICE_STATUSEX_W   , api_svcctl_query_service_status_ex },
428       { "SVCCTL_LOCK_SERVICE_DB"            , SVCCTL_LOCK_SERVICE_DB            , api_svcctl_lock_service_db },
429       { "SVCCTL_UNLOCK_SERVICE_DB"          , SVCCTL_UNLOCK_SERVICE_DB          , api_svcctl_unlock_service_db },
430       { "SVCCTL_QUERY_SERVICE_SEC"          , SVCCTL_QUERY_SERVICE_SEC          , api_svcctl_query_security_sec },
431       { "SVCCTL_SET_SERVICE_SEC"            , SVCCTL_SET_SERVICE_SEC            , api_svcctl_set_security_sec }
432 };
433
434
435 void svcctl_get_pipe_fns( struct api_struct **fns, int *n_fns )
436 {
437         *fns = api_svcctl_cmds;
438         *n_fns = sizeof(api_svcctl_cmds) / sizeof(struct api_struct);
439 }
440
441 NTSTATUS rpc_svcctl_init(void)
442 {
443   return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "svcctl", "ntsvcs", api_svcctl_cmds,
444                                     sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
445 }