svn commit: samba r7610 - in branches/SAMBA_3_0/source: include param rpc_server services

jerry at samba.org jerry at samba.org
Wed Jun 15 15:18:18 GMT 2005


Author: jerry
Date: 2005-06-15 15:18:18 +0000 (Wed, 15 Jun 2005)
New Revision: 7610

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=7610

Log:
can successfully stop and start the 'spooler' service by setting the state for the 'disable spoolss' parameter in memory for an individual smbd
Modified:
   branches/SAMBA_3_0/source/include/rpc_svcctl.h
   branches/SAMBA_3_0/source/param/loadparm.c
   branches/SAMBA_3_0/source/rpc_server/srv_svcctl_nt.c
   branches/SAMBA_3_0/source/services/svc_spoolss.c


Changeset:
Modified: branches/SAMBA_3_0/source/include/rpc_svcctl.h
===================================================================
--- branches/SAMBA_3_0/source/include/rpc_svcctl.h	2005-06-15 14:24:11 UTC (rev 7609)
+++ branches/SAMBA_3_0/source/include/rpc_svcctl.h	2005-06-15 15:18:18 UTC (rev 7610)
@@ -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

Modified: branches/SAMBA_3_0/source/param/loadparm.c
===================================================================
--- branches/SAMBA_3_0/source/param/loadparm.c	2005-06-15 14:24:11 UTC (rev 7609)
+++ branches/SAMBA_3_0/source/param/loadparm.c	2005-06-15 15:18:18 UTC (rev 7610)
@@ -1860,7 +1860,7 @@
 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 @@
  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. */

Modified: branches/SAMBA_3_0/source/rpc_server/srv_svcctl_nt.c
===================================================================
--- branches/SAMBA_3_0/source/rpc_server/srv_svcctl_nt.c	2005-06-15 14:24:11 UTC (rev 7609)
+++ branches/SAMBA_3_0/source/rpc_server/srv_svcctl_nt.c	2005-06-15 15:18:18 UTC (rev 7610)
@@ -318,6 +318,13 @@
 	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 @@
 		return WERR_ACCESS_DENIED;
 		
 	return info->ops->start_service();
-	
-	return WERR_OK;
 }
 
 /********************************************************************
@@ -521,71 +526,6 @@
 		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
 }
 
 /********************************************************************

Modified: branches/SAMBA_3_0/source/services/svc_spoolss.c
===================================================================
--- branches/SAMBA_3_0/source/services/svc_spoolss.c	2005-06-15 14:24:11 UTC (rev 7609)
+++ branches/SAMBA_3_0/source/services/svc_spoolss.c	2005-06-15 15:18:18 UTC (rev 7610)
@@ -27,6 +27,16 @@
 
 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_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_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;
 }
 



More information about the samba-cvs mailing list