home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Network Support Encyclopedia 96-1
/
novell-nsepro-1996-1-cd2.iso
/
download
/
netware
/
dsread.exe
/
READADDR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-12
|
9KB
|
323 lines
/****************************************************************************
** File: READADDR.C
**
** Desc: Reads NetWork Address of given object
**
**
** DISCLAIMER
**
** Novell, Inc. makes no representations or warranties with respect to
** any NetWare software, and specifically disclaims any express or
** implied warranties of merchantability, title, or fitness for a
** particular purpose.
**
** Distribution of any NetWare software is forbidden without the
** express written consent of Novell, Inc. Further, Novell reserves
** the right to discontinue distribution of any NetWare software.
**
** Novell is not responsible for lost profits or revenue, loss of use
** of the software, loss of data, costs of re-creating lost data, the
** cost of any substitute equipment or program, or claims by any party
** other than you. Novell strongly recommends a backup be made before
** any software is installed. Technical support for this software
** may be provided at the discretion of Novell.
**
** Programmers:
**
** Ini Who Firm
** --- ----------------- ------------------------------------------------
** CRG Calvin Gaisford Novell Developer Support.
**
** History:
**
** When Who What
** -------- --- ---------------------------------------------------------
** 10-21-94 CRG First code.
*/
/***************************************************************************
** Libraries Linked in for .exe
**
** NWCALLS.LIB
** NWLOCALE.LIB
** NWNET.LIB
**
*/
/***************************************************************************
** #defines
*/
#define FAILURE 0xFF
#define SUCCESS 0x00
/****************************************************************************
** Include headers, macros, etc.
*/
/*-----------------------------------------------------------------------
** ANSI
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
/*-----------------------------------------------------------------------
** NetWare
*/
#include <nwnet.h>
#include <nwcalls.h>
#include <nwlocale.h>
/*-----------------------------------------------------------------------
** Program Global storage
*/
struct
{
NWDSContextHandle context;
}gs;
extern unsigned _stklen=8000;
/***************************************************************************
** Function Prototypes
*/
void Proc(void);
NWDSCCODE ReadNetAddr(char *objectName);
void FatalError(int errorCode);
void InitDS(void);
int UninitDS(void);
/***************************************************************************
** Main Program
*/
void main(void)
{
InitDS();
Proc();
UninitDS();
}
/***************************************************************************
** This will prompt users for a login name.
** It will then pass that name to ReadNetAddr.
*/
void Proc(void)
{
NWDSCCODE ccode;
char objectName[MAX_DN_CHARS];
printf("Enter Object Name: ");
gets(objectName);
strcat(objectName,"\x0");
ccode = ReadNetAddr(objectName);
if(ccode)
{
printf("ReadNetAddr failed with error: %X\n",ccode);
exit(0);
}
}
/***************************************************************************
** This reads the attribute "Network Address" for the object passed in.
*/
NWDSCCODE ReadNetAddr(char *objectName)
{
NWDSCCODE ccode;
NWDS_ITERATION iterHandle=-1L;
NWDS_BUFFER *inBuf, *outBuf;
NWCOUNT totalAttrs, totalValues, x;
NWSYNTAX_ID syntaxID;
uint32 attrValSize;
char attrname[MAX_DN_CHARS];
void *attrValue;
ccode = NWDSAllocBuf(DEFAULT_MESSAGE_LEN, &inBuf);
if(ccode <0)
{
printf("Error NWDSAllocBuf\n");
goto ReadSurnameExit0;
}
ccode = NWDSAllocBuf(MAX_DN_CHARS, &outBuf);
if(ccode <0)
{
printf("Error NWDSAllocBuf\n");
goto ReadSurnameExit1;
}
ccode = NWDSInitBuf(gs.context,DSV_READ,inBuf);
if(ccode <0)
{
printf("Error NWDSInitBuf\n");
goto ReadSurnameExit2;
}
ccode = NWDSPutAttrName(gs.context,inBuf,"Network Address"); /* We only want the */
if(ccode <0) /* attribute surname */
{
printf("Error NWDSPutAttrName\n");
goto ReadSurnameExit2;
}
do
{
ccode = NWDSRead(gs.context,
objectName, /* name of Object to read (IN) */
DS_ATTRIBUTE_VALUES, /* read name and value (IN) */
FALSE, /* only attributes specified (IN) */
inBuf, /* buffer holding "surname" (IN) */
&iterHandle, /* read until all values (OUT) */
outBuf); /* where the values go to(OUT) */
if(ccode < 0)
{
printf("Error readAclValues:NWDSRead %X\n",ccode);
goto ReadSurnameExit2;
}
ccode = NWDSGetAttrCount(gs.context, outBuf, &totalAttrs);
if(ccode < 0)
{
printf("Error NWDSGetAttrCount\n");
goto ReadSurnameExit2;
}
if((NWCOUNT)0 == totalAttrs)
{
goto ReadSurnameExit2;
}
else
{
ccode = NWDSGetAttrName(gs.context,
outBuf, /* values are in here (IN) */
attrname, /* better be surname (OUT) */
&totalValues, /* number of values (OUT) */
&syntaxID); /* how to read the value (OUT) */
if(syntaxID != SYN_NET_ADDRESS) /* this is the syntax for surname */
{
printf("Error NWDSGetAttrName, bad syntax\n");
goto ReadSurnameExit2;
}
if(ccode <0)
{
printf("Error NWDSGetAttrName\n");
goto ReadSurnameExit2;
}
/* This loop is here because objects can contain more than one
NetWork address. */
for(x=totalValues;x;x--)
{
ccode = NWDSComputeAttrValSize(gs.context, /* context handle (IN) */
outBuf, /* buffer with info (IN) */
syntaxID, /* syntax ID (IN) */
&attrValSize); /* size to allocate (OUT) */
if (ccode)
{
printf("Error NWDSComputeAttrValSize %X",ccode);
goto ReadSurnameExit2;
}
if (NULL == (attrValue = malloc((int)attrValSize)) )
{
printf("Error malloc acl\n");
goto ReadSurnameExit2;
}
ccode = NWDSGetAttrVal(gs.context, /* context handle (IN) */
outBuf, /* buffer with info (IN) */
syntaxID, /* syntax ID (IN) */
attrValue); /* value of attrib (OUT) */
if(ccode <0)
{
printf("Error NWDSGetAttrVal\n");
goto ReadSurnameExit2;
}
printf("Address Type: %lu\nAddress Length: %lu\nAddress :%02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n", ((Net_Address_T *)attrValue)->addressType, ((Net_Address_T *)attrValue)->addressLength, ((Net_Address_T *)attrValue)->address[0],((Net_Address_T *)attrValue)->address[1],((Net_Address_T *)attrValue)->address[2],((Net_Address_T *)attrValue)->address[3],((Net_Address_T *)attrValue)->address[4],((Net_Address_T *)attrValue)->address[5],((Net_Address_T *)attrValue)->address[6],((Net_Address_T *)attrValue)->address[7],((Net_Address_T *)attrValue)->address[8],((Net_Address_T *)attrValue)->address[9]);
free(attrValue);
}
}
}
while(iterHandle != NO_MORE_ITERATIONS);
ReadSurnameExit2:
NWDSFreeBuf(inBuf);
ReadSurnameExit1:
NWDSFreeBuf(outBuf);
ReadSurnameExit0:
return (ccode);
}
/***************************************************************************
** FatalError is the common exit point for errors.
*/
void FatalError(int errorCode)
{
exit(errorCode);
}
/***************************************************************************
** Establish context. These are the standard initializations for DS calls
*/
void InitDS(void)
{
NWDSCCODE dsCcode;
LCONV lconvInfo;
dsCcode=NWCallsInit(NULL,NULL);
if(dsCcode) /* initialize allowing to call nwcalls functions */
{
printf("FatalError during NWCallsInit %X\n",dsCcode);
FatalError(FAILURE);
}
NWLlocaleconv(&lconvInfo);
dsCcode = NWInitUnicodeTables(lconvInfo.country_id, lconvInfo.code_page);
if(dsCcode)
{
printf("NWInitUnicodeTables() returned: %X\n", dsCcode);
FatalError(FAILURE);
}
gs.context=NWDSCreateContext();
if(gs.context)
{
printf("FatalError during NWDSCreateContext %X\n",gs.context);
FatalError(FAILURE);
}
}
/***************************************************************************
** Release context and clean up.
*/
int UninitDS()
{
NWDSCCODE dsCcode;
dsCcode=NWDSFreeContext(gs.context);
if(dsCcode)
{
printf("FatalError during NWDSFreeContext %X\n",dsCcode);
FatalError (FAILURE);
}
dsCcode=NWFreeUnicodeTables();
if(dsCcode)
{
printf("Error during NWFreeUnicodeTables()\n");
FatalError (FAILURE);
}
return(0);
}