2009-01-09 16:32:39 +03:00
/*
2005-06-15 04:54:43 +04:00
* Unix SMB / CIFS implementation .
* Service Control API Implementation
* Copyright ( C ) Gerald Carter 2005.
2009-01-09 16:32:39 +03:00
*
2005-06-15 04:54:43 +04:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
* the Free Software Foundation ; either version 3 of the License , or
2005-06-15 04:54:43 +04:00
* ( at your option ) any later version .
2009-01-09 16:32:39 +03:00
*
2005-06-15 04:54:43 +04:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2009-01-09 16:32:39 +03:00
*
2005-06-15 04:54:43 +04:00
* You should have received a copy of the GNU General Public License
2007-07-10 09:23:25 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2005-06-15 04:54:43 +04:00
*/
# include "includes.h"
2010-05-20 15:39:46 +04:00
# include "services/services.h"
2005-06-15 04:54:43 +04:00
/*********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-01-08 15:23:59 +03:00
static WERROR rcinit_stop ( const char * service , struct SERVICE_STATUS * status )
2005-06-15 04:54:43 +04:00
{
2007-11-21 04:57:47 +03:00
char * command = NULL ;
2005-09-30 21:13:37 +04:00
int ret , fd ;
2007-11-21 04:57:47 +03:00
if ( asprintf ( & command , " %s/%s/%s stop " ,
2008-08-15 02:50:56 +04:00
get_dyn_MODULESDIR ( ) , SVCCTL_SCRIPT_DIR , service ) < 0 ) {
2015-12-03 17:24:16 +03:00
return WERR_NOT_ENOUGH_MEMORY ;
2007-11-21 04:57:47 +03:00
}
2005-09-30 21:13:37 +04:00
/* we've already performed the access check when the service was opened */
2007-11-21 04:57:47 +03:00
2005-09-30 21:13:37 +04:00
become_root ( ) ;
2016-10-12 18:55:15 +03:00
ret = smbrun ( command , & fd , NULL ) ;
2005-09-30 21:13:37 +04:00
unbecome_root ( ) ;
2007-11-21 04:57:47 +03:00
2005-09-30 21:13:37 +04:00
DEBUGADD ( 5 , ( " rcinit_start: [%s] returned [%d] \n " , command , ret ) ) ;
close ( fd ) ;
2007-11-21 04:57:47 +03:00
SAFE_FREE ( command ) ;
2005-09-30 21:13:37 +04:00
ZERO_STRUCTP ( status ) ;
2009-01-09 16:32:39 +03:00
status - > type = SERVICE_TYPE_WIN32_SHARE_PROCESS ;
status - > state = ( ret = = 0 ) ? SVCCTL_STOPPED : SVCCTL_RUNNING ;
status - > controls_accepted = SVCCTL_ACCEPT_STOP |
SVCCTL_ACCEPT_SHUTDOWN ;
2005-09-30 21:13:37 +04:00
return ( ret = = 0 ) ? WERR_OK : WERR_ACCESS_DENIED ;
2005-06-15 04:54:43 +04:00
}
/*********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR rcinit_start ( const char * service )
2005-06-15 04:54:43 +04:00
{
2007-11-21 04:57:47 +03:00
char * command = NULL ;
2005-09-30 21:13:37 +04:00
int ret , fd ;
2007-11-21 04:57:47 +03:00
if ( asprintf ( & command , " %s/%s/%s start " ,
2008-08-15 02:50:56 +04:00
get_dyn_MODULESDIR ( ) , SVCCTL_SCRIPT_DIR , service ) < 0 ) {
2015-12-03 17:24:16 +03:00
return WERR_NOT_ENOUGH_MEMORY ;
2007-11-21 04:57:47 +03:00
}
2005-09-30 21:13:37 +04:00
/* we've already performed the access check when the service was opened */
2007-11-21 04:57:47 +03:00
2005-09-30 21:13:37 +04:00
become_root ( ) ;
2016-10-12 18:55:15 +03:00
ret = smbrun ( command , & fd , NULL ) ;
2005-09-30 21:13:37 +04:00
unbecome_root ( ) ;
2007-11-21 04:57:47 +03:00
2005-09-30 21:13:37 +04:00
DEBUGADD ( 5 , ( " rcinit_start: [%s] returned [%d] \n " , command , ret ) ) ;
2007-11-21 04:57:47 +03:00
close ( fd ) ;
SAFE_FREE ( command ) ;
2005-09-30 21:13:37 +04:00
return ( ret = = 0 ) ? WERR_OK : WERR_ACCESS_DENIED ;
2005-06-15 04:54:43 +04:00
}
/*********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-01-08 15:23:59 +03:00
static WERROR rcinit_status ( const char * service , struct SERVICE_STATUS * status )
2005-06-15 04:54:43 +04:00
{
2007-11-21 04:57:47 +03:00
char * command = NULL ;
2005-09-30 21:13:37 +04:00
int ret , fd ;
2007-11-21 04:57:47 +03:00
if ( asprintf ( & command , " %s/%s/%s status " ,
2008-08-15 02:50:56 +04:00
get_dyn_MODULESDIR ( ) , SVCCTL_SCRIPT_DIR , service ) < 0 ) {
2015-12-03 17:24:16 +03:00
return WERR_NOT_ENOUGH_MEMORY ;
2007-11-21 04:57:47 +03:00
}
2005-09-30 21:13:37 +04:00
/* we've already performed the access check when the service was opened */
/* assume as return code of 0 means that the service is ok. Anything else
is STOPPED */
2007-11-21 04:57:47 +03:00
2005-09-30 21:13:37 +04:00
become_root ( ) ;
2016-10-12 18:55:15 +03:00
ret = smbrun ( command , & fd , NULL ) ;
2005-09-30 21:13:37 +04:00
unbecome_root ( ) ;
2007-11-21 04:57:47 +03:00
2005-09-30 21:13:37 +04:00
DEBUGADD ( 5 , ( " rcinit_start: [%s] returned [%d] \n " , command , ret ) ) ;
close ( fd ) ;
2007-11-21 04:57:47 +03:00
SAFE_FREE ( command ) ;
2005-09-30 21:13:37 +04:00
ZERO_STRUCTP ( status ) ;
2009-01-09 16:32:39 +03:00
status - > type = SERVICE_TYPE_WIN32_SHARE_PROCESS ;
status - > state = ( ret = = 0 ) ? SVCCTL_RUNNING : SVCCTL_STOPPED ;
status - > controls_accepted = SVCCTL_ACCEPT_STOP |
SVCCTL_ACCEPT_SHUTDOWN ;
2005-09-30 21:13:37 +04:00
2005-06-15 04:54:43 +04:00
return WERR_OK ;
}
/*********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* struct for svcctl control to manipulate rcinit service */
SERVICE_CONTROL_OPS rcinit_svc_ops = {
rcinit_stop ,
rcinit_start ,
rcinit_status
} ;