r12173: doing some service control work
authorGerald Carter <jerry@samba.org>
Sun, 11 Dec 2005 04:21:34 +0000 (04:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:05:47 +0000 (11:05 -0500)
* Add a few new error codes for disabled services
* dump some more details about service status in 'net rpc service'
* disable the WINS and NetLogon services if not configured in smb.conf

Still trying to figure out how to disable the start button
on the NetLogon and WINS services.

source/include/doserr.h
source/include/rpc_svcctl.h
source/libsmb/doserr.c
source/rpc_server/srv_svcctl_nt.c
source/services/svc_netlogon.c
source/services/svc_wins.c
source/utils/net_rpc_service.c

index 60c450c819dc9f0d4fac252ca44337dfeaf4eb42..62c1e4fa22d47611796c983af5bbe66763d8762d 100644 (file)
 #define WERR_REG_FILE_INVALID W_ERROR(1017)
 #define WERR_NO_SUCH_SERVICE W_ERROR(1060)
 #define WERR_INVALID_SERVICE_CONTROL W_ERROR(1052)
+#define WERR_SERVICE_DISABLED W_ERROR(1058)
+#define WERR_SERVICE_NEVER_STARTED W_ERROR(1077)
 #define WERR_MACHINE_LOCKED W_ERROR(1271)
 #define WERR_INVALID_SECURITY_DESCRIPTOR W_ERROR(1338)
 #define WERR_EVENTLOG_FILE_CORRUPT W_ERROR(1500)
index f5ad2afa1c7f9fafb51374a2685be84f31facf84..4a058999a38b80d22d1756bc86232bb5d57dd4f1 100644 (file)
@@ -69,6 +69,7 @@
 
 /* SERVER_STATUS - ControlAccepted */
 
+#define SVCCTL_ACCEPT_NONE                     0x00000000
 #define SVCCTL_ACCEPT_STOP                     0x00000001
 #define SVCCTL_ACCEPT_PAUSE_CONTINUE           0x00000002
 #define SVCCTL_ACCEPT_SHUTDOWN                 0x00000004
@@ -126,7 +127,7 @@ typedef struct {
        uint32 type;
        uint32 state;
        uint32 controls_accepted;
-       uint32 win32_exit_code;
+       WERROR win32_exit_code;
        uint32 service_exit_code;
        uint32 check_point;
        uint32 wait_hint;
index dd0358f69a572c90083d7d95478ce3aca12ee25c..253164963a40cb065ad704b265308f4b0aeafd43 100644 (file)
@@ -76,6 +76,7 @@ werror_code_struct dos_errs[] =
        { "WERR_REG_CORRUPT", WERR_REG_CORRUPT },
        { "WERR_REG_IO_FAILURE", WERR_REG_IO_FAILURE },
        { "WERR_REG_FILE_INVALID", WERR_REG_FILE_INVALID },
+       { "WERR_SERVICE_DISABLED", WERR_SERVICE_DISABLED },
        { NULL, W_ERROR(0) }
 };
 
index bbf313f7fa1a0a0e53d6fe0ea3e78f0a584fa3c8..97c38753c33645e9482301875b2d95021efdf0ca 100644 (file)
@@ -615,9 +615,20 @@ static WERROR fill_svc_config( TALLOC_CTX *ctx, const char *name, SERVICE_CONFIG
        
        config->tag_id           = 0x00000000;                  /* unassigned loadorder group */
        config->service_type     = SVCCTL_WIN32_OWN_PROC;
-       config->start_type       = SVCCTL_DEMAND_START;
        config->error_control    = SVCCTL_SVC_ERROR_NORMAL;
 
+       /* set the start type.  NetLogon and WINS are disabled to prevent 
+          the client from showing the "Start" button (if of course the services
+          are not running */
+
+       if ( strequal( name, "NETLOGON" ) && ( lp_servicenumber(name) == -1 ) )
+               config->start_type = SVCCTL_DISABLED;
+       else if ( strequal( name, "WINS" ) && ( !lp_wins_support() ))
+               config->start_type = SVCCTL_DISABLED;
+       else
+               config->start_type = SVCCTL_DEMAND_START;
+       
+
        TALLOC_FREE( values );
 
        return WERR_OK;
index 2aa5a31cde3573e9774256959dcda4cd9ec4141a..1bbef325ac32ae37d5553f535d07b76ee55cb708 100644 (file)
 /*********************************************************************
 *********************************************************************/
 
-static WERROR netlogon_stop( const char *service, SERVICE_STATUS *service_status )
+static WERROR netlogon_status( const char *service, SERVICE_STATUS *service_status )
 {
-       return WERR_ACCESS_DENIED;
+       ZERO_STRUCTP( service_status );
+
+        service_status->type              = 0x20;
+        service_status->controls_accepted = SVCCTL_ACCEPT_NONE;
+
+       if ( lp_servicenumber("NETLOGON") != -1 ) {
+               service_status->state              = SVCCTL_RUNNING;
+               service_status->win32_exit_code    = WERR_SERVICE_NEVER_STARTED;
+       }
+       else
+               service_status->state              = SVCCTL_STOPPED;
+       
+       return WERR_OK;
 }
 
 /*********************************************************************
 *********************************************************************/
 
-static WERROR netlogon_start( const char *service )
+static WERROR netlogon_stop( const char *service, SERVICE_STATUS *service_status )
 {
+       netlogon_status( service, service_status );
+
        return WERR_ACCESS_DENIED;
 }
 
 /*********************************************************************
 *********************************************************************/
 
-static WERROR netlogon_status( const char *service, SERVICE_STATUS *service_status )
+static WERROR netlogon_start( const char *service )
 {
-       ZERO_STRUCTP( service_status );
+       if ( lp_servicenumber("NETLOGON") == -1 )
+               return WERR_SERVICE_DISABLED;
 
-       service_status->type              = 0x20;
-       if ( lp_servicenumber("NETLOGON") != -1 ) 
-               service_status->state              = SVCCTL_RUNNING;
-       else
-               service_status->state              = SVCCTL_STOPPED;
-       
-       return WERR_OK;
+       return WERR_ACCESS_DENIED;
 }
 
 /*********************************************************************
index 3a4650664dfaf7034d22caa1709735288424484d..37cfc99c06eb2ba71213c3b126344d3464e44b7d 100644 (file)
 /*********************************************************************
 *********************************************************************/
 
-static WERROR wins_stop( const char *service, SERVICE_STATUS *service_status )
+static WERROR wins_status( const char *service, SERVICE_STATUS *service_status )
 {
-       return WERR_ACCESS_DENIED;
+       ZERO_STRUCTP( service_status );
+
+       service_status->type              = 0x10;
+       service_status->controls_accepted = SVCCTL_ACCEPT_NONE;
+
+       if ( lp_wins_support() ) 
+               service_status->state     = SVCCTL_RUNNING;
+       else {
+               service_status->state              = SVCCTL_STOPPED;
+               service_status->win32_exit_code    = WERR_SERVICE_NEVER_STARTED;
+       }
+       
+       return WERR_OK;
 }
 
 /*********************************************************************
 *********************************************************************/
 
-static WERROR wins_start( const char *service )
+static WERROR wins_stop( const char *service, SERVICE_STATUS *service_status )
 {
+       wins_status( service, service_status );
+
        return WERR_ACCESS_DENIED;
 }
 
 /*********************************************************************
 *********************************************************************/
 
-static WERROR wins_status( const char *service, SERVICE_STATUS *service_status )
+static WERROR wins_start( const char *service )
 {
-       ZERO_STRUCTP( service_status );
-
-       service_status->type              = 0x10;
-       if ( lp_wins_support() ) 
-               service_status->state     = SVCCTL_RUNNING;
-       else
-               service_status->state     = SVCCTL_STOPPED;
-       
-       return WERR_OK;
+       return WERR_ACCESS_DENIED;
 }
 
 /*********************************************************************
index 3cc4790884cc10e1802371b60a815cf88fe4a507..ed7d1dfab1ffb3628c4e124f2a7d69e8d1ad715e 100644 (file)
@@ -254,6 +254,7 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
        /* print out the configuration information for the service */
 
        d_printf("Configuration details:\n");
+       d_printf("\tControls Accepted    = 0x%x\n", service_status.controls_accepted);
        d_printf("\tService Type         = 0x%x\n", config.service_type);
        d_printf("\tStart Type           = 0x%x\n", config.start_type);
        d_printf("\tError Control        = 0x%x\n", config.error_control);