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.
(This used to be commit c0f54eeebc84ec9fab63c5b105511762bcc136be)

source3/include/doserr.h
source3/include/rpc_svcctl.h
source3/libsmb/doserr.c
source3/rpc_server/srv_svcctl_nt.c
source3/services/svc_netlogon.c
source3/services/svc_wins.c
source3/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);