]> git.samba.org - samba.git/commitdiff
r7610: can successfully stop and start the 'spooler' service by setting the state...
authorGerald Carter <jerry@samba.org>
Wed, 15 Jun 2005 15:18:18 +0000 (15:18 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:57:16 +0000 (10:57 -0500)
(This used to be commit f19c10d0c3e7701066b765c712df0636e914bf7e)

source3/include/rpc_svcctl.h
source3/param/loadparm.c
source3/rpc_server/srv_svcctl_nt.c
source3/services/svc_spoolss.c

index 8ce2cbe404e845375ff460a8c0d5a9a5e86254f7..77dd004fed40a4156b3909c88ed5b6c2529d761f 100644 (file)
@@ -55,6 +55,7 @@
 
 /* SERVER_STATUS - CurrentState */
 
+#define SVCCTL_STATE_UNKNOWN           0x00000000      /* only used internally to smbd */
 #define SVCCTL_STOPPED                 0x00000001
 #define SVCCTL_START_PENDING           0x00000002
 #define SVCCTL_STOP_PENDING            0x00000003
index bfd7b650cbeb3608221f85766deb9f30aff78c29..0083b50820827cc151488830ed19e42a89437ae3 100644 (file)
@@ -1860,7 +1860,7 @@ FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
-FN_GLOBAL_INTEGER(lp_disable_spoolss, &Globals.bDisableSpoolss)
+FN_GLOBAL_INTEGER(_lp_disable_spoolss, &Globals.bDisableSpoolss)
 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
@@ -4466,6 +4466,32 @@ const char *lp_printcapname(void)
  Ensure we don't use sendfile if server smb signing is active.
 ********************************************************************/
 
+static uint32 spoolss_state;
+
+BOOL lp_disable_spoolss( void )
+{
+       if ( spoolss_state == SVCCTL_STATE_UNKNOWN )
+               spoolss_state = _lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
+
+       return spoolss_state == SVCCTL_STOPPED ? True : False;
+}
+
+void lp_set_spoolss_state( uint32 state )
+{
+       SMB_ASSERT( (state == SVCCTL_STOPPED) || (state == SVCCTL_RUNNING) );
+
+       spoolss_state = state;
+}
+
+uint32 lp_get_spoolss_state( void )
+{
+       return lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
+}
+
+/*******************************************************************
+ Ensure we don't use sendfile if server smb signing is active.
+********************************************************************/
+
 BOOL lp_use_sendfile(int snum)
 {
        /* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
index c557036800071c5f5bb263313a71b7f99406443b..230a222b8d52840cf5eebbe16aeb22d2c738ca69 100644 (file)
@@ -318,6 +318,13 @@ WERROR _svcctl_query_status(pipes_struct *p, SVCCTL_Q_QUERY_STATUS *q_u, SVCCTL_
        if ( !(info->access_granted & SC_RIGHT_SVC_QUERY_STATUS) )
                return WERR_ACCESS_DENIED;
                
+       /* try the service specific status call */
+
+       if ( info->ops ) 
+               return info->ops->service_status( &r_u->svc_status );
+
+       /* default action for now */
+
        r_u->svc_status.type = 0x0020;
        r_u->svc_status.state = 0x0004;
        r_u->svc_status.controls_accepted = 0x0005;
@@ -497,8 +504,6 @@ WERROR _svcctl_start_service(pipes_struct *p, SVCCTL_Q_START_SERVICE *q_u, SVCCT
                return WERR_ACCESS_DENIED;
                
        return info->ops->start_service();
-       
-       return WERR_OK;
 }
 
 /********************************************************************
@@ -521,71 +526,6 @@ WERROR _svcctl_control_service(pipes_struct *p, SVCCTL_Q_CONTROL_SERVICE *q_u, S
                return WERR_ACCESS_DENIED;
                
        return info->ops->stop_service( &r_u->svc_status );
-               
-#if 0
-       SERVICE_INFO *service_info;
-       POLICY_HND   *handle;
-       pstring      command;
-       SERVICE_STATUS *service_status;
-       int          ret,fd;
-
-       /* need to find the service name by the handle that is open */
-       handle = &(q_u->handle);
-
-       service_info = find_service_info_by_hnd(p, handle);
-
-       if (!service_info) {
-               DEBUG(10, ("_svcctl_control_service : Can't find the service for the handle\n"));
-               return WERR_BADFID; 
-       }
-
-       /* we return a SERVICE_STATUS structure if there's an error. */
-       if ( !(service_status = TALLOC_ARRAY(p->mem_ctx, SERVICE_STATUS, 1 ))  )
-               return WERR_NOMEM;
-
-       DEBUG(10, ("_svcctl_control_service: Found service [%s], [%s]\n",
-               service_info->servicename, service_info->filename));
-
-       /* TODO  - call the service config function here... */
-       memset(command, 0, sizeof(command));
-       if (q_u->control == SVCCTL_CONTROL_STOP) {
-               slprintf(command, sizeof(command)-1, "%s%s%s %s", dyn_LIBDIR, SVCCTL_SCRIPT_DIR,
-                       service_info->filename, "stop");
-       }
-
-       if (q_u->control == SVCCTL_CONTROL_PAUSE) {
-               slprintf(command, sizeof(command)-1, "%s%s%s %s", dyn_LIBDIR, SVCCTL_SCRIPT_DIR,
-                       service_info->filename, "stop");
-       }
-
-       if (q_u->control == SVCCTL_CONTROL_CONTINUE) {
-               slprintf(command, sizeof(command)-1, "%s%s%s %s", dyn_LIBDIR, SVCCTL_SCRIPT_DIR,
-                       service_info->filename, "restart");
-       }
-
-        DEBUG(10, ("_svcctl_control_service: status command is [%s]\n", command));
-
-       /* TODO  - wrap in privilege check */
-
-       ret = smbrun(command, &fd);
-       DEBUGADD(10, ("returned [%d]\n", ret));
-        close(fd);
-
-       if(ret != 0)
-               DEBUG(10, ("enum_external_services: Command returned  [%d]\n", ret));
-
-       /* SET all service_stats bits here...*/
-       if (ret == 0) {
-               service_status->state              = SVCCTL_RUNNING;
-               service_status->controls_accepted  = SVCCTL_CONTROL_SHUTDOWN | SVCCTL_CONTROL_STOP;
-       } else {
-               service_status->state              = SVCCTL_STOPPED;
-               service_status->controls_accepted  = 0;
-       }
-
-       DEBUG(10, ("_svcctl_query_service_config: Should call the commFound service [%s], [%s]\n",service_info->servicename,service_info->filename));
-
-#endif
 }
 
 /********************************************************************
index bd2f7173f1943cf173673682f583d446fe411bdc..5f8fa73ced4ab16c67cb6cf33358b8dfac6337c8 100644 (file)
 
 static WERROR spoolss_stop( SERVICE_STATUS *service_status )
 {
+       ZERO_STRUCTP( service_status );
+       
+       lp_set_spoolss_state( SVCCTL_STOPPED );
+
+       service_status->type              = 0x110;
+       service_status->state             = SVCCTL_STOPPED;
+       service_status->controls_accepted = SVCCTL_ACCEPT_STOP;
+
+       DEBUG(6,("spoolss_stop: spooler stopped (not really)\n"));
+
        return WERR_OK;
 }
 
@@ -35,6 +45,13 @@ static WERROR spoolss_stop( SERVICE_STATUS *service_status )
 
 static WERROR spoolss_start( void )
 {
+       /* see if the smb.conf will support this anyways */
+       
+       if ( _lp_disable_spoolss() )
+               return WERR_ACCESS_DENIED;
+       
+       lp_set_spoolss_state( SVCCTL_RUNNING ); 
+       
        return WERR_OK;
 }
 
@@ -43,6 +60,10 @@ static WERROR spoolss_start( void )
 
 static WERROR spoolss_status( SERVICE_STATUS *service_status )
 {
+       service_status->type              = 0x110;
+       service_status->state             = lp_get_spoolss_state();
+       service_status->controls_accepted = SVCCTL_ACCEPT_STOP;
+       
        return WERR_OK;
 }