This sample does exactly what GetConnectionsUsingFile() could do but by sending an NCP request to the server with NWNCPSend()
#include <nwconn.h>
#include <nwerrno.h>
#include <nwfileng.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct GetConnsRequestPacket {
unsigned short SubFuncStrucLen;
unsigned char SubFunctionCode;
unsigned char DataStreamNumber;
unsigned char VolumeNumber;
unsigned long DirectoryNumber;
unsigned short LastRecordSeen;
};
struct ConnInfoReplyPacket {
unsigned short ConnectionNumber;
unsigned short TaskNumber;
unsigned char LockType;
unsigned char AccessControl;
unsigned char LockFlag;
};
struct GetConnsReplyPacket {
unsigned short NextRequestRecord;
unsigned short UseCount;
unsigned short OpenCount;
unsigned short OpenForReadCount;
unsigned short OpenForWriteCount;
unsigned short DenyReadCount;
unsigned short DenyWriteCount;
unsigned char Locked;
unsigned char ForkCount;
unsigned short NumberOfRecords;
struct ConnInfoReplyPacket conn_info[ 80];
};
int main( int argc, char *argv[]) {
struct GetConnsRequestPacket req;
struct GetConnsReplyPacket rep;
int volume;
int ccode;
int i;
if ( argc != 2) {
puts( "Usage: LOAD GetCUF <filename>");
return EXIT_FAILURE;
}
/*
// Prepare request packet
*/
req.SubFuncStrucLen = 0x900; /* Hi-Lo */
req.SubFunctionCode = 236;
req.DataStreamNumber = 0;
req.LastRecordSeen = 0;
ccode = FEMapPathVolumeDirToVolumeDir( argv[ 1],
0,
0,
&volume,
&req.DirectoryNumber);
if ( ccode != ESUCCESS) {
printf( "FEMapPathVolumeDirToVolumeDir failed, ccode = %d\n", ccode);
return EXIT_FAILURE;
}
req.VolumeNumber = ( unsigned char) volume;
/*
// Send NCP request
*/
ccode = NWNCPSend( 23, &req, sizeof( req), &rep, sizeof( rep));
if ( ccode != ESUCCESS) {
printf( "NWNCPSend failed, ccode = %d\n", ccode);
return EXIT_FAILURE;
}
/*
// Display received information
*/
printf( "rep.NextRequestRecord = %d\n"
"rep.UseCount = %d\n"
"rep.OpenCount = %d\n"
"rep.OpenForReadCount = %d\n"
"rep.OpenForWriteCount = %d\n"
"rep.DenyReadCount = %d\n"
"rep.DenyWriteCount = %d\n"
"rep.Locked = %d\n"
"rep.ForkCount = %d\n"
"rep.NumberOfRecords = %d\n",
rep.NextRequestRecord,
rep.UseCount,
rep.OpenCount,
rep.OpenForReadCount,
rep.OpenForWriteCount,
rep.DenyReadCount,
rep.DenyWriteCount,
rep.Locked,
rep.ForkCount,
rep.NumberOfRecords);
for ( i = 0; i < rep.NumberOfRecords; ++i) {
printf( "conn = %d, "
"task = %d, "
"LockType = %x, "
"AccessControl = %x, "
"LockFlag = %x\n",
rep.conn_info[ i].ConnectionNumber,
rep.conn_info[ i].TaskNumber,
rep.conn_info[ i].LockType,
rep.conn_info[ i].AccessControl,
rep.conn_info[ i].LockFlag);
}
return EXIT_SUCCESS;
}
© 2008 Novell, Inc. All Rights Reserved.