windows-nt/Source/XPSP1/NT/ds/netapi/netlib/luiint.c

225 lines
5.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991-1992 Microsoft Corporation
Module Name:
luiint.c
Abstract:
This module provides routines for setting up search lists of string/value
pairs using messages in the NET.MSG message file, and for traversing
such a search list.
Author:
Dan Hinsley (danhi) 06-Jun-1991
Environment:
User Mode - Win32
Revision History:
10-Jul-1989 chuckc
Created
24-Apr-1991 danhi
32 bit NT version
06-Jun-1991 Danhi
Sweep to conform to NT coding style
01-Oct-1992 JohnRo
RAID 3556: Added NetpSystemTimeToGmtTime() for DosPrint APIs.
20-Feb-1993 YiHsinS
Moved from netcmd\map32\search.c. And added LUI_GetMessageIns.
--*/
//
// INCLUDES
//
#include <windows.h> // IN, LPTSTR, etc.
#include <lmcons.h>
#include <stdio.h>
#include <lmerr.h>
#include <luiint.h>
#include <netlib.h>
/*-- routines proper --*/
/*
* Name: ILUI_setup_list
* Given an array of 'search_list_data' (ie. msgno/value
* pairs), create a string/value pair using the messages
* in the message file.
* Args: char * buffer - for holding the meesages retrieved
* USHORT bufsiz - size of the above buffer
* USHORT offset - the number of items already setup
* in slist, we will offset our retrieved
* string/value pais by this much.
* PUSHORT bytesread - the number of bytes read into buffer
* searchlist_data sdata[] - input array of msgno/value pairs,
* we stop when we hit a message number
* of 0
* searchlist slist[] - will receive the string/value pairs
* (string will be pointers into buffer)
* Returns: 0 if ok, NERR_BufTooSmall otherwise.
* Globals: (none)
* Statics: (none)
* Remarks: WARNING! We assume the caller KNOWs that slist is big enough
* for the pairs to be retrieved. This can be determined statically
* while buffer size cannot. Hence we provide checks for the
* latter.
* Updates: (none)
*/
USHORT
ILUI_setup_list(
CHAR *buffer,
USHORT bufsiz,
USHORT offset,
PUSHORT bytesread,
searchlist_data sdata[],
searchlist slist[]
)
{
USHORT err ;
unsigned int msglen ;
int i ;
*bytesread = 0 ;
for ( i=0; sdata[i].msg_no != 0; i++)
{
if (err = LUI_GetMsgIns(NULL,0,buffer,bufsiz,sdata[i].msg_no,
(unsigned far *)&msglen))
return(err) ;
slist[i+offset].s_str = buffer ;
slist[i+offset].val = sdata[i].value ;
buffer += msglen+1 ;
bufsiz -= msglen+1 ;
*bytesread += msglen+1 ;
}
return(0) ;
}
/*
* Name: ILUI_traverse_slist
* traverse a searchlist ('slist') of string/number pairs,
* and return the number matching string 'str'.
* Args: char * pszStr - the string to search for
* searchlist * slist - pointer to head of a searchlist
* int * pusVal - pointer to variable that receives
* the vale retrieved
* Returns: 0 if found, -1 otherwise.
* Globals: (none)
* Statics: (none)
* Remarks: (none)
* Updates: (none)
*/
USHORT
ILUI_traverse_slist(
PCHAR pszStr,
searchlist * slist,
SHORT * pusVal
)
{
if (!slist)
return( (USHORT) -1) ;
while (slist->s_str)
{
if (_stricmp(pszStr,slist->s_str) == 0)
{
*pusVal = slist->val ;
return(0) ;
}
++slist ;
}
return( (USHORT) -1) ;
}
/*
* Name: LUI_GetMsgIns
* This routine is very similar to DOSGETMESSAGE,
* except it:
* 1) looks for messages in specific files
* in a specific order:
* a) MESSAGE_FILE in <lanman_dir>
* b) MESSAGE_FILENAME in DPATH
* c) OS2MSG_FILENAME in DPATH
* 2) guarantees a null terminates string
* 3) will accept NULL for msglen (see below).
* Args: istrings : pointer to table of insert strings
* nstrings : number of insert strings
* msgbuf : buffer to hold message retrieved
* bufsize : size of buffer
* msgno : message number
* msglen : pointer to variable that will receive message length
* Returns: zero if ok, the DOSGETMESSAGE error code otherwise
* Globals: (none)
* Statics: NetMsgFileName, OS2MsgFileName
*/
USHORT
LUI_GetMsgIns(
PCHAR *istrings,
USHORT nstrings,
PSZ msgbuf,
USHORT bufsize,
ULONG msgno,
unsigned int *msglen
)
{
USHORT result, tmplen ;
static WCHAR NetMsgFileName[PATHLEN+1] = { 0 };
static WCHAR OS2MsgFileName[PATHLEN+1] = { 0 };
*msgbuf = '\0' ;
/* make a path to the LANMAN message file */
if (NetMsgFileName[0] == '\0') {
wcscpy(NetMsgFileName, MESSAGE_FILENAME);
}
/* make a path to the OS/2 message file */
if (OS2MsgFileName[0] == '\0') {
wcscpy(OS2MsgFileName, OS2MSG_FILENAME);
}
result = DosGetMessage( istrings,
nstrings,
msgbuf,
(USHORT) (bufsize - 1),
(USHORT) msgno,
NetMsgFileName,
&tmplen);
if (result == ERROR_MR_MID_NOT_FOUND) { /* cannot find */
/* try OS2 message file instead */
result = DosGetMessage(istrings,
nstrings,
msgbuf,
(USHORT) (bufsize - 1),
(USHORT) msgno,
OS2MsgFileName,
&tmplen);
}
/*
* in all DosGetMessage above we passed it bufsize-1, so we are
* assure of at least one spare byte for the \0 terminator.
*/
msgbuf[tmplen] = '\0' ;
if (msglen != NULL) {
*msglen = tmplen ;
}
return(result) ;
}