summaryrefslogtreecommitdiffstats
path: root/ldap/libraries/libutil/ntevent.c
diff options
context:
space:
mode:
authorcvsadm <cvsadm>2005-01-21 00:44:34 +0000
committercvsadm <cvsadm>2005-01-21 00:44:34 +0000
commitb2093e3016027d6b5cf06b3f91f30769bfc099e2 (patch)
treecf58939393a9032182c4fbc4441164a9456e82f8 /ldap/libraries/libutil/ntevent.c
downloadds-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.c183
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