diff options
Diffstat (limited to 'private/net/svcdlls/alrsvc/alconfig.c')
-rw-r--r-- | private/net/svcdlls/alrsvc/alconfig.c | 295 |
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); +} |