Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

766 lines
15 KiB

/***************************************************************************
*
* File Name: xportcol.c
*
* Copyright (C) 1993-1996 Hewlett-Packard Company.
* All rights reserved.
*
* 11311 Chinden Blvd.
* Boise, Idaho 83714
*
* This is a part of the HP JetAdmin Printer Utility
*
* This source code is only intended as a supplement for support and
* localization of HP JetAdmin by 3rd party Operating System vendors.
* Modification of source code cannot be made without the express written
* consent of Hewlett-Packard.
*
*
* Description:
*
* Author: Name
*
*
* Modification history:
*
* date initials change description
*
* mm-dd-yy MJB
*
*
*
*
*
*
***************************************************************************/
/* Defines:
**
** _INTEL
** _COLA
**
** To turn on debug information/routines:
** _DEBUG
*/
#if !defined(_INTEL) || !defined(_COLA)
#error _COLA and _INTEL must defined!
#endif
#include <pch_c.h>
#ifndef _PORTABLE
#include <direct.h>
#endif
#ifndef WIN32
#include <string.h>
#endif /* WIN32 */
#ifndef _DIET
#include <hpnwshim.h>
#endif // _DIET
#include <jetdirct.h>
/*#include ".\misc.h"*/
#ifndef _DIET
#include "../hpobject/mib.h"
#endif
#include "./snmplib.h"
#include "./snmperr.h"
#include "./snmputil.h"
#include "./hpsnmp.h"
#include <nolocal.h>
#include <trace.h>
extern DWORD dwTLSIndex;
extern LPSNMPThreadLocal lpGlobalThreadLocal;
/********************************************************
**
** Name: AddrUniq
**
** Desc: generate a new request id using the existing
** id as well as the address as a seed.
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
ulong AddrUniq(
Addr IN *addr
)
{
HPASSERT(addr!=NULL);
return( (ulong)(addr->hPeripheral) );
}
/********************************************************
**
** Name: XPORTFixUpAddr
**
** Desc: fill in the Addr structure by looking up addresses, etc.
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result XPORTFixUpAddr(
XPortInfo IN *xport,
Addr IN *addr
)
{
typedef struct {
DWORD version;
DWORD timeoutSec;
DWORD timeoutUSec;
DWORD retries;
} OpenChannelOptions;
OpenChannelOptions chanOpt;
DWORD portNum;
BOOL bAltSNMP;
BOOL bCardUp;
DWORD returnCode;
LPSNMPThreadLocal lpThreadLocal = lpGlobalThreadLocal;
HPSNMPEnterCriticalSection();
#ifdef WIN32
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
if ( lpThreadLocal IS NULL )
{
if ( AllocThreadStorage() )
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
else
{
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return(ERR_ARGUMENT);
}
}
#endif
/* check argument */
if(!xport || !addr) {
TRACE0(TEXT("XPORTFixUpAddr: parameter list is bad.\n"));
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_ARGUMENT));
}
/* we need a hPeripheral to proceed */
if(!addr->hPeripheral) {
TRACE0(TEXT("XPORTFixUpAddr: bad peripheral handle.\n"));
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_ARGUMENT));
}
/* if not an open channel, then get one */
if(!addr->hChannel) {
/* is this a valid handle? */
returnCode = DBGetCommStatusEx(addr->hPeripheral, DBGetConnectionTypeEx(addr->hPeripheral), &bCardUp);
if(returnCode IS RC_SUCCESS AND !bCardUp) {
TRACE0(TEXT("XPORTFixUpAddr: card is not up\n"));
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_NORESP));
}
/* determine the snmp socket to use */
DBIsAlternativeSNMP(addr->hPeripheral, &bAltSNMP);
chanOpt.version = 1;
chanOpt.timeoutSec = 0;
chanOpt.timeoutUSec = 0;
chanOpt.retries = 1;
//INT3H;
/* open a TAL channel */
returnCode = TALOpenChannel(
addr->hPeripheral,
(bAltSNMP)
? SNMP_ALT_SOCKET
: SNMP_SOCKET,
CHANNEL_DATAGRAM,
&chanOpt,
&(addr->hChannel)
);
if ( ( returnCode ISNT RC_SUCCESS ) OR (!addr->hChannel) ) {
TRACE2(TEXT("XPORTFixupAddr: cannot open channel, result=0x%08lx, channel=0x%08lx\n"),returnCode,addr->hChannel);
/* HPASSERT(returnCode IS RC_SUCCESS AND !addr->hChannel); */
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=(Result)returnCode));
}
DBGetPortNumber(addr->hPeripheral, &portNum);
addr->port = (uchar)portNum;
}
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_OK));
}
/********************************************************
**
** Name: XPORTCloseAddr
**
** Desc: close the address referenced in the Addr structure
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
DLL_EXPORT(Result) CALLING_CONVEN XPORTCloseAddr(
Addr IN *addr
)
{
LPSNMPThreadLocal lpThreadLocal = lpGlobalThreadLocal;
HPSNMPEnterCriticalSection();
#ifdef WIN32
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
if ( lpThreadLocal IS NULL )
{
if ( AllocThreadStorage() )
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
else
{
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return(ERR_ARGUMENT);
}
}
#endif
/* check the argument */
if(!addr) {
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_ARGUMENT));
}
if(addr->hChannel) {
TALCloseChannel(addr->hChannel);
addr->hChannel = NULL;
}
else
TRACE0(TEXT("XPORTCloseAddr: closing a invalid address\n"));
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_OK));
}
/********************************************************
**
** Name: XPORTFillAddrCola
**
** Desc: fill in the Addr structure by looking up addresses, etc.
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
DLL_EXPORT(Result) CALLING_CONVEN XPORTFillAddrCola(
XPortInfo IN *xport,
Addr IN *newAddr,
HPERIPHERAL IN hPeripheral
)
{
Result status;
LPSNMPThreadLocal lpThreadLocal = lpGlobalThreadLocal;
HPSNMPEnterCriticalSection();
#ifdef WIN32
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
if ( lpThreadLocal IS NULL )
{
if ( AllocThreadStorage() )
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
else
{
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return(ERR_ARGUMENT);
}
}
#endif
if(!xport || !newAddr) {
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_ARGUMENT));
}
memset(newAddr,0x00,sizeof(Addr));
newAddr->hPeripheral = hPeripheral;
/* try to fill in the address information about this entry */
if((status=XPORTFixUpAddr(xport,newAddr))!=ERR_OK) {
TRACE1(TEXT("XPORTFillAddrCola: problem with XPORTFixUpAddr 0x%04x\n"),status);
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr = status));
}
newAddr->attemptFailed = FALSE;
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportErr=ERR_OK));
}
/********************************************************
**
** Name: xportErrVal
**
** Desc: return the error value for the addr services
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result xportErrVal(
XPortInfo IN *xport
)
{
LPSNMPThreadLocal lpThreadLocal = lpGlobalThreadLocal;
HPSNMPEnterCriticalSection();
#ifdef WIN32
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
if ( lpThreadLocal IS NULL )
{
if ( AllocThreadStorage() )
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
else
{
HPASSERT(FALSE);
HPSNMPLeaveCriticalSection();
return(ERR_ARGUMENT);
}
}
#endif
HPASSERT(xport!=NULL);
/* remove compile warnings */
xport = xport;
HPSNMPLeaveCriticalSection();
return(lpThreadLocal->xportErr);
}
/********************************************************
**
** Name: XPORTDump
**
** Desc: Dump information about the Addr structure
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
#ifdef _DEBUG
Result XPORTDump(
Addr IN *addr
)
{
if(!addr) {
HPASSERT(FALSE);
return(ERR_ARGUMENT);
}
PRINT1("\txportErr: 0x%04x\n",
xportErr);
PRINT1("\thPeripheral: 0x%08lx\n",
addr->hPeripheral);
PRINT1("\thChannel: 0x%08lx\n",
addr->hChannel);
PRINT1("\tJetDir port: %u\n",
addr->port
);
return(ERR_OK);
}
#endif
/********************************************************
**
** Name: dgPost
**
** Desc: post ecb and buffer for listening on the ipx socket
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result dgPost(
XPortInfo IN *xport,
ushort IN i
)
{
xport = xport;
i = i;
return((xport->dgErr=ERR_OK));
}
/********************************************************
**
** Name: dgReceive
**
** Desc: return a waiting datagram packet from the listen queue
**
** Parameters:
** xport: the transport to use
**
** blocking: should the call block until a response is
** gotten?
**
** resp: the response buffer
**
** respSiz: passed into this call, this value indicates
** the size of the buffer
** passed out of the call, this value is the
** number of bytes returned
**
** src: the address of the node sending the packet
** if NULL is passed in, then dgReceive will
** not pass this back.
** the value will be initialized to NULLs if
** dgReceive does not support this
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result dgReceive(
Addr IN *addr,
XPortInfo IN *xport,
Blocking IN blocking,
uchar OUT *resp,
ushort OUT *respSiz,
uchar OUT *src
)
{
DWORD dwRespSiz;
DWORD resultCode;
/* check the arguments */
if(!xport) {
HPASSERT(FALSE);
return(ERR_ARGUMENT);
}
/* check the arguments */
if(!resp || !respSiz) {
HPASSERT(FALSE);
return((xport->dgErr=ERR_ARGUMENT));
}
/* is the blocking request supported? */
if(blocking!=BLK_OFF) {
/* not supported, yet */
HPASSERT(FALSE);
return((xport->dgErr=ERR_ARGUMENT));
}
/* check the arguments */
if(*respSiz==0) {
HPASSERT(FALSE);
return((xport->dgErr=ERR_RANGE));
}
/* make sure that the channel is valid */
if(!addr || !addr->hChannel) {
HPASSERT(FALSE);
return((xport->dgErr=ERR_C_BAD_HANDLE));
}
/* not supported yet, so blank it out */
if(src)
memset(src,0x00,sizeof(IPXAddress));
dwRespSiz = *respSiz;
resultCode = TALReadChannel(addr->hChannel,resp,&dwRespSiz, NULL);
if(resultCode==RC_SUCCESS) {
*respSiz = (ushort)dwRespSiz;
return((xport->dgErr=ERR_OK));
}
if(resultCode==RC_TIMEOUT)
return((xport->dgErr=ERR_NOTAVAIL));
if(resultCode==RC_BUFFER_OVERFLOW)
{
return((xport->dgErr=ERR_SIZE));
}
#ifdef _DEBUG
switch(resultCode) {
case RC_FAILURE: TRACE0(TEXT("dgReceive: RC_FAILURE (could be no data available)\n")); break;
case RC_BAD_HANDLE: TRACE0(TEXT("dgReceive: bad channel passed to TALReadChannel\n")); break;
case RC_SUCCESS: TRACE0(TEXT("dgReceive: the buffer pointer or size was 0\n")); break;
default: TRACE1(TEXT("dgReceive: error reading channel 0x%04x\n"),resultCode);
break;
}
#endif
return((xport->dgErr=(Result)resultCode));
}
/********************************************************
**
** Name: dgSend
**
** Desc: send a packet using the datagram services
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result dgSend(
XPortInfo IN *xport,
Addr IN *addr,
uchar IN *req,
ushort IN reqSiz
)
{
DWORD resultCode;
DWORD dwReqSiz;
/* check the arguments */
if(!xport) {
TRACE0(TEXT("dgSend: xport pointer bad.\n"));
HPASSERT(FALSE);
return(ERR_ARGUMENT);
}
/* input arguments ok? */
if(!addr || !req || !reqSiz) {
TRACE0(TEXT("dgSend: parameter list is bad.\n"));
HPASSERT(FALSE);
return((xport->dgErr=ERR_ARGUMENT));
}
/* validate address */
if(XPORTFixUpAddr(xport,addr)!=ERR_OK) {
TRACE0(TEXT("dgSend: fixup address is bad.\n"));
HPASSERT(FALSE);
return((xport->dgErr=ERR_BADADDR));
}
/* make sure that the packet size is not too large, header is not included in SNMP_DAT_SIZ */
if(reqSiz>SNMP_DAT_SIZ) {
TRACE0(TEXT("dgSend: request size too big.\n"));
HPASSERT(FALSE);
return((xport->dgErr=ERR_SIZE));
}
dwReqSiz = reqSiz;
resultCode = TALWriteChannel(addr->hChannel,req,&dwReqSiz, NULL);
if(resultCode==RC_SUCCESS) {
return((xport->dgErr=ERR_OK));
}
TRACE1(TEXT("dgSend: error writing to channel 0x%04lx\n"),resultCode);
return((xport->dgErr=(Result)resultCode));
}
/********************************************************
**
** Name: dgInit
**
** Desc: initialize the client apis for netware
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result dgInit(
XPortInfo IN **xportPtr
)
{
LPSNMPThreadLocal lpThreadLocal = lpGlobalThreadLocal;
#ifdef WIN32
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
if ( lpThreadLocal IS NULL )
{
if ( AllocThreadStorage() )
lpThreadLocal = (LPSNMPThreadLocal)TlsGetValue(dwTLSIndex);
else
{
HPASSERT(FALSE);
return(ERR_ARGUMENT);
}
}
#endif
if(!xportPtr) {
HPASSERT(FALSE);
return(ERR_ARGUMENT);
}
HPSNMPEnterCriticalSection();
*xportPtr = &lpThreadLocal->xportCola;
HPSNMPLeaveCriticalSection();
return((lpThreadLocal->xportCola.dgErr=ERR_OK));
}
/********************************************************
**
** Name: dgExit
**
** Desc: DeInitialize network structures, free up resources.
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result dgExit(
XPortInfo IN *xport
)
{
if(!xport) {
HPASSERT(FALSE);
return(ERR_ARGUMENT);
}
return(ERR_OK);
}
/********************************************************
**
** Name: dgErrVal
**
** Desc: return the error value for the datagram services
**
** Author:
** Steve Gase,
** Hewlett-Packard,
** Network Printer Division
** [email protected]
**
** Date: 2/4/95
**
********************************************************/
Result dgErrVal(
XPortInfo IN *xport
)
{
/* check the arguments */
if(!xport) {
HPASSERT(FALSE);
return(ERR_ARGUMENT);
}
return(xport->dgErr);
}