mirror of https://github.com/lianthony/NT4.0
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
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);
|
|
}
|