471 lines
11 KiB
C
471 lines
11 KiB
C
/*++
|
||
|
||
Copyright (c) 1991-1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
LUI.C
|
||
|
||
Abstract:
|
||
|
||
Contains support functions
|
||
|
||
Author:
|
||
|
||
Dan Hinsley (danhi) 06-Jun-1991
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
18-Apr-1991 danhi
|
||
32 bit NT version
|
||
|
||
06-Jun-1991 Danhi
|
||
Sweep to conform to NT coding style
|
||
|
||
23-Oct-1991 W-ShankN
|
||
Added Unicode mapping
|
||
|
||
01-Oct-1992 JohnRo
|
||
RAID 3556: Added NetpSystemTimeToGmtTime() for DosPrint APIs.
|
||
|
||
10-Feb-1993 YiHsinS
|
||
Moved LUI_GetMsgIns to netlib\luiint.c
|
||
|
||
--*/
|
||
|
||
//
|
||
// INCLUDES
|
||
//
|
||
|
||
#include <nt.h> // these 3 includes are for RTL
|
||
#include <ntrtl.h> // these files are picked up to
|
||
#include <nturtl.h> // allow <windows.h> to compile. since we've
|
||
// already included NT, and <winnt.h> will not
|
||
// be picked up, and <winbase.h> needs these defs.
|
||
#include <windows.h> // IN, LPTSTR, etc.
|
||
|
||
#include <string.h>
|
||
#include <lmcons.h>
|
||
#include <stdio.h>
|
||
#include <process.h>
|
||
#include "netlibnt.h"
|
||
#include <lui.h>
|
||
#include "icanon.h"
|
||
#include <lmerr.h>
|
||
#include <conio.h>
|
||
#include <io.h>
|
||
#include <tchar.h>
|
||
#include <msystem.h>
|
||
#include "apperr.h"
|
||
#include "apperr2.h"
|
||
#include "netascii.h"
|
||
#include "netcmds.h"
|
||
|
||
|
||
//
|
||
// Local definitions and macros/function declarations
|
||
//
|
||
|
||
#define LUI_PMODE_DEF 0x00000000
|
||
#define LUI_PMODE_EXIT 0x00000002
|
||
#define LUI_PMODE_NODEF 0x00000004
|
||
#define LUI_PMODE_ERREXT 0x00000008
|
||
|
||
|
||
/* fatal error, just exit */
|
||
#define LUIM_ErrMsgExit(E) LUI_PrintMsgIns(NULL, 0, E, NULL, \
|
||
LUI_PMODE_ERREXT | LUI_PMODE_DEF | \
|
||
LUI_PMODE_EXIT, g_hStdErr)
|
||
|
||
DWORD
|
||
LUI_PrintMsgIns(
|
||
LPTSTR *istrings,
|
||
DWORD nstrings,
|
||
DWORD msgno,
|
||
unsigned int *msglen,
|
||
DWORD mode,
|
||
HANDLE handle
|
||
);
|
||
|
||
|
||
/*
|
||
* LUI_CanonPassword
|
||
*
|
||
* This function ensures that the password in the passed buffer is a
|
||
* syntactically valid password.
|
||
*
|
||
* This USED to upper case passwords. No longer so in NT.
|
||
*
|
||
*
|
||
* ENTRY
|
||
* buf buffer containing password to be canonicalized
|
||
*
|
||
* EXIT
|
||
* buf canonicalized password, if valid
|
||
*
|
||
* RETURNS
|
||
* 0 password is valid
|
||
* otherwise password is invalid
|
||
*
|
||
*/
|
||
|
||
USHORT LUI_CanonPassword(TCHAR * szPassword)
|
||
{
|
||
|
||
/* check it for validity */
|
||
if (I_NetNameValidate(NULL, szPassword, NAMETYPE_PASSWORD, 0L ))
|
||
{
|
||
return APE_UtilInvalidPass;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
/*
|
||
* Name: LUI_GetMsg
|
||
* This routine is similar to LUI_GetMsgIns,
|
||
* except it takes does not accept insert strings &
|
||
* takes less arguments.
|
||
* Args: msgbuf : buffer to hold message retrieved
|
||
* bufsize : size of buffer
|
||
* msgno : message number
|
||
* Returns: zero if ok, the DOSGETMESSAGE error code otherwise
|
||
* Globals: (none)
|
||
* Statics: (none)
|
||
*/
|
||
DWORD
|
||
LUI_GetMsg(
|
||
PTCHAR msgbuf,
|
||
USHORT bufsize,
|
||
DWORD msgno
|
||
)
|
||
{
|
||
return LUI_GetMsgInsW(NULL, 0, msgbuf, bufsize, msgno, NULL);
|
||
}
|
||
|
||
|
||
#define SINGLE_HORIZONTAL '\x02d'
|
||
#define SCREEN_WIDTH 79
|
||
USHORT
|
||
LUI_PrintLine(
|
||
VOID
|
||
)
|
||
{
|
||
TCHAR string[SCREEN_WIDTH+1];
|
||
USHORT i;
|
||
|
||
|
||
for (i = 0; i < SCREEN_WIDTH; i++) {
|
||
string[i] = SINGLE_HORIZONTAL;
|
||
}
|
||
|
||
string[SCREEN_WIDTH] = NULLC;
|
||
WriteToCon(TEXT("%s\r\n"), &string);
|
||
|
||
return(0);
|
||
|
||
}
|
||
|
||
/***
|
||
* Y o r N
|
||
*
|
||
* Gets an answer to a Y/N question
|
||
*
|
||
* Entry: promptMsgNum -- The number of the message to prompt with
|
||
* def -- default (TRUE if set, FALSE otherwise)
|
||
*/
|
||
DWORD
|
||
LUI_YorN(
|
||
USHORT promptMsgNum,
|
||
USHORT def
|
||
)
|
||
{
|
||
return LUI_YorNIns(NULL, 0, promptMsgNum, def);
|
||
}
|
||
/***
|
||
* Y o r N Insert
|
||
*
|
||
* Gets an answer to a Y/N question containing insertions.
|
||
*
|
||
* !!!!!!!!
|
||
* NOTE: istrings[nstrings] will be used to store "Y" or "N",
|
||
* depending on default value supplied. Thus this function
|
||
* handles one fewer entry in istrings than other LUI Ins
|
||
* functions do. Beware!
|
||
* !!!!!!!!
|
||
*
|
||
* Entry: istrings -- Table of insertion strings
|
||
* nstrings -- Number of valid insertion strings
|
||
* promptMsgNum -- The number of the message to prompt with
|
||
* def -- default (TRUE if set, FALSE otherwise)
|
||
*
|
||
* Returns: TRUE, FALSE, or -1 in case of LUI_PrintMsgIns error.
|
||
*/
|
||
|
||
#define PRINT_MODE (LUI_PMODE_ERREXT)
|
||
#define STRING_LEN APE2_GEN_MAX_MSG_LEN
|
||
#define LUI_LOOP_LIMIT 5
|
||
|
||
DWORD
|
||
LUI_YorNIns(
|
||
PTCHAR * istrings,
|
||
USHORT nstrings,
|
||
USHORT promptMsgNum,
|
||
USHORT def
|
||
)
|
||
{
|
||
|
||
USHORT count; /* count of times we ask */
|
||
DWORD err; /* LUI API return values */
|
||
unsigned int dummy; /* length of msg */
|
||
|
||
/* 10 because max # of insert strings to DosGetMessage is 9, and
|
||
we'll leave caller room to mess up and get the error back
|
||
from LUI_PrintMsgIns() */
|
||
|
||
LPTSTR IStrings[10]; /* Insertion strings for LUI */
|
||
TCHAR defaultYes[STRING_LEN]; /* (Y/N) [Y] string */
|
||
TCHAR defaultNo[STRING_LEN]; /* (Y/N) [N] string */
|
||
TCHAR NLSYesChar[STRING_LEN];
|
||
TCHAR NLSNoChar[STRING_LEN];
|
||
TCHAR strBuf[STRING_LEN]; /* holds input string */
|
||
DWORD len; /* length of string input */
|
||
TCHAR termChar; /* terminating char */
|
||
|
||
/* copy istrings to IStrings so we'll have room for Y or N */
|
||
for (count=0; count < nstrings; count++)
|
||
IStrings[count] = istrings[count];
|
||
/* retrieve text we need from message file, bail out if probs */
|
||
if (err = LUI_GetMsg(defaultYes, DIMENSION(defaultYes),
|
||
APE2_GEN_DEFAULT_YES))
|
||
{
|
||
LUIM_ErrMsgExit(err);
|
||
}
|
||
|
||
if (err = LUI_GetMsg(defaultNo, DIMENSION(defaultNo),
|
||
APE2_GEN_DEFAULT_NO))
|
||
LUIM_ErrMsgExit(err);
|
||
|
||
if (err = LUI_GetMsg(NLSYesChar, DIMENSION(NLSYesChar),
|
||
APE2_GEN_NLS_YES_CHAR))
|
||
LUIM_ErrMsgExit(err);
|
||
|
||
if (err = LUI_GetMsg(NLSNoChar, DIMENSION(NLSNoChar),
|
||
APE2_GEN_NLS_NO_CHAR))
|
||
LUIM_ErrMsgExit(err);
|
||
|
||
if (def)
|
||
IStrings[nstrings] = defaultYes;
|
||
else
|
||
IStrings[nstrings] = defaultNo;
|
||
nstrings++;
|
||
|
||
for (count = 0; count < LUI_LOOP_LIMIT; count++)
|
||
{
|
||
if (count)
|
||
{
|
||
LUI_PrintMsgIns(NULL, 0, APE_UtilInvalidResponse, NULL, PRINT_MODE, g_hStdOut);
|
||
}
|
||
|
||
err = LUI_PrintMsgIns(IStrings, nstrings, promptMsgNum,
|
||
&dummy, PRINT_MODE, g_hStdOut);
|
||
|
||
if ((LONG) err < 0)
|
||
return(err);
|
||
|
||
if (GetString(strBuf, DIMENSION(strBuf), &len, &termChar))
|
||
/* overwrote buffer, start again */
|
||
continue;
|
||
|
||
if ((len == 0) && (termChar == (TCHAR)EOF))
|
||
{
|
||
/* end of file reached */
|
||
PrintNL();
|
||
LUIM_ErrMsgExit(APE_NoGoodResponse);
|
||
}
|
||
|
||
if (len == 0) /* user hit RETURN */
|
||
return def;
|
||
else if (!_tcsnicmp(NLSYesChar, strBuf, _tcslen(NLSYesChar)))
|
||
return TRUE;
|
||
else if (!_tcsnicmp(NLSNoChar, strBuf, _tcslen(NLSNoChar)))
|
||
return FALSE;
|
||
|
||
/* default is handled at top of loop. */
|
||
};
|
||
|
||
LUIM_ErrMsgExit(APE_NoGoodResponse);
|
||
|
||
return err; // Keep compiler happy.
|
||
}
|
||
|
||
|
||
/*
|
||
* LUI_CanonMessagename
|
||
*
|
||
* This function uppercases the contents of the buffer, then checks to
|
||
* make sure that it is a syntactically valid messenging name.
|
||
*
|
||
*
|
||
* ENTRY
|
||
* buf buffer containing name to be canonicalized
|
||
*
|
||
* EXIT
|
||
* buf canonicalized name, if valid
|
||
*
|
||
* RETURNS
|
||
* 0 name is valid
|
||
* otherwise name is invalid
|
||
*
|
||
*/
|
||
USHORT
|
||
LUI_CanonMessagename(
|
||
PTCHAR buf
|
||
)
|
||
{
|
||
/* check it for validity */
|
||
if (I_NetNameValidate(NULL, buf, NAMETYPE_MESSAGE, LM2X_COMPATIBLE))
|
||
{
|
||
return NERR_InvalidComputer;
|
||
}
|
||
|
||
_tcsupr(buf);
|
||
return 0;
|
||
}
|
||
|
||
/*
|
||
* LUI_CanonMessageDest
|
||
*
|
||
* This function uppercases the contents of the buffer, then checks to
|
||
* make sure that it is a syntactically valid messenging destination.
|
||
*
|
||
*
|
||
* ENTRY
|
||
* buf buffer containing name to be canonicalized
|
||
*
|
||
* EXIT
|
||
* buf canonicalized name, if valid
|
||
*
|
||
* RETURNS
|
||
* 0 name is valid
|
||
* otherwise name is invalid
|
||
*
|
||
*/
|
||
|
||
USHORT
|
||
LUI_CanonMessageDest(
|
||
PTCHAR buf
|
||
)
|
||
{
|
||
/* check it for validity */
|
||
if (I_NetNameValidate(NULL, buf, NAMETYPE_MESSAGEDEST, LM2X_COMPATIBLE))
|
||
{
|
||
return NERR_InvalidComputer;
|
||
}
|
||
|
||
_tcsupr(buf);
|
||
return(0);
|
||
|
||
}
|
||
|
||
|
||
/***
|
||
* LUI_CanonForNetBios
|
||
* Canonicalizes a name to a NETBIOS canonical form.
|
||
*
|
||
* Args:
|
||
* Destination - Will receive the canonicalized name (Unicode).
|
||
* cchDestination - the number of chars Destination can hold
|
||
* pszOem - Contains the original name in OEM. Will have
|
||
* the canonicalized form put back here.
|
||
* Returns:
|
||
* 0 if success
|
||
* error code otherwise
|
||
*/
|
||
USHORT LUI_CanonForNetBios( WCHAR * Destination, INT cchDestination,
|
||
TCHAR * pszOem )
|
||
{
|
||
|
||
_tcscpy(Destination, pszOem);
|
||
return NERR_Success;
|
||
}
|
||
|
||
|
||
/*
|
||
* Name: LUI_PrintMsgIns
|
||
* This routine is very similar to LUI_GetmsgIns,
|
||
* except it prints the message obtained instead of
|
||
* storing it in a buffer.
|
||
* Args: istrings : pointer to table of insert strings
|
||
* nstrings : number of insert strings
|
||
* msgno : message number
|
||
* msglen : pointer to variable that will receive message length
|
||
* mode : how the message is to be printed.
|
||
* handle : file handle to which output goes
|
||
* Returns: zero if ok, the DOSGETMESSAGE error code otherwise
|
||
* Globals: (none)
|
||
* Statics: (none)
|
||
* Remarks: (none)
|
||
* Updates: (none)
|
||
*/
|
||
DWORD
|
||
LUI_PrintMsgIns(
|
||
LPTSTR *istrings,
|
||
DWORD nstrings,
|
||
DWORD msgno,
|
||
unsigned int *msglen,
|
||
DWORD mode,
|
||
HANDLE handle
|
||
)
|
||
{
|
||
TCHAR msgbuf[MSG_BUFF_SIZE];
|
||
DWORD result;
|
||
unsigned int tmplen;
|
||
SHORT exit_on_error, exit_on_completion, no_default_err_msg;
|
||
|
||
/* check if we have illegal combination */
|
||
if ((mode & LUI_PMODE_NODEF)
|
||
&&
|
||
(mode & (LUI_PMODE_EXIT | LUI_PMODE_ERREXT)))
|
||
{
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
/* setup various flags */
|
||
exit_on_error = (SHORT)(mode & LUI_PMODE_ERREXT);
|
||
exit_on_completion = (SHORT)(mode & LUI_PMODE_EXIT);
|
||
no_default_err_msg = (SHORT)(mode & LUI_PMODE_NODEF);
|
||
|
||
/* get message and write it */
|
||
result = LUI_GetMsgInsW(istrings, nstrings, msgbuf,
|
||
DIMENSION(msgbuf),
|
||
msgno, (unsigned *) &tmplen);
|
||
|
||
if (result == 0 || !no_default_err_msg)
|
||
{
|
||
_tcsncpy(ConBuf, msgbuf, tmplen);
|
||
ConBuf[tmplen] = NULLC;
|
||
DosPutMessageW(handle, ConBuf, FALSE);
|
||
}
|
||
|
||
if (msglen != NULL) *msglen = tmplen ;
|
||
|
||
/* different ways of exiting */
|
||
if (exit_on_error && result != 0)
|
||
{
|
||
exit(result) ;
|
||
}
|
||
|
||
if (exit_on_completion)
|
||
{
|
||
exit(-1) ;
|
||
}
|
||
|
||
return result;
|
||
}
|