Author: jerry Date: 2005-10-05 19:28:00 +0000 (Wed, 05 Oct 2005) New Revision: 10736
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10736 Log: adding WINS to supported internal services list Added: trunk/source/services/svc_wins.c Modified: trunk/source/Makefile.in trunk/source/rpc_server/srv_svcctl_nt.c trunk/source/services/services_db.c Changeset: Modified: trunk/source/Makefile.in =================================================================== --- trunk/source/Makefile.in 2005-10-05 18:37:34 UTC (rev 10735) +++ trunk/source/Makefile.in 2005-10-05 19:28:00 UTC (rev 10736) @@ -285,7 +285,8 @@ RPC_SVCCTL_OBJ = rpc_server/srv_svcctl.o rpc_server/srv_svcctl_nt.o \ services/svc_spoolss.o services/svc_rcinit.o services/services_db.o \ - services/svc_netlogon.o services/svc_winreg.o + services/svc_netlogon.o services/svc_winreg.o \ + services/svc_wins.o RPC_NTSVCS_OBJ = rpc_server/srv_ntsvcs.o rpc_server/srv_ntsvcs_nt.o Modified: trunk/source/rpc_server/srv_svcctl_nt.c =================================================================== --- trunk/source/rpc_server/srv_svcctl_nt.c 2005-10-05 18:37:34 UTC (rev 10735) +++ trunk/source/rpc_server/srv_svcctl_nt.c 2005-10-05 19:28:00 UTC (rev 10736) @@ -32,10 +32,13 @@ SERVICE_CONTROL_OPS *ops; }; +#define SVCCTL_NUM_INTERNAL_SERVICES 4 + extern SERVICE_CONTROL_OPS spoolss_svc_ops; extern SERVICE_CONTROL_OPS rcinit_svc_ops; extern SERVICE_CONTROL_OPS netlogon_svc_ops; extern SERVICE_CONTROL_OPS winreg_svc_ops; +extern SERVICE_CONTROL_OPS wins_svc_ops; struct service_control_op *svcctl_ops; @@ -51,7 +54,7 @@ BOOL init_service_op_table( void ) { const char **service_list = lp_svcctl_list(); - int num_services = 3 + str_list_count( service_list ); + int num_services = SVCCTL_NUM_INTERNAL_SERVICES + str_list_count( service_list ); int i; if ( !(svcctl_ops = TALLOC_ARRAY( NULL, struct service_control_op, num_services+1)) ) { @@ -80,6 +83,10 @@ svcctl_ops[i].ops = &winreg_svc_ops; i++; + svcctl_ops[i].name = talloc_strdup( svcctl_ops, "WINS" ); + svcctl_ops[i].ops = &wins_svc_ops; + i++; + /* NULL terminate the array */ svcctl_ops[i].name = NULL; Modified: trunk/source/services/services_db.c =================================================================== --- trunk/source/services/services_db.c 2005-10-05 18:37:34 UTC (rev 10735) +++ trunk/source/services/services_db.c 2005-10-05 19:28:00 UTC (rev 10736) @@ -106,6 +106,12 @@ init_unistr2( &description, "Internal service providing remote access to the Samba registry", UNI_STR_TERMINATE ); init_unistr2( &dname, "Remote Registry Service", UNI_STR_TERMINATE ); } + else if ( strequal(name, "WINS") ) { + pstr_sprintf( pstr, "%s/%s/nmbd",dyn_LIBDIR, SVCCTL_SCRIPT_DIR ); + init_unistr2( &ipath, pstr, UNI_STR_TERMINATE ); + init_unistr2( &description, "Internal service providing a NetBIOS point-to-point name server", UNI_STR_TERMINATE ); + init_unistr2( &dname, "Windows Internet Name Service (WINS)", UNI_STR_TERMINATE ); + } else { pstr_sprintf( pstr, "%s/%s/%s",dyn_LIBDIR, SVCCTL_SCRIPT_DIR, name ); init_unistr2( &ipath, pstr, UNI_STR_TERMINATE ); @@ -251,6 +257,7 @@ add_new_svc_name( key, subkeys, "Spooler" ); add_new_svc_name( key, subkeys, "NETLOGON" ); add_new_svc_name( key, subkeys, "RemoteRegistry" ); + add_new_svc_name( key, subkeys, "WINS" ); for ( i=0; service_list[i]; i++ ) { @@ -352,29 +359,34 @@ /* now add the security descriptor */ pstr_sprintf( path, "%s\\%s", KEY_SERVICES, name ); - wresult = regkey_open_internal( &key, path, token, REG_KEY_ALL ); + wresult = regkey_open_internal( &key, path, token, REG_KEY_READ ); if ( !W_ERROR_IS_OK(wresult) ) { DEBUG(0,("svcctl_lookup_dispname: key lookup failed! [%s] (%s)\n", path, dos_errstr(wresult))); - return NULL; + goto fail; } if ( !(values = TALLOC_ZERO_P( key, REGVAL_CTR )) ) { DEBUG(0,("svcctl_lookup_dispname: talloc() failed!\n")); TALLOC_FREE( key ); - return NULL; + goto fail; } fetch_reg_values( key, values ); if ( !(val = regval_ctr_getvalue( values, "DisplayName" )) ) - fstrcpy( display_name, name ); - else - rpcstr_pull( display_name, regval_data_p(val), sizeof(display_name), regval_size(val), 0 ); + goto fail; + rpcstr_pull( display_name, regval_data_p(val), sizeof(display_name), regval_size(val), 0 ); + TALLOC_FREE( key ); return display_name; + +fail: + /* default to returning the service name */ + fstrcpy( display_name, name ); + return display_name; } /******************************************************************** @@ -392,7 +404,7 @@ /* now add the security descriptor */ pstr_sprintf( path, "%s\\%s", KEY_SERVICES, name ); - wresult = regkey_open_internal( &key, path, token, REG_KEY_ALL ); + wresult = regkey_open_internal( &key, path, token, REG_KEY_READ ); if ( !W_ERROR_IS_OK(wresult) ) { DEBUG(0,("svcctl_lookup_dispname: key lookup failed! [%s] (%s)\n", path, dos_errstr(wresult))); @@ -431,7 +443,7 @@ /* now add the security descriptor */ pstr_sprintf( path, "%s\\%s", KEY_SERVICES, name ); - wresult = regkey_open_internal( &key, path, token, REG_KEY_ALL ); + wresult = regkey_open_internal( &key, path, token, REG_KEY_READ ); if ( !W_ERROR_IS_OK(wresult) ) { DEBUG(0,("svcctl_fetch_regvalues: key lookup failed! [%s] (%s)\n", path, dos_errstr(wresult))); Added: trunk/source/services/svc_wins.c =================================================================== --- trunk/source/services/svc_wins.c 2005-10-05 18:37:34 UTC (rev 10735) +++ trunk/source/services/svc_wins.c 2005-10-05 19:28:00 UTC (rev 10736) @@ -0,0 +1,66 @@ +/* + * Unix SMB/CIFS implementation. + * Service Control API Implementation + * Copyright (C) Gerald Carter 2005. + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "includes.h" + +/* Implementation for internal wins service */ + +/********************************************************************* +*********************************************************************/ + +static WERROR wins_stop( const char *service, SERVICE_STATUS *service_status ) +{ + return WERR_ACCESS_DENIED; +} + +/********************************************************************* +*********************************************************************/ + +static WERROR wins_start( const char *service ) +{ + return WERR_ACCESS_DENIED; +} + +/********************************************************************* +*********************************************************************/ + +static WERROR wins_status( const char *service, SERVICE_STATUS *service_status ) +{ + 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; +} + +/********************************************************************* +*********************************************************************/ + +/* struct for svcctl control to manipulate wins service */ + +SERVICE_CONTROL_OPS wins_svc_ops = { + wins_stop, + wins_start, + wins_status +};