Change History (most recent first):
$Log: Service.c,v $
+Revision 1.29 2005/03/06 05:21:56 shersche
+<rdar://problem/4037635> Fix corrupt UTF-8 name when non-ASCII system name used, enabled unicode support
+
+Revision 1.28 2005/03/03 02:27:24 shersche
+Include the RegNames.h header file for names of registry keys
+
+Revision 1.27 2005/03/02 20:12:59 shersche
+Update name
+
+Revision 1.26 2005/02/15 08:00:27 shersche
+<rdar://problem/4007151> Update name
+
+Revision 1.25 2005/02/10 22:35:36 cheshire
+<rdar://problem/3727944> Update name
+
Revision 1.24 2005/01/27 20:02:43 cheshire
udsSupportRemoveFDFromEventLoop() needs to close the SocketRef as well
Remove the XP SP2 check before attempting to manage the firewall. There is a race condition in the SP2 updater such that upon first reboot after the upgrade, mDNSResponder might not know that it is running under SP2 yet. This necessitates a second reboot before the firewall is managed. Removing the check will cause mDNSResponder to try and manage the firewall everytime it boots up, if and only if it hasn't managed the firewall a previous time.
Revision 1.15 2004/09/15 17:13:33 shersche
-Change Firewall name from "Apple mDNSResponder" to "Rendezvous"
+Change Firewall name
Revision 1.14 2004/09/15 09:37:25 shersche
Add SharedAccess to dependency list, call CheckFirewall after sending status back to SCM
Move up one level.
Revision 1.1 2004/01/30 02:58:39 bradley
-mDNSResponder Windows Service. Provides global Rendezvous support with an IPC interface.
+mDNSResponder Windows Service. Provides global Bonjour support with an IPC interface.
*/
#include "CommonServices.h"
#include "DebugServices.h"
+#include "RegNames.h"
#include "uds_daemon.h"
#include "GenLinkedList.h"
// Constants
//===========================================================================================================================
-#define DEBUG_NAME "[Server] "
-#define kServiceName "Apple mDNSResponder"
-#define kServiceFirewallName L"Rendezvous"
-#define kServiceDependencies "Tcpip\0winmgmt\0\0"
-#define kServiceManageLLRouting "ManageLLRouting"
-#define kServiceCacheEntryCount "CacheEntryCount"
-#define kServiceManageFirewall "ManageFirewall"
+#define DEBUG_NAME "[Server] "
+#define kServiceFirewallName L"Bonjour"
+#define kServiceDependencies TEXT("Tcpip\0winmgmt\0\0")
#define kDNSServiceCacheEntryCountDefault 512
#define RR_CACHE_SIZE 500
//===========================================================================================================================
// Prototypes
//===========================================================================================================================
-
+#if defined(UNICODE)
+int __cdecl wmain( int argc, LPTSTR argv[] );
+#else
int __cdecl main( int argc, char *argv[] );
+#endif
static void Usage( void );
static BOOL WINAPI ConsoleControlHandler( DWORD inControlEvent );
-static OSStatus InstallService( const char *inName, const char *inDisplayName, const char *inDescription, const char *inPath );
-static OSStatus RemoveService( const char *inName );
+static OSStatus InstallService( LPCTSTR inName, LPCTSTR inDisplayName, LPCTSTR inDescription, LPCTSTR inPath );
+static OSStatus RemoveService( LPCTSTR inName );
static OSStatus SetServiceParameters();
static OSStatus GetServiceParameters();
static OSStatus CheckFirewall();
-static OSStatus SetServiceInfo( SC_HANDLE inSCM, const char *inServiceName, const char *inDescription );
+static OSStatus SetServiceInfo( SC_HANDLE inSCM, LPCTSTR inServiceName, LPCTSTR inDescription );
static void ReportStatus( int inType, const char *inFormat, ... );
-static OSStatus RunDirect( int argc, char *argv[] );
+static OSStatus RunDirect( int argc, LPTSTR argv[] );
-static void WINAPI ServiceMain( DWORD argc, LPSTR argv[] );
+static void WINAPI ServiceMain( DWORD argc, LPTSTR argv[] );
static OSStatus ServiceSetupEventLogging( void );
static DWORD WINAPI ServiceControlHandler( DWORD inControl, DWORD inEventType, LPVOID inEventData, LPVOID inContext );
-static OSStatus ServiceRun( int argc, char *argv[] );
+static OSStatus ServiceRun( int argc, LPTSTR argv[] );
static void ServiceStop( void );
-static OSStatus ServiceSpecificInitialize( int argc, char *argv[] );
-static OSStatus ServiceSpecificRun( int argc, char *argv[] );
+static OSStatus ServiceSpecificInitialize( int argc, LPTSTR argv[] );
+static OSStatus ServiceSpecificRun( int argc, LPTSTR argv[] );
static OSStatus ServiceSpecificStop( void );
-static void ServiceSpecificFinalize( int argc, char *argv[] );
+static void ServiceSpecificFinalize( int argc, LPTSTR argv[] );
static mStatus EventSourceFinalize(Win32EventSource * source);
static void EventSourceLock();
static void EventSourceUnlock();
static bool HaveLLRoute(PMIB_IPFORWARDROW rowExtant);
static OSStatus SetLLRoute();
+#if defined(UNICODE)
+# define StrLen(X) wcslen(X)
+# define StrCmp(X,Y) wcscmp(X,Y)
+#else
+# define StrLen(X) strlen(X)
+# define StrCmp(X,Y) strcmp(X,Y)
+#endif
+
+
#define kLLNetworkAddr "169.254.0.0"
#define kLLNetworkAddrMask "255.255.0.0"
//===========================================================================================================================
// main
//===========================================================================================================================
-
+#if defined(UNICODE)
+int __cdecl wmain( int argc, wchar_t * argv[] )
+#else
int __cdecl main( int argc, char *argv[] )
+#endif
{
OSStatus err;
BOOL ok;
debug_initialize( kDebugOutputTypeMetaConsole );
debug_set_property( kDebugPropertyTagPrintLevel, kDebugLevelVerbose );
-
+
// Default to automatically starting the service dispatcher if no extra arguments are specified.
start = ( argc <= 1 );
for( i = 1; i < argc; ++i )
{
- if( strcmp( argv[ i ], "-install" ) == 0 ) // Install
+ if( StrCmp( argv[ i ], TEXT("-install") ) == 0 ) // Install
{
- char desc[ 256 ];
+ TCHAR desc[ 256 ];
desc[ 0 ] = 0;
- LoadStringA( GetModuleHandle( NULL ), IDS_SERVICE_DESCRIPTION, desc, sizeof( desc ) );
- err = InstallService( kServiceName, kServiceName, desc, argv[ 0 ] );
+ LoadString( GetModuleHandle( NULL ), IDS_SERVICE_DESCRIPTION, desc, sizeof( desc ) );
+ err = InstallService( kServiceName, kServiceName, desc, argv[0] );
if( err )
{
ReportStatus( EVENTLOG_ERROR_TYPE, "install service failed (%d)\n", err );
goto exit;
}
}
- else if( strcmp( argv[ i ], "-remove" ) == 0 ) // Remove
+ else if( StrCmp( argv[ i ], TEXT("-remove") ) == 0 ) // Remove
{
err = RemoveService( kServiceName );
if( err )
goto exit;
}
}
- else if( strcmp( argv[ i ], "-start" ) == 0 ) // Start
+ else if( StrCmp( argv[ i ], TEXT("-start") ) == 0 ) // Start
{
start = TRUE;
}
- else if( strcmp( argv[ i ], "-server" ) == 0 ) // Server
+ else if( StrCmp( argv[ i ], TEXT("-server") ) == 0 ) // Server
{
err = RunDirect( argc, argv );
if( err )
}
goto exit;
}
- else if( strcmp( argv[ i ], "-q" ) == 0 ) // Quiet Mode (toggle)
+ else if( StrCmp( argv[ i ], TEXT("-q") ) == 0 ) // Quiet Mode (toggle)
{
gServiceQuietMode = !gServiceQuietMode;
}
- else if( strcmp( argv[ i ], "-remote" ) == 0 ) // Allow Remote Connections
- {
- gServiceAllowRemote = true;
- }
- else if( strcmp( argv[ i ], "-cache" ) == 0 ) // Number of mDNS cache entries
- {
- if( i <= argc )
- {
- ReportStatus( EVENTLOG_ERROR_TYPE, "-cache used, but number of cache entries not specified\n" );
- err = kParamErr;
- goto exit;
- }
- gServiceCacheEntryCount = atoi( argv[ ++i ] );
- }
- else if( ( strcmp( argv[ i ], "-help" ) == 0 ) || // Help
- ( strcmp( argv[ i ], "-h" ) == 0 ) )
+ else if( ( StrCmp( argv[ i ], TEXT("-help") ) == 0 ) || // Help
+ ( StrCmp( argv[ i ], TEXT("-h") ) == 0 ) )
{
Usage();
err = 0;
// InstallService
//===========================================================================================================================
-static OSStatus InstallService( const char *inName, const char *inDisplayName, const char *inDescription, const char *inPath )
+static OSStatus InstallService( LPCTSTR inName, LPCTSTR inDisplayName, LPCTSTR inDescription, LPCTSTR inPath )
{
OSStatus err;
SC_HANDLE scm;
// RemoveService
//===========================================================================================================================
-static OSStatus RemoveService( const char *inName )
+static OSStatus RemoveService( LPCTSTR inName )
{
OSStatus err;
SC_HANDLE scm;
DWORD value;
DWORD valueLen = sizeof(DWORD);
DWORD type;
- const char * s;
+ LPCTSTR s;
OSStatus err;
HKEY key;
//
// Add/Open Parameters section under service entry in registry
//
- s = "SYSTEM\\CurrentControlSet\\Services\\" kServiceName "\\Parameters";
+ s = TEXT("SYSTEM\\CurrentControlSet\\Services\\") kServiceName TEXT("\\Parameters");
err = RegCreateKey( HKEY_LOCAL_MACHINE, s, &key );
require_noerr( err, exit );
DWORD value;
DWORD valueLen;
DWORD type;
- const char * s;
+ LPCTSTR s;
OSStatus err;
HKEY key;
//
// Add/Open Parameters section under service entry in registry
//
- s = "SYSTEM\\CurrentControlSet\\Services\\" kServiceName "\\Parameters";
+ s = TEXT("SYSTEM\\CurrentControlSet\\Services\\") kServiceName TEXT("\\Parameters");
err = RegCreateKey( HKEY_LOCAL_MACHINE, s, &key );
require_noerr( err, exit );
DWORD value;
DWORD valueLen;
DWORD type;
- const char * s;
+ LPCTSTR s;
HKEY key = NULL;
OSStatus err = kUnknownErr;
// the case, then we need to manipulate the firewall
// so networking works correctly.
- s = "SYSTEM\\CurrentControlSet\\Services\\" kServiceName "\\Parameters";
+ s = TEXT("SYSTEM\\CurrentControlSet\\Services\\") kServiceName TEXT("\\Parameters");
err = RegCreateKey( HKEY_LOCAL_MACHINE, s, &key );
require_noerr( err, exit );
// SetServiceInfo
//===========================================================================================================================
-static OSStatus SetServiceInfo( SC_HANDLE inSCM, const char *inServiceName, const char *inDescription )
+static OSStatus SetServiceInfo( SC_HANDLE inSCM, LPCTSTR inServiceName, LPCTSTR inDescription )
{
OSStatus err;
SC_LOCK lock;
// Change the description.
- description.lpDescription = (char *) inDescription;
+ description.lpDescription = (LPTSTR) inDescription;
ok = ChangeServiceConfig2( service, SERVICE_CONFIG_DESCRIPTION, &description );
err = translate_errno( ok, (OSStatus) GetLastError(), kParamErr );
require_noerr( err, exit );
vsprintf( s, inFormat, args );
array[ 0 ] = s;
- ok = ReportEvent( gServiceEventSource, (WORD) inType, 0, 0x20000001L, NULL, 1, 0, array, NULL );
+ ok = ReportEventA( gServiceEventSource, (WORD) inType, 0, 0x20000001L, NULL, 1, 0, array, NULL );
check_translated_errno( ok, GetLastError(), kUnknownErr );
}
else
// RunDirect
//===========================================================================================================================
-static OSStatus RunDirect( int argc, char *argv[] )
+static OSStatus RunDirect( int argc, LPTSTR argv[] )
{
OSStatus err;
BOOL initialized;
// ServiceMain
//===========================================================================================================================
-static void WINAPI ServiceMain( DWORD argc, LPSTR argv[] )
+static void WINAPI ServiceMain( DWORD argc, LPTSTR argv[] )
{
OSStatus err;
BOOL ok;
- char desc[ 256 ];
+ TCHAR desc[ 256 ];
err = ServiceSetupEventLogging();
check_noerr( err );
// Setup the description. This should be done by the installer, but it doesn't support that yet.
desc[ 0 ] = '\0';
- LoadStringA( GetModuleHandle( NULL ), IDS_SERVICE_DESCRIPTION, desc, sizeof( desc ) );
+ LoadString( GetModuleHandle( NULL ), IDS_SERVICE_DESCRIPTION, desc, sizeof( desc ) );
err = SetServiceInfo( NULL, kServiceName, desc );
check_noerr( err );
{
OSStatus err;
HKEY key;
- const char * s;
+ LPCTSTR s;
DWORD typesSupported;
- char path[ MAX_PATH ];
+ TCHAR path[ MAX_PATH ];
DWORD n;
key = NULL;
// Add/Open source name as a sub-key under the Application key in the EventLog registry key.
- s = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\" kServiceName;
+ s = TEXT("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\") kServiceName;
err = RegCreateKey( HKEY_LOCAL_MACHINE, s, &key );
require_noerr( err, exit );
// Add the name to the EventMessageFile subkey.
-
+
path[ 0 ] = '\0';
GetModuleFileName( NULL, path, MAX_PATH );
- n = (DWORD)( strlen( path ) + 1 );
- err = RegSetValueEx( key, "EventMessageFile", 0, REG_EXPAND_SZ, (const LPBYTE) path, n );
+ n = (DWORD) ( ( StrLen( path ) + 1 ) * sizeof( TCHAR ) );
+ err = RegSetValueEx( key, TEXT("EventMessageFile"), 0, REG_EXPAND_SZ, (const LPBYTE) path, n );
require_noerr( err, exit );
// Set the supported event types in the TypesSupported subkey.
| EVENTLOG_INFORMATION_TYPE
| EVENTLOG_AUDIT_SUCCESS
| EVENTLOG_AUDIT_FAILURE;
- err = RegSetValueEx( key, "TypesSupported", 0, REG_DWORD, (const LPBYTE) &typesSupported, sizeof( DWORD ) );
+ err = RegSetValueEx( key, TEXT("TypesSupported"), 0, REG_DWORD, (const LPBYTE) &typesSupported, sizeof( DWORD ) );
require_noerr( err, exit );
// Set up the event source.
// ServiceRun
//===========================================================================================================================
-static OSStatus ServiceRun( int argc, char *argv[] )
+static OSStatus ServiceRun( int argc, LPTSTR argv[] )
{
OSStatus err;
BOOL initialized;
// ServiceSpecificInitialize
//===========================================================================================================================
-static OSStatus ServiceSpecificInitialize( int argc, char *argv[] )
+static OSStatus ServiceSpecificInitialize( int argc, LPTSTR argv[] )
{
OSStatus err;
// ServiceSpecificRun
//===========================================================================================================================
-static OSStatus ServiceSpecificRun( int argc, char *argv[] )
+static OSStatus ServiceSpecificRun( int argc, LPTSTR argv[] )
{
DWORD result;
// ServiceSpecificFinalize
//===========================================================================================================================
-static void ServiceSpecificFinalize( int argc, char *argv[] )
+static void ServiceSpecificFinalize( int argc, LPTSTR argv[] )
{
DEBUG_UNUSED( argc );
DEBUG_UNUSED( argv );