rpc_server/srv_svcctl.c

説明を見る。
00001 /* 
00002  *  Unix SMB/CIFS implementation.
00003  *  RPC Pipe client / server routines
00004  *  Copyright (C) Gerald Carter                   2005.
00005  *  
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *  
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *  
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019  */
00020 
00021 #include "includes.h"
00022 
00023 #undef DBGC_CLASS
00024 #define DBGC_CLASS DBGC_RPC_SRV
00025 
00026 /*******************************************************************
00027  ********************************************************************/
00028 
00029 static BOOL api_svcctl_close_service(pipes_struct *p)
00030 {
00031         SVCCTL_Q_CLOSE_SERVICE q_u;
00032         SVCCTL_R_CLOSE_SERVICE r_u;
00033         prs_struct *data = &p->in_data.data;
00034         prs_struct *rdata = &p->out_data.rdata;
00035 
00036         ZERO_STRUCT(q_u);
00037         ZERO_STRUCT(r_u);
00038 
00039         if(!svcctl_io_q_close_service("", &q_u, data, 0))
00040                 return False;
00041 
00042         r_u.status = _svcctl_close_service(p, &q_u, &r_u);
00043 
00044         if(!svcctl_io_r_close_service("", &r_u, rdata, 0))
00045                 return False;
00046 
00047         return True;
00048 }
00049 
00050 /*******************************************************************
00051  ********************************************************************/
00052 
00053 static BOOL api_svcctl_open_scmanager(pipes_struct *p)
00054 {
00055         SVCCTL_Q_OPEN_SCMANAGER q_u;
00056         SVCCTL_R_OPEN_SCMANAGER r_u;
00057         prs_struct *data = &p->in_data.data;
00058         prs_struct *rdata = &p->out_data.rdata;
00059 
00060         ZERO_STRUCT(q_u);
00061         ZERO_STRUCT(r_u);
00062 
00063         if(!svcctl_io_q_open_scmanager("", &q_u, data, 0))
00064                 return False;
00065 
00066         r_u.status = _svcctl_open_scmanager(p, &q_u, &r_u);
00067 
00068         if(!svcctl_io_r_open_scmanager("", &r_u, rdata, 0))
00069                 return False;
00070 
00071         return True;
00072 }
00073 
00074 /*******************************************************************
00075  ********************************************************************/
00076 
00077 static BOOL api_svcctl_open_service(pipes_struct *p)
00078 {
00079         SVCCTL_Q_OPEN_SERVICE q_u;
00080         SVCCTL_R_OPEN_SERVICE r_u;
00081         prs_struct *data = &p->in_data.data;
00082         prs_struct *rdata = &p->out_data.rdata;
00083 
00084         ZERO_STRUCT(q_u);
00085         ZERO_STRUCT(r_u);
00086 
00087         if(!svcctl_io_q_open_service("", &q_u, data, 0))
00088                 return False;
00089 
00090         r_u.status = _svcctl_open_service(p, &q_u, &r_u);
00091 
00092         if(!svcctl_io_r_open_service("", &r_u, rdata, 0))
00093                 return False;
00094 
00095         return True;
00096 }
00097 
00098 /*******************************************************************
00099  ********************************************************************/
00100 
00101 static BOOL api_svcctl_get_display_name(pipes_struct *p)
00102 {
00103         SVCCTL_Q_GET_DISPLAY_NAME q_u;
00104         SVCCTL_R_GET_DISPLAY_NAME r_u;
00105         prs_struct *data = &p->in_data.data;
00106         prs_struct *rdata = &p->out_data.rdata;
00107 
00108         ZERO_STRUCT(q_u);
00109         ZERO_STRUCT(r_u);
00110 
00111         if(!svcctl_io_q_get_display_name("", &q_u, data, 0))
00112                 return False;
00113 
00114         r_u.status = _svcctl_get_display_name(p, &q_u, &r_u);
00115 
00116         if(!svcctl_io_r_get_display_name("", &r_u, rdata, 0))
00117                 return False;
00118 
00119         return True;
00120 }
00121 
00122 /*******************************************************************
00123  ********************************************************************/
00124 
00125 static BOOL api_svcctl_query_status(pipes_struct *p)
00126 {
00127         SVCCTL_Q_QUERY_STATUS q_u;
00128         SVCCTL_R_QUERY_STATUS r_u;
00129         prs_struct *data = &p->in_data.data;
00130         prs_struct *rdata = &p->out_data.rdata;
00131 
00132         ZERO_STRUCT(q_u);
00133         ZERO_STRUCT(r_u);
00134 
00135         if(!svcctl_io_q_query_status("", &q_u, data, 0))
00136                 return False;
00137 
00138         r_u.status = _svcctl_query_status(p, &q_u, &r_u);
00139 
00140         if(!svcctl_io_r_query_status("", &r_u, rdata, 0))
00141                 return False;
00142 
00143         return True;
00144 }
00145 
00146 /*******************************************************************
00147  ********************************************************************/
00148 
00149 static BOOL api_svcctl_enum_services_status(pipes_struct *p)
00150 {
00151         SVCCTL_Q_ENUM_SERVICES_STATUS q_u;
00152         SVCCTL_R_ENUM_SERVICES_STATUS r_u;
00153         prs_struct *data = &p->in_data.data;
00154         prs_struct *rdata = &p->out_data.rdata;
00155 
00156         ZERO_STRUCT(q_u);
00157         ZERO_STRUCT(r_u);
00158 
00159         if(!svcctl_io_q_enum_services_status("", &q_u, data, 0))
00160                 return False;
00161 
00162         r_u.status = _svcctl_enum_services_status(p, &q_u, &r_u);
00163 
00164         if(!svcctl_io_r_enum_services_status("", &r_u, rdata, 0))
00165                 return False;
00166 
00167         return True;
00168 }
00169 /*******************************************************************
00170  ********************************************************************/
00171 
00172 static BOOL api_svcctl_query_service_status_ex(pipes_struct *p)
00173 {
00174         SVCCTL_Q_QUERY_SERVICE_STATUSEX q_u;
00175         SVCCTL_R_QUERY_SERVICE_STATUSEX r_u;
00176         prs_struct *data = &p->in_data.data;
00177         prs_struct *rdata = &p->out_data.rdata;
00178 
00179         ZERO_STRUCT(q_u);
00180         ZERO_STRUCT(r_u);
00181 
00182         if(!svcctl_io_q_query_service_status_ex("", &q_u, data, 0))
00183                 return False;
00184 
00185         r_u.status = _svcctl_query_service_status_ex(p, &q_u, &r_u);
00186 
00187         if(!svcctl_io_r_query_service_status_ex("", &r_u, rdata, 0))
00188                 return False;
00189 
00190         return True;
00191 }
00192 /*******************************************************************
00193  ********************************************************************/
00194 
00195 static BOOL api_svcctl_enum_dependent_services(pipes_struct *p)
00196 {
00197         SVCCTL_Q_ENUM_DEPENDENT_SERVICES q_u;
00198         SVCCTL_R_ENUM_DEPENDENT_SERVICES r_u;
00199         prs_struct *data = &p->in_data.data;
00200         prs_struct *rdata = &p->out_data.rdata;
00201 
00202         ZERO_STRUCT(q_u);
00203         ZERO_STRUCT(r_u);
00204 
00205         if(!svcctl_io_q_enum_dependent_services("", &q_u, data, 0))
00206                 return False;
00207 
00208         r_u.status = _svcctl_enum_dependent_services(p, &q_u, &r_u);
00209 
00210         if(!svcctl_io_r_enum_dependent_services("", &r_u, rdata, 0))
00211                 return False;
00212 
00213         return True;
00214 }
00215 
00216 /*******************************************************************
00217  ********************************************************************/
00218 
00219 static BOOL api_svcctl_start_service(pipes_struct *p)
00220 {
00221         SVCCTL_Q_START_SERVICE q_u;
00222         SVCCTL_R_START_SERVICE r_u;
00223         prs_struct *data = &p->in_data.data;
00224         prs_struct *rdata = &p->out_data.rdata;
00225 
00226         ZERO_STRUCT(q_u);
00227         ZERO_STRUCT(r_u);
00228 
00229         if(!svcctl_io_q_start_service("", &q_u, data, 0))
00230                 return False;
00231 
00232         r_u.status = _svcctl_start_service(p, &q_u, &r_u);
00233 
00234         if(!svcctl_io_r_start_service("", &r_u, rdata, 0))
00235                 return False;
00236 
00237         return True;
00238 }
00239 
00240 /*******************************************************************
00241  ********************************************************************/
00242 
00243 static BOOL api_svcctl_control_service(pipes_struct *p)
00244 {
00245         SVCCTL_Q_CONTROL_SERVICE q_u;
00246         SVCCTL_R_CONTROL_SERVICE r_u;
00247         prs_struct *data = &p->in_data.data;
00248         prs_struct *rdata = &p->out_data.rdata;
00249 
00250         ZERO_STRUCT(q_u);
00251         ZERO_STRUCT(r_u);
00252 
00253         if(!svcctl_io_q_control_service("", &q_u, data, 0))
00254                 return False;
00255 
00256         r_u.status = _svcctl_control_service(p, &q_u, &r_u);
00257 
00258         if(!svcctl_io_r_control_service("", &r_u, rdata, 0))
00259                 return False;
00260 
00261         return True;
00262 }
00263 
00264 /*******************************************************************
00265  ********************************************************************/
00266 
00267 static BOOL api_svcctl_query_service_config(pipes_struct *p)
00268 {
00269         SVCCTL_Q_QUERY_SERVICE_CONFIG q_u;
00270         SVCCTL_R_QUERY_SERVICE_CONFIG r_u;
00271         prs_struct *data = &p->in_data.data;
00272         prs_struct *rdata = &p->out_data.rdata;
00273 
00274         ZERO_STRUCT(q_u);
00275         ZERO_STRUCT(r_u);
00276 
00277         if(!svcctl_io_q_query_service_config("", &q_u, data, 0))
00278                 return False;
00279 
00280         r_u.status = _svcctl_query_service_config(p, &q_u, &r_u);
00281 
00282         if(!svcctl_io_r_query_service_config("", &r_u, rdata, 0))
00283                 return False;
00284 
00285         return True;
00286 }
00287 
00288 /*******************************************************************
00289  ********************************************************************/
00290 
00291 static BOOL api_svcctl_query_service_config2(pipes_struct *p)
00292 {
00293         SVCCTL_Q_QUERY_SERVICE_CONFIG2 q_u;
00294         SVCCTL_R_QUERY_SERVICE_CONFIG2 r_u;
00295         prs_struct *data = &p->in_data.data;
00296         prs_struct *rdata = &p->out_data.rdata;
00297 
00298         ZERO_STRUCT(q_u);
00299         ZERO_STRUCT(r_u);
00300 
00301         if(!svcctl_io_q_query_service_config2("", &q_u, data, 0))
00302                 return False;
00303 
00304         r_u.status = _svcctl_query_service_config2(p, &q_u, &r_u);
00305 
00306         if(!svcctl_io_r_query_service_config2("", &r_u, rdata, 0))
00307                 return False;
00308 
00309         return True;
00310 }
00311 
00312 /*******************************************************************
00313  ********************************************************************/
00314 
00315 static BOOL api_svcctl_lock_service_db(pipes_struct *p)
00316 {
00317         SVCCTL_Q_LOCK_SERVICE_DB q_u;
00318         SVCCTL_R_LOCK_SERVICE_DB r_u;
00319         prs_struct *data = &p->in_data.data;
00320         prs_struct *rdata = &p->out_data.rdata;
00321 
00322         ZERO_STRUCT(q_u);
00323         ZERO_STRUCT(r_u);
00324 
00325         if(!svcctl_io_q_lock_service_db("", &q_u, data, 0))
00326                 return False;
00327 
00328         r_u.status = _svcctl_lock_service_db(p, &q_u, &r_u);
00329 
00330         if(!svcctl_io_r_lock_service_db("", &r_u, rdata, 0))
00331                 return False;
00332 
00333         return True;
00334 }
00335 
00336 
00337 /*******************************************************************
00338  ********************************************************************/
00339 
00340 static BOOL api_svcctl_unlock_service_db(pipes_struct *p)
00341 {
00342         SVCCTL_Q_UNLOCK_SERVICE_DB q_u;
00343         SVCCTL_R_UNLOCK_SERVICE_DB r_u;
00344         prs_struct *data = &p->in_data.data;
00345         prs_struct *rdata = &p->out_data.rdata;
00346 
00347         ZERO_STRUCT(q_u);
00348         ZERO_STRUCT(r_u);
00349 
00350         if(!svcctl_io_q_unlock_service_db("", &q_u, data, 0))
00351                 return False;
00352 
00353         r_u.status = _svcctl_unlock_service_db(p, &q_u, &r_u);
00354 
00355         if(!svcctl_io_r_unlock_service_db("", &r_u, rdata, 0))
00356                 return False;
00357 
00358         return True;
00359 }
00360 
00361 /*******************************************************************
00362  ********************************************************************/
00363 
00364 static BOOL api_svcctl_query_security_sec(pipes_struct *p)
00365 {
00366         SVCCTL_Q_QUERY_SERVICE_SEC q_u;
00367         SVCCTL_R_QUERY_SERVICE_SEC r_u;
00368         prs_struct *data = &p->in_data.data;
00369         prs_struct *rdata = &p->out_data.rdata;
00370 
00371         ZERO_STRUCT(q_u);
00372         ZERO_STRUCT(r_u);
00373 
00374         if(!svcctl_io_q_query_service_sec("", &q_u, data, 0))
00375                 return False;
00376 
00377         r_u.status = _svcctl_query_service_sec(p, &q_u, &r_u);
00378 
00379         if(!svcctl_io_r_query_service_sec("", &r_u, rdata, 0))
00380                 return False;
00381 
00382         return True;
00383 }
00384 
00385 /*******************************************************************
00386  ********************************************************************/
00387 
00388 static BOOL api_svcctl_set_security_sec(pipes_struct *p)
00389 {
00390         SVCCTL_Q_SET_SERVICE_SEC q_u;
00391         SVCCTL_R_SET_SERVICE_SEC r_u;
00392         prs_struct *data = &p->in_data.data;
00393         prs_struct *rdata = &p->out_data.rdata;
00394 
00395         ZERO_STRUCT(q_u);
00396         ZERO_STRUCT(r_u);
00397 
00398         if(!svcctl_io_q_set_service_sec("", &q_u, data, 0))
00399                 return False;
00400 
00401         r_u.status = _svcctl_set_service_sec(p, &q_u, &r_u);
00402 
00403         if(!svcctl_io_r_set_service_sec("", &r_u, rdata, 0))
00404                 return False;
00405 
00406         return True;
00407 }
00408 
00409 
00410 /*******************************************************************
00411  \PIPE\svcctl commands
00412  ********************************************************************/
00413 
00414 static struct api_struct api_svcctl_cmds[] =
00415 {
00416       { "SVCCTL_CLOSE_SERVICE"              , SVCCTL_CLOSE_SERVICE              , api_svcctl_close_service },
00417       { "SVCCTL_OPEN_SCMANAGER_W"           , SVCCTL_OPEN_SCMANAGER_W           , api_svcctl_open_scmanager },
00418       { "SVCCTL_OPEN_SERVICE_W"             , SVCCTL_OPEN_SERVICE_W             , api_svcctl_open_service },
00419       { "SVCCTL_GET_DISPLAY_NAME"           , SVCCTL_GET_DISPLAY_NAME           , api_svcctl_get_display_name },
00420       { "SVCCTL_QUERY_STATUS"               , SVCCTL_QUERY_STATUS               , api_svcctl_query_status },
00421       { "SVCCTL_QUERY_SERVICE_CONFIG_W"     , SVCCTL_QUERY_SERVICE_CONFIG_W     , api_svcctl_query_service_config },
00422       { "SVCCTL_QUERY_SERVICE_CONFIG2_W"    , SVCCTL_QUERY_SERVICE_CONFIG2_W    , api_svcctl_query_service_config2 },
00423       { "SVCCTL_ENUM_SERVICES_STATUS_W"     , SVCCTL_ENUM_SERVICES_STATUS_W     , api_svcctl_enum_services_status },
00424       { "SVCCTL_ENUM_DEPENDENT_SERVICES_W"  , SVCCTL_ENUM_DEPENDENT_SERVICES_W  , api_svcctl_enum_dependent_services },
00425       { "SVCCTL_START_SERVICE_W"            , SVCCTL_START_SERVICE_W            , api_svcctl_start_service },
00426       { "SVCCTL_CONTROL_SERVICE"            , SVCCTL_CONTROL_SERVICE            , api_svcctl_control_service },
00427       { "SVCCTL_QUERY_SERVICE_STATUSEX_W"   , SVCCTL_QUERY_SERVICE_STATUSEX_W   , api_svcctl_query_service_status_ex },
00428       { "SVCCTL_LOCK_SERVICE_DB"            , SVCCTL_LOCK_SERVICE_DB            , api_svcctl_lock_service_db },
00429       { "SVCCTL_UNLOCK_SERVICE_DB"          , SVCCTL_UNLOCK_SERVICE_DB          , api_svcctl_unlock_service_db },
00430       { "SVCCTL_QUERY_SERVICE_SEC"          , SVCCTL_QUERY_SERVICE_SEC          , api_svcctl_query_security_sec },
00431       { "SVCCTL_SET_SERVICE_SEC"            , SVCCTL_SET_SERVICE_SEC            , api_svcctl_set_security_sec }
00432 };
00433 
00434 
00435 void svcctl_get_pipe_fns( struct api_struct **fns, int *n_fns )
00436 {
00437         *fns = api_svcctl_cmds;
00438         *n_fns = sizeof(api_svcctl_cmds) / sizeof(struct api_struct);
00439 }
00440 
00441 NTSTATUS rpc_svcctl_init(void)
00442 {
00443   return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "svcctl", "ntsvcs", api_svcctl_cmds,
00444                                     sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
00445 }

Sambaに対してSat Aug 29 21:23:22 2009に生成されました。  doxygen 1.4.7