diff options
author | cvsadm <cvsadm> | 2005-01-21 00:44:34 +0000 |
---|---|---|
committer | cvsadm <cvsadm> | 2005-01-21 00:44:34 +0000 |
commit | b2093e3016027d6b5cf06b3f91f30769bfc099e2 (patch) | |
tree | cf58939393a9032182c4fbc4441164a9456e82f8 /ldap/libraries/libutil/ntevent.c | |
download | ds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.tar.gz ds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.tar.xz ds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.zip |
Moving NSCP Directory Server from DirectoryBranch to TRUNK, initial drop. (foxworth)ldapserver7x
Diffstat (limited to 'ldap/libraries/libutil/ntevent.c')
-rw-r--r-- | ldap/libraries/libutil/ntevent.c | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/ldap/libraries/libutil/ntevent.c b/ldap/libraries/libutil/ntevent.c new file mode 100644 index 00000000..2b05dd9d --- /dev/null +++ b/ldap/libraries/libutil/ntevent.c @@ -0,0 +1,183 @@ +/** BEGIN COPYRIGHT BLOCK + * Copyright 2001 Sun Microsystems, Inc. + * Portions copyright 1999, 2001-2003 Netscape Communications Corporation. + * All rights reserved. + * END COPYRIGHT BLOCK **/ + +#ifdef _WIN32 + +#include <windows.h> +#include <stdio.h> +#include "ldap.h" +#include "regparms.h" + +HANDLE hSlapdEventSource; +LPTSTR pszServerName; + +void ReportSlapdEvent(WORD wEventType, DWORD dwIdEvent, WORD wNumInsertStrings, + char *pszStrings) +{ + LPCTSTR lpszStrings[64]; + BOOL bSuccess; + + if( hSlapdEventSource ) + { + if( pszServerName ) + lpszStrings[0] = (LPCTSTR)pszServerName; + + if( pszStrings != NULL) + lpszStrings[1] = (LPCTSTR)pszStrings; + + wNumInsertStrings++; + + /* Now report the event, which will add this event to the event log */ + bSuccess = ReportEvent(hSlapdEventSource, /* event-log handle */ + wEventType, /* event type */ + 0, /* category zero */ + dwIdEvent, /* event ID */ + NULL, /* no user SID */ + wNumInsertStrings, /* number of substr */ + 0, /* no binary data */ + lpszStrings, /* string array */ + NULL); /* address of data */ + } + +} /* ReportSlapdEvent */ + +BOOL ReportSlapdStatusToSCMgr( + SERVICE_STATUS *serviceStatus, + SERVICE_STATUS_HANDLE serviceStatusHandle, + HANDLE Event, + DWORD dwCurrentState, + DWORD dwWin32ExitCode, + DWORD dwCheckPoint, + DWORD dwWaitHint) +{ + /* Disable control requests until the service is started. */ + if (dwCurrentState == SERVICE_START_PENDING) + serviceStatus->dwControlsAccepted = 0; + else + serviceStatus->dwControlsAccepted = SERVICE_ACCEPT_STOP | + SERVICE_ACCEPT_PAUSE_CONTINUE; + + serviceStatus->dwCurrentState = dwCurrentState; + serviceStatus->dwWin32ExitCode = dwWin32ExitCode; + serviceStatus->dwCheckPoint = dwCheckPoint; + + serviceStatus->dwWaitHint = dwWaitHint; + + /* Report the status of the service to the service control manager. */ + return SetServiceStatus( serviceStatusHandle, serviceStatus); + +} /* ReportSlapdStatusToSCMgr */ + +// This is a routine that we use to check for multiple instances of a server with +// the same id. We cannot use a shared data section to keep count of instances since +// there will be multiple instances of the server running. MS recommends using a +// sync object to do this. Thus we attempt to create an object with same NAME +// but different TYPE as the server "Done" event.We have a small race condition +// between the check and the creation of the "Done" event. + +BOOL +MultipleInstances() +{ + HANDLE hServDoneSemaphore; + DWORD result; + CHAR ErrMsg[1024]; + char szDoneEvent[256]; + + if( !pszServerName ) + return FALSE; + + sprintf(szDoneEvent, "NS_%s", pszServerName); + + hServDoneSemaphore = CreateSemaphore( + NULL, // security attributes + 0, // initial count for semaphore + 1, // maximum count for semaphore + szDoneEvent); + + if ( hServDoneSemaphore == NULL) { + + result = GetLastError(); + if (result == ERROR_INVALID_HANDLE) { + + sprintf(ErrMsg, "Netscape Server %s is already" + " running. Terminating this instance.", pszServerName); + + MessageBox(GetDesktopWindow(), ErrMsg, + "SERVER ALREADY RUNNING", MB_ICONEXCLAMATION | MB_OK); + return TRUE; + + } else { + /* We aren't too interested in why the creation failed + * if it is not because of another instance */ + + return FALSE; + } + } // hServDoneSemaphore == NULL + + CloseHandle(hServDoneSemaphore); + return FALSE; +} + +BOOL SlapdIsAService() +{ + // May change in V2.0 + return FALSE; +} + +BOOL SlapdGetServerNameFromCmdline(char *szServerName, char *szCmdLine, int dirname) +{ + BOOL bReturn = FALSE; + char *szChar = NULL; + char szCmdCopy[_MAX_PATH]; + + if( szCmdLine ) + { + memset(szCmdCopy, 0, _MAX_PATH ); + strcpy( szCmdCopy, szCmdLine ); + } + else + return(bReturn); + + // szCmdCopy should be something like + // c:\navgold\server\slapd-kennedy\config\slapd.conf + // unless dirname is TRUE in which case it should be + // c:\navgold\server\slapd-kennedy + if(szChar = strrchr(szCmdCopy, '\\')) + { + *szChar = 0; + if(dirname) + { + strcpy(szServerName, szChar+1); + bReturn = TRUE; + } + else if(szChar = strrchr(szCmdCopy, '\\')) + { + // szCmdCopy should be c:\navgold\server\slapd-kennedy\config + *szChar = 0; + // szCmdCopy should be c:\navgold\server\slapd-kennedy + if(szChar = strrchr(szCmdCopy, '\\')) + { + szChar++; + // szChar should point to slapd-kennedy + strcpy(szServerName, szChar); + bReturn = TRUE; + } + } + } + else + { + // szCmdCopy should be something like slapd-kennedy + strcpy(szServerName, szCmdCopy); + bReturn = TRUE; + } + + if(strlen(szServerName) == 0) + bReturn = FALSE; + + return(bReturn); +} + +#endif _WIN32 |