Novell Home

How to get connections for a file via NWNCPSend()

From Developer Community

This sample does exactly what GetConnectionsUsingFile() could do but by sending an NCP request to the server with NWNCPSend()

Sample Code

#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;
}

--Dmitry Mityugov

Novell® Making IT Work As One

© 2008 Novell, Inc. All Rights Reserved.