summaryrefslogtreecommitdiffstats
path: root/private/net/svcdlls/alrsvc/alconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/net/svcdlls/alrsvc/alconfig.c')
-rw-r--r--private/net/svcdlls/alrsvc/alconfig.c295
1 files changed, 295 insertions, 0 deletions
diff --git a/private/net/svcdlls/alrsvc/alconfig.c b/private/net/svcdlls/alrsvc/alconfig.c
new file mode 100644
index 000000000..632574d3d
--- /dev/null
+++ b/private/net/svcdlls/alrsvc/alconfig.c
@@ -0,0 +1,295 @@
+/*++
+
+Copyright (c) 1991-92 Microsoft Corporation
+
+Module Name:
+
+ alconfig.c
+
+Abstract:
+
+ This module contains the Alerter service configuration routines.
+
+Author:
+
+ Rita Wong (ritaw) 16-July-1991
+
+Revision History:
+
+--*/
+
+#include "alconfig.h"
+#include <tstr.h> // STRCPY(), etc.
+
+STATIC
+NET_API_STATUS
+AlGetLocalComputerName(
+ VOID
+ );
+
+//-------------------------------------------------------------------//
+// //
+
+// Global variables //
+// //
+//-------------------------------------------------------------------//
+
+//
+// Alert names
+//
+LPSTR AlertNamesA; // For inclusion into message text (space-separated)
+LPTSTR AlertNamesW; // For sending message to (NULL-separated)
+
+//
+// Local computer name
+//
+LPSTR AlLocalComputerNameA;
+LPTSTR AlLocalComputerNameW;
+
+
+
+NET_API_STATUS
+AlGetAlerterConfiguration(
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ This routine reads in alerter configuration info which is the alert names.
+ If a failure occurs, or alert names could not be found, the error is
+ logged but it will not prevent the Alerter service from starting up.
+
+Arguments:
+
+ AlUicCode - Supplies the termination code to the Service Controller.
+
+Return Value:
+
+ NERR_Success or error getting the computer name.
+
+--*/
+{
+ NET_API_STATUS status;
+ LPNET_CONFIG_HANDLE AlerterSection;
+ LPTSTR UnicodeAlertNames;
+ LPSTR AnsiAlertNames;
+#ifdef UNICODE
+ LPSTR Name; // for conversion from Unicode to ANSI
+#endif
+ DWORD AlertNamesSize;
+ LPWSTR SubString[1];
+ TCHAR StatusString[25];
+
+
+ AlertNamesA = NULL;
+ AlertNamesW = NULL;
+
+ //
+ // Get the computer name.
+ //
+ if ((status = AlGetLocalComputerName()) != NERR_Success) {
+ return status;
+ }
+
+ //
+ // Open config file and get handle to the Alerter section
+ //
+ if ((status = NetpOpenConfigData(
+ &AlerterSection,
+ NULL, // local server
+ SECT_NT_ALERTER,
+ TRUE // read-only
+ )) != NERR_Success) {
+ NetpKdPrint(("[Alerter] Could not open config section %lu\n", status));
+
+ SubString[0] = ultow(status, StatusString, 10);
+ AlLogEvent(
+ NELOG_Build_Name,
+ 1,
+ SubString
+ );
+ return NO_ERROR;
+ }
+
+ //
+ // Get the alert names from the configuration file
+ //
+ if ((status = NetpGetConfigTStrArray(
+ AlerterSection,
+
+ ALERTER_KEYWORD_ALERTNAMES,
+ &AlertNamesW // alloc and set ptr
+ )) != NERR_Success) {
+ NetpKdPrint(("[Alerter] Could not get alert names %lu\n", status));
+
+ SubString[0] = ultow(status, StatusString, 10);
+ AlLogEvent(
+ NELOG_Build_Name,
+ 1,
+ SubString
+ );
+
+ AlertNamesW = NULL;
+ goto CloseConfigFile;
+ }
+
+ AlertNamesSize = NetpTStrArraySize(AlertNamesW) / sizeof(TCHAR) * sizeof(CHAR);
+
+ if ((AlertNamesA = (LPSTR) LocalAlloc(
+ LMEM_ZEROINIT,
+ AlertNamesSize
+ )) == NULL) {
+ NetpKdPrint(("[Alerter] Error allocating AlertNamesA %lu\n", GetLastError()));
+ NetApiBufferFree(AlertNamesW);
+ AlertNamesW = NULL;
+ goto CloseConfigFile;
+ }
+
+ AnsiAlertNames = AlertNamesA;
+ UnicodeAlertNames = AlertNamesW;
+
+ //
+ // Canonicalize alert names, and convert the unicode names to ANSI
+ //
+ while (*UnicodeAlertNames != TCHAR_EOS) {
+
+ AlCanonicalizeMessageAlias(UnicodeAlertNames);
+
+#ifdef UNICODE
+ Name = NetpAllocStrFromWStr(UnicodeAlertNames);
+ if (Name != NULL) {
+ (void) strcpy(AnsiAlertNames, Name);
+ AnsiAlertNames += (strlen(AnsiAlertNames) + 1);
+ }
+ (void) NetApiBufferFree(Name);
+#else
+ (void) strcpy(AnsiAlertNames, UnicodeAlertNames);
+ AnsiAlertNames += (strlen(AnsiAlertNames) + 1);
+#endif
+
+ UnicodeAlertNames += (STRLEN(UnicodeAlertNames) + 1);
+ }
+
+
+ //
+ // Substitute the NULL terminators, which separate the alert names,
+ // in AlertNamesA with spaces. There's a space after the last alert
+ // name.
+ //
+ AnsiAlertNames = AlertNamesA;
+ while (*AnsiAlertNames != AL_NULL_CHAR) {
+ AnsiAlertNames = strchr(AnsiAlertNames, AL_NULL_CHAR);
+ *AnsiAlertNames++ = AL_SPACE_CHAR;
+ }
+
+CloseConfigFile:
+ (void) NetpCloseConfigData( AlerterSection );
+
+ //
+ // Errors from reading AlertNames should be ignored so we always
+ // return success here.
+ //
+ return NERR_Success;
+}
+
+
+STATIC
+NET_API_STATUS
+AlGetLocalComputerName(
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ This function gets the local computer name and stores both the ANSI
+ and Unicode versions of it.
+
+Arguments:
+
+ None. Sets the global pointers AlLocalComputerNameA and
+ AlLocalComputerNameW.
+
+Return Value:
+
+ NERR_Success or error getting the local computer name.
+
+--*/
+{
+ NET_API_STATUS status;
+
+
+ AlLocalComputerNameA = NULL;
+ AlLocalComputerNameW = NULL;
+
+ if ((status = NetpGetComputerName(
+ &AlLocalComputerNameW
+ )) != NERR_Success) {
+ AlLocalComputerNameW = NULL;
+ return status;
+ }
+
+ AlCanonicalizeMessageAlias(AlLocalComputerNameW);
+
+ //
+ // Convert the computer name into ANSI
+ //
+#ifdef UNICODE
+ AlLocalComputerNameA = NetpAllocStrFromWStr(AlLocalComputerNameW);
+
+ if (AlLocalComputerNameA == NULL) {
+ status = ERROR_NOT_ENOUGH_MEMORY;
+ }
+#else
+ status = NetApiBufferAllocate(
+ STRSIZE(AlLocalComputerNameW),
+ &AlLocalComputerNameA
+ );
+ if (status == NERR_Success) {
+ (void) strcpy(AlLocalComputerNameA, AlLocalComputerNameW);
+ }
+ else {
+ AlLocalComputerNameA = NULL;
+ }
+#endif
+
+ return status;
+}
+
+
+VOID
+AlLogEvent(
+ DWORD MessageId,
+ DWORD NumberOfSubStrings,
+ LPWSTR *SubStrings
+ )
+{
+ HANDLE LogHandle;
+
+
+ LogHandle = RegisterEventSourceW (
+ NULL,
+ SERVICE_ALERTER
+ );
+
+ if (LogHandle == NULL) {
+ NetpKdPrint(("[Alerter] RegisterEventSourceW failed %lu\n",
+ GetLastError()));
+ return;
+ }
+
+ (void) ReportEventW(
+ LogHandle,
+ EVENTLOG_ERROR_TYPE,
+ 0, // event category
+ MessageId,
+ (PSID) NULL, // no SID
+ (WORD)NumberOfSubStrings,
+ 0,
+ SubStrings,
+ (PVOID) NULL
+ );
+
+ DeregisterEventSource(LogHandle);
+}