Developer Links
SUPPORT FORUMS  
SAMPLE CODE & TIDS  
TEST/DEVELOPMENT KIT INFO
 
DEVELOPER LABS  
NOVELL SUPERLAB  
SUPPORT DOCUMENTS  
STRATEGIC/EXECUTIVE ISSUE TRACKING  
SYSOP PROGRAM  
     
Related Links
 
 
 
 
 
Related Links  
 

 
DEVELOPER SUPPORT HOME  

DECEMBER 1993 VOLUME 5 NUMBER 11


INDEX


ARTICLES:

Porting Local Communication Apps to NetWare Connect

The August 1993 issue of Novell Professional Developer Bullets introduced developers to the basics of developing applications using the Asynchronous I/O (AIO) functions found in the NetWare NLM SDK v3.0. One NetWare product which takes advantage of AIO, is the recently released NetWare Connect v1.1, the successor to Novell's NetWare Asynchronous Communications Services (NACS).

NetWare Connect is a communications solution that allows for incoming and outgoing support. The server NLM provides access to an attached modem pool. From the network, a client can take advantage of this modem pool by loading the NASI TSR, which communicates with the server NLM via SPX, and using a communications package designed to communicate with the TSR.

Without this type of solution, individuals needing access to a modem would be required to have a modem on their desk. This means additional modems and additional phone lines. With NetWare Connect, individuals that need access to a modem need only load the NASI TSR, query for an available modem and attach, all from their workstation.

Many popular communications packages have been developed, not only as standalone, single-workstation applications, but as packages that could run with NACS. Because of NetWare Connect's backward compatibility, these as well as many others packages support remote communications with NetWare Connect.

As with many Novell products, developers can take advantage of NetWare Connect by developing their own communications package. The NetWare Asynchronous Services Interface (NASI) SDK v3.0 provides APIs that communicate with a modem pool on the network via the NASI TSR program. You can easily convert an application that accesses local COM ports to NASI. This article takes a look at a local communications application named MYCOMM (excerpted in Figure 2) and converts it to a NASI application called NWCOMM (excerpted in Figure 3).

FIGURE 2: MYCOMM.C, Example of standalone COM services

struct {
       BYTE baud;
       BYTE wordLength;
       BYTE stopBits;
       BYTE parity;
       } comConfig;
void main (void)
{
     char c, bye=0;
     unsigned int  keyPressed;
// Open com port.
     AcquireCom (&comHandle, comConfig);
// Begin communications with modem.
     while (1 && !bye)
     {
// Loop until a key is pressed. In the loop, check
// for incoming data. If data is available, read it
// and print it to screen.
       while (!bioskey (1))
       {
         if (RxData (comHandle))
       {
         c = ReadComCh (comHandle);
         cprintf ("%c", c);
       }
         CheckCom (comHandle);
       }
// Get the key & determine if it begins alt sequence.
       keyPressed = bioskey (0);
       if (AltKeyPressed (keyPressed))
       {
         switch (keyPressed)
         {
// hang up command
         case H:
           ComWriteStr (comHandle, "+++");
           delay(5000);
           ComPutStr (comHandle, "ATH0\r\n");
           break;
// initialize modem
         case I:
           ComWriteStr (comHandle, "ATZ\r\n");
           break;
// exit application
         case X:
           ReleaseCom (comHandle);
           bye=1;
           break;
         default:
           continue;
         } // end switch
       } // end if (AltKeyPressed)
// If key pressed is not alt sequence, write it out.
       else
       {
       ComWriteCh (comHandle, (char)key);
       CheckCom (comHandle);
       } // end else
     } // end while (1)
} // main
END of FIGURE 2
FIGURE 3: NWCOMM.C, Example of extended NASI services
#include 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>

#include <bios.h>

#include "cintnasi.h" // NASI header file

NASI_CONFIG portConfig;

WORD vC;  BYTE port;
void main (void) {
     WORD keyPressed, c, bytesSent, bytesReturned, bye=0;
     BYTE *inBuffer=0, rxStatus=0;
// Acquire virtual connection, open port, & initialize
     Init ();
   while (1 && !bye) { // Begin modem communications
// Loop until key is pressed. Check for incoming data.
// If data available, read it and print it to screen.
     while (!bioskey (1)) {
       rxStatus = 0;
       bytesReturned = 1;
       NasiGetRxStatus (vC, &rxStatus);

 if (rxStatus) {

   NasiRead (vC, &bytesReturned, inBuffer);

   if (bytesReturned) cprintf ("%c", *inBuffer);

 } // if (rxStatus)
     } // end while (!bioskey (1))
     keyPressed = bioskey (0);
// Get key pressed & determine if it begins alt key seq.
     if (!(keyPressed & 0x00FF)) {
     switch (keyPressed) {
        case H:                  // hang up modem
             SendData ("+++");
             delay(5000);
             SendData ("ATH0\r\n");
             break;
        case I:                  // modem reset command
             SendData ("ATZ\r\n");
             break;
        case X:                  // close session
                   NasiDisconnect (vC);
             bye = 1;
             break;
        default:
                    continue;
     } // end switch
     } // end if (AltKeyPressed)
     else
     {
// If just a normal key press, write it.
       SendCh ((char)keyPressed);
     } // end else
   } // end while (1)
} // main end
void Init (void) {
     int  rCode=1;

     WORD c;
     portConfig.bufferLen = 12;
     portConfig.port = CURRENT_NACS_PORT;
     portConfig.receiveBaudRate = BAUD_9600;
     portConfig.receiveCharLen = LEN_7;
     portConfig.receiveStopBits = STOP_1;
     portConfig.receiveParity = EVEN;
     portConfig.transmitBaudRate = BAUD_9600;
     portConfig.transmitCharLen = LEN_7;
     portConfig.transmitStopBits = STOP_1;
     portConfig.transmitParity = EVEN;
     portConfig.DTRControl = ON;
     portConfig.RTSControl = ON;
     portConfig.flowControl = NONE;
// Look for a 9600 baud modem.
     NasiOpen (&vC, "D9600???", &portConfig);
// Initialize internal receive buffer.
     NasiFlushRxBuffer (vC);
// Initialize internal transmit buffer.
     NasiFlushTxBuffer (vC);
} // Init end
void SendData (BYTE *inBuffer)
{
     BYTE stringSent[80], c, xNASI, xNACS;
     WORD bytesSent, waitTime=0;

     strcpy (stringSent, inBuffer);
     bytesSent = strlen (stringSent);
     NasiWrite (vC, &bytesSent, stringSent);
     waitTime = 0;
// Used to break out of WHILE in case we get "stuck"
     do {
        c = NasiGetTxStatus (vC, &xNASI, &xNACS);
     } while (c==0 && ((xNACS !=PORT_READY_TO_XMIT) &&
                      (xNASI !=XMITTER_NOT_BUSY)) &&
                      waitTime++<TIME_OUT);
} // SendData end
void SendCh (BYTE outBuffer)
{
     BYTE c, xNASI, xNACS;
     WORD bytesSent, waitTime=0;
     bytesSent = 1;
     NasiWrite (vC, &bytesSent, &outBuffer);
     waitTime = 0;
     do {
        c = NasiGetTxStatus (vC, &xNASI, &xNACS);
     } while (c==0 && ((xNACS !=PORT_READY_TO_XMIT) &&
                      (xNASI !=XMITTER_NOT_BUSY)) &&
                      waitTime++<TIME_OUT);

} // SendCh end
END of FIGURE 3

Initialization:

MYCOMM

As with any device to be accessed, the COM port must be "opened." The call to AcquireCom() fulfills this operation. The call is passed the desired COM port to access in comPort and configuration information, baud rate, character length, stop bits, and parity information from the comConfig structure. MYCOMM then uses the comHandle on subsequent functions calls.

NWCOMM

The initialization sequence requires three steps:
  • Acquire a virtual circuit
  • Acquire a desired port
  • Configure the port.
You could complete these three steps by calling the functions NasiAllocateVC(), NasiSetServiceName(), and NasiInitialize(). On the other hand, you can make one call to NasiOpen() which performs the equivalent of these functions. The call to NasiOpen() is passed the variables vC, serviceName, and portConfig. The variable, vC, is then used on subsequent calls just as comHandle is used in MYCOMM. The vC, or virtual circuit, is the entity defined by the application which establishes an association with a port controlled by NetWare Connect.

Since you are choosing from a remote modem pool, you must specify which modem, or port, you want. The specification can be as general or as specific as desired. The value of serviceName is the General Port Name or Specific Port Name. Any field can contain the wildcard character "?". NWCOMM attempts to establish a connection with a 9600 baud modem.

In a WAN environment, NetWare Connect services in other cities may be found in this search. Specificying a partial name in this instance will assure that you do not connect with a modem in a different city or farther away than your local services.

The Specific Port Name may be indicitive of some other desirable attribute in the modem connection. In this case, the Specific Port Name specifies a particular modem on a particular port, though that fact is not important to this discussion.

The example simply wants to find a 9600 baud modem in AUSTIN. The Austin services are in the form: AUS-CONN for the Service Name, D9600 for the General Port Name, and AUSNWCONN1 through AUSNWCONN8 for the Specific Port Name. NasiConfig contains information just like comConfig in MYCOMM.

Port Write:

MYCOMM

Once MYCOMM has an open communications port, you can read and write to it. Single characters are sent to the COM port via ComWriteCh(). ComWriteStr() sends string data to the COM port. The comHandle is the first parameter passed in that indicates the port on which MYCOMM is currently communicating.

NWCOMM

The call to NasiWrite() in the SendData() and SendCh() routines sends data to the desired virtual connection which is designated by the parameter vC, acquired during the call to Init(). The parameter, bytesSent, is initialized to the number of bytes to write. bytesSent is also the variable in which the number of bytes actually sent is returned.

Error Checking:

MYCOMM

A call to CheckCom() determines if the transmit queue is full. MYCOMM calls this function after the data has been sent. Checking the COM port determines if the data was sent or if you need to wait before sending more data.

NWCOMM

The call to NasiGetTxStatus() performs the same function that the MYCOMM CheckCom() does. This function is called after NasiWrite() before more data is sent. NasiGetTxStatus() indicates the status of the internal write buffer, as well as the status of the port being maintained by NetWare Connect. If both the internal write buffer and the port are ready to transmit, then more data can be sent.

Port Read:

MYCOMM

The MYCOMM application determines if data is waiting to be read by checking the read buffer with RxData(). If data is available, MYCOMM makes a call to ComReadCh(). Only a single byte is read at a time.

NWCOMM

NWCOMM uses the same logic as MYCOMM. The calls for NWCOMM are NasiRxStatus() and NasiRead(). The number of bytes to read is determined by the value of bytesRead. The data is then stored in inBuffer to be handled by the application, in this case, printed to the screen.

Closure:

MYCOMM

After MYCOMM is done with its session, it must close the COM device with a call to ReleaseCom().

NWCOMM

The call to NasiDisconnect() releases the resources for the allocated virtual circuit, vC. NasiDisconnect() is located in the UnInit() routine.

Availability

The NetWare Asynchronous Services Interface (NASI) provides the developer with APIs to create communications applications that take advantage of remote modem pools maintained by NetWare Connect, the successor to the NetWare Asynchronous Communication Services (NACS) product. The APIs provide easy portability for those applications currently running on a standalone personal computers accessing a local COM port.

The source code for the NASI application discussed in this article, NWCOMM, is available on Novell's Developer Forum, NOVDEV (NDEVSUPP forum, Library 1, NWCOM1.EXE).

For more information on porting existing standalone communications applications to the NetWare environment, call Novell Developer Support at 1-800-NETWARE. To obtain a copy of the NASI SDK v3.0 or NetWare Connect v1.1, contact Novell at 1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.

SIDEBAR:

NetWare Connect v1.1 and NASI Compatibility

NetWare Connect provides a wide variety of capabilties that were not present with the NetWare Asynchronous Communication Services (NACS) v3.0, including remote access and remote node services. From the perspective of a developer using the NetWare Asynchronous Services Interface (NASI) SDK v1.0, NetWare Connect v1.0 is fully compatible with any software written to work with NACS, while offering some convenient new features.

All of the previous NASI APIs have been retained and will work with NetWare Connect. In addition, the NASI API set is being expanded to include functions that address the new options. These include:

  • Enhanced modem control
  • Support for modem-independent ports
  • Increased support for dial-in groups
  • Optional security
NetWare Connect provides NASI with the ability to perform general tasks without any specific knowledge about the type of modem being used. NetWare Connect v1.0 includes new functions to initialize, dial, and request status from the modem. These functions can replace the older method of sending configuration strings directly to the modem.

In addition, NetWare Connect can be configured with default configurations for each modem. If NASI does not request a specific initialization mode, the appropriate default configuration is used.

With NetWare Connect, it is not necessary to acquire a modem to receive a call on it. Ports can remain available for dial- out use while applications monitor their status for incoming calls. NetWare Connect will answer the call and initialize the modem automatically. When the application detects an incoming call, it can acquire the modem and proceed with the live connection ready to go.

Finally, security has been enhanced by allowing the application to establish the NASI session information used to maintain the link with NetWare Connect. Normally NetWare Connect prompts users for a user ID, password, and session ID. This process can be bypassed to allow the application itself to determine the user's identity.

These new features integrate tightly with the existing NASI API set. Only a half-dozen functions have been added to implement the additional capabilities associated with NetWare Connect.

Configuring an MS Windows Workstation for Btrieve

Since MS Windows allows you to run both DOS and MS Windows applications, there are many different combinations of workstation configurations from which to choose, depending on the application. For example, you may want to run a DOS-based Btrieve application in an MS Windows DOS session using a local engine, or an MS Windows-based Btrieve application using the requester while running a DOS-based application that uses the local engine, BTRIEVE.EXE.

This article explores each of the possible configurations for running DOS- and MS Windows-based Btrieve applications on an MS Windows workstation.

There are two types of Btrieve workstation programs that can be configured either separately or in combination on an MS Windows workstation:

  • Local (client-only)
  • Requester (client/server)

The Local Implementation of Btrieve

The local configuration of Btrieve is a multiuser version that allows multiple access to Btrieve data files on a standalone workstation or multiple access to Btrieve data files residing on a DOS 3.1 compatible network. The DOS version of local Btrieve is implemented as a TSR called BTRIEVE.EXE and is used by DOS applications.

The MS Windows implementation of local Btrieve is a DLL called WBTRCALL.DLL and is used by MS Windows applications. This client DLL has a size of approximately 51K. Initialization parameters for the local WBTRCALL.DLL are specified in the WIN.INI file in the [btrieve] paragraph.

The Requester Implementation of Btrieve

The NetWare Btrieve requester configuration enables multiple workstations to access Btrieve data files that reside on NetWare servers running the Btrieve NLM or VAP. This configuration provides a simple and efficient client/server environment for client applications. The DOS version of the Btrieve requester is implemented as a TSR called BREQUEST.EXE. The MS Windows implementation of the Btrieve requester is composed of three files:
  • BREQUEST.EXE (the DOS requester)
  • WBTRCALL.DLL (approximate DLL size is 13K)
  • WBTRVRES.DLL (resource-only DLL)
Initialization parameters for the Btrieve requester for MS Windows are specified in the NOVDB.INI file in the [brequestDPMI] paragraph.

Because both the local and the requester Windows DLLs are named WBTRCALL.DLL, changing between the two configurations is invisible to the Btrieve Windows application running on the workstation. With no changes to the application and without having to recompile, you can change the environment from local to client/server and vice versa.

TSR vs. DLL

Because MS Windows provides an environment for executing both native MS Windows applications and DOS applications, some users become confused about which Btrieve executable provides services to their application. Btrieve DOS applications running in an MS Windows DOS session always access only the Btrieve TSR (either BREQUEST.EXE or BTRIEVE.EXE). Native MS Windows applications always access WBTRCALL.DLL (either the requester or the local DLL).

Six Different Configurations

On an MS Windows workstation, when running both DOS and MS Windows Btrieve applications, the local and requester configurations of Btrieve can be combined into several different configurations.

The following sections detail each of these configurations.

  1. DOS applications in an MS Windows DOS session using local BTRIEVE.EXE OR the requester, BREQUEST.EXE

    When running DOS Btrieve applications in an MS Windows DOS session that use either BTRIEVE.EXE or BREQUEST.EXE, the desired TSR should be loaded in each DOS session. Do not load either TSR before starting MS Windows.

    Running in this environment, if you exit a DOS session that has BREQUEST.EXE loaded, the workstation hangs. This problem is caused by the VIPX.386 driver that shipped with MS Windows v3.1. To correct this problem, a new VIPX.386 driver can be obtained from Novell via CompuServe in the MS Windows Client Update Kit. Currently, this kit is available in the NOVFILES forum in the file, WINUP8.EXE.

    If using BTRIEVE.EXE and the Btrieve data files reside on a local drive rather than a network drive, install SHARE.EXE before starting MS Windows if:

    1. More than one application will be accessing the data files simultaneously
    2. A single application will be accessing a data file with more than one position block simultaneously.
    In either case, if SHARE.EXE is not installed before starting MS Windows, data file corruption may result.
  2. MS Windows applications using local WBTRCALL.DLL

    If you are running an MS Windows application and want to use the client Btrieve engine, place the 51K client WBTRCALL.DLL in a directory accessible by MS Windows. MS Windows searches for DLLs in the following order:

    • The current directory
    • The \WINDOWS directory
    • The MS Windows system directory
    • The directories in the PATH environment variable
    • Network search drives
    As with the DOS client version of Btrieve, you should install SHARE.EXE in the same cases when using local WBTRCALL.DLL for the same reason.
  3. MS Windows applications using the requester WBTRCALL.DLL

    The Btrieve requester for MS Windows consists of a DOS portion and Windows portion. To configure the workstation to use the Btrieve Windows requester:

    1. Load BREQUEST.EXE before starting MS Windows.
    2. Place the 13K requester DLL, WBTRCALL.DLL in a directory accessible by MS Windows, along with WBTRVRES.DLL.
    WBTRVRES.DLL is a resource-only DLL that is used by the requester WBTRCALL.DLL, not by your application. Btrieve will return a status 1017 to your application if WBTRVRES.DLL is not available to MS Windows when using the requester DLL.
  4. MS Windows applications using requester & local DLLs

    You can configure the workstation to use both the local DLL and the requester DLL. In this environment, you access local data files (files that reside on a drive physically located at your workstation) through the local DLL. Data files residing remotely on a NetWare server drive are accessed through the requester DLL. To configure the workstation for both local and requester access:

    1. Load BREQUEST.EXE before starting MS Windows.
    2. Place the 13K requester DLL, WBTRCALL.DLL, and resource DLL, WBTRVRES.DLL, in a directory accessible by MS Windows.
    3. Run the MS Windows utility, WNDBCNVT.EXE, against the local 51K WBTRCALL.DLL.

      WNDBCNVT.EXE renames the local WBTRCALL.DLL to "WBTRLOCL.DLL" and changes the DLL name internally to "WBTRLOCL." Do not rename the local DLL manually. If WNDBCNVT is not used to rename the DLL, the internal name conversion is not performed and the configuration will not operate properly.

    4. Place WBTRLOCL.DLL from step 3 in a directory that is accessible by MS Windows.
    5. In the NOVDB.INI file in the Windows directory, add the line:
      local=yes
      to the [brequestDPMI] paragraph.
  5. MS Windows apps using the requester while running DOS applications with the DOS requester, BREQUEST.EXE

    When using the MS Windows Btrieve requester DLL, BREQUEST.EXE is loaded before going into MS Windows. When DOS applications that will be accessing the requester are run in MS Windows DOS sessions, BREQUEST.EXE must be loaded in the DOS session. This situation creates a conflict when both run simultaneously; when BREQUEST.EXE tries to load in the DOS session, the message "Brequest already loaded" is generated.

    To resolve this situation, BREQUEST.EXE v6.0 and later have implemented a new load parameter, "/L." "BREQUEST /L" makes it possible to load BREQUEST.EXE again in an MS Windows DOS session even though it was already loaded before starting MS Windows. This command loads another instance of Brequest that is only available to the DOS session. Thus, the DOS session has its own copy.

    To configure the workstation for this operating environment, BREQUEST.EXE should be loaded as usual before starting MS Windows and then in each DOS session that will be running a Btrieve application, "BREQUEST /L" should be loaded. MS Windows applications will run as described previously.

  6. MS Windows apps using the requester while running DOS applications using the local engine, BTRIEVE.EXE

    While using the MS Windows Btrieve requester, DOS applications in MS Windows DOS sessions may want to simultaneously use BTRIEVE.EXE. This situation also presents a problem, since BREQUEST.EXE must be loaded before MS Windows for use with the MS Windows requester DLL, and BTRIEVE.EXE must be loaded in each MS Windows DOS session. If you do not resolve this conflict, BTRIEVE.EXE reports, "Btrieve already loaded," and BTRIEVE.EXE will not load.

    BTRIEVE.EXE does not have a special load option like the BREQUEST.EXE "/L" parameter.

    To enable this configuration, load BREQUEST.EXE before MS Windows by using the WINSTART.BAT file feature provided by MS Windows. WINSTART.BAT is a batch file that MS Windows runs automatically when it is started in 386 enhanced mode. The programs that are started from within the WINSTART.BAT file are loaded in enhanced mode and are available to MS Windows applications, but not to DOS sessions started in MS Windows. If Brequest is loaded in WINSTART.BAT, BTRIEVE.EXE can then be loaded in a DOS session.

    To load BREQUEST.EXE in this manner, create the WINSTART.BAT file in the MS Windows directory and add a line specifying the BREQUEST.EXE program name followed by the parameters that your application requires for Brequest. For example:
    BREQUEST /d:8192
    The only drawback to this solution is that MS Windows v3.1 may sometimes hang on exit if TSRs are loaded with the WINSTART.BAT file. So, if the chance of hanging on exit from MS Windows must be prevented, or if you need to run MS Windows in standard mode, this configuration is not an option.

Stay Up-To-Date

The latest Btrieve requesters, WNDBCNVT.EXE, and a sample NOVDB.INI are posted on CompuServe in NOVLIB, Library 1, in the file BTRREQ.EXE. After 30 days without an update this file will be moved to Library 7.

In addition, the latest patches for the current local Btrieve engines (BTRIEVE.EXE v5.10a and WBTRCALL.DLL v5.10) are available on CompuServe in NOVLIB, Library 7, in the file BTR510.EXE. These files can also be requested by mail by contacting Novell Developer Support.


DEVELOPER NEWS:

New UnixWare 1.1 Release Responds to Customer Needs

Novell recently announced the release of UnixWare 1.1, the newest version of its enterprise system software. UnixWare 1.1 enhancements include quality and performance improvements, new features, and aggressive pricing. Novell also annunced that all purchasers of UnixWare 1.0 products may order free upgrades to UnixWare 1.1.

Benefits

  • Improved quality and performance accross the entire family of UnixWare products.

    Extensive testing and customer feedback have gone into making this release of UnixWare more robust and stable. Existing UnixWare 1.0 customers will find it very worthwhile to upgrade to UnixWare 1.1.

  • Additional support for European languages.

    Along with support for English and Japanese, UnixWare will have native versions in French, Italian, German and Spanish by Q2 1994.

  • Additional support for popular low-cost PC hardware.

    Supported hardware includes video cards, CD-ROM drives, Ethernet cards and SCSI cards. Support for this hardware will make it even easier for users to configure their system of choice.

  • An aggressively priced and feature-rich SoftWare Developement Kit (SDK).

This new SDK will be very popular with ISVs and corporate developers. The new SDK offers the complete set of UnixWare development tools for a suggested retail price of US $99.00. When combined with the UnixWare Personal Edition, this is the most cost-effective UNIX development environment in the industry.

Features

Here are some of the features highlights of this new release: UnixWare Personal Edition and UnixWare Application Server
  • Bundled TCP/IP including PPP and SNMP.
  • Motif v1.2 and Motif Windowing Korn Shell (wkSh) for greater Common Desktop Environment (CDE) compliance.
  • Support for NetWare 4.x.
  • Support for third-party compilers without the need to purchase the SDK.
  • UnixWare Software Development Kit
  • Motif Development Tools, Driver Development Tools and Personal Utilities are now bundled with the SDK to create a more complete and streamlined development environment.
  • Bundled Pentium compiler that boosts performance for recompiled Intel 80486 applications as well as new Pentium applications.
  • Complete online documentation; hardcopy manuals will now be a separate product.

Repackaged Products

The UnixWare network install products (P/N 92000041 and 92000091) will be repackaged as standard network install capability included with the CD-ROM and QIC tape versions of the Personal Edition and Application Server products.

The UnixWare Advanced Merge for MS Windows (P/N 90000061) product is now bundled in the Personal Edition and Application Server products.

The Personal Utilities (P/N 98000031 and 97000041), MTF Development Tools (P/N 96000042), and Driver Development Tools (P/N 96000032) are now bundled into the lower cost UnixWare SDK and Personal Utilities 1.1.

Availability, Pricing & Upgrades

UnixWare 1.1 will begin shipping in January. See the Novell Bulletin, January 1993 for suggested list prices of UnixWare products.

Free upgrades from UnixWare 1.0 to UnixWare 1.1 are also available to the installed base. To upgrade, call one of the phone numbers listed in Figure 4. Please be prepared to provide your old UnixWare product serial numbers or proof of purchase.

FIGURE 4: Telephone & fax numbers for UnixWare 1.1 upgrades by country

Location            Telephone           Fax
Austria             0660-8443           0660-8125
Belgium             078-111062               078-111061
Canada              317-364-7276        317-364-0787
Denmark             800-10930           800-10545
France              05-905995           05-905996
Germany             0130-812444              0130-812443
Italy                    1678-8388           1678-78398
Norway              050-11310           050-11309
Spain                    900-993170               900-993169
Sweden              020-795736               020-795735
Switzerland              155-1846            155-1847
United Kingdom      0800-960274              0800-960273
United States       800-457-1767        317-364-0787
All Others               +31-55-434472       +31-55-434435
END of FIGURE 4

TECHNICAL INSIGHTS:

Running MS Windows Apps in WIN-OS2 (NetWare OS/2 SDK v2.0)

Support for MS Windows applications in WIN-OS2 under OS/2 2.x is limited to standard mode applications only. Attempting to start an MS Windows application in enhanced mode causes a general protection fault (GPF) in NWIPXSPX.DLL.

To use MS Windows apps in WIN-OS2 with the current version of the NetWare Requester for OS/2 (2.01), the WIN-OS2 session must be configured to run in Standard Mode. You should also set the "NETWARE_RESOURCES" setting to "private."

Finally, you also must load TBMI2 so that IPX resources can be shared. The easiest way to do this is to create an AUTOEXEC file that is executed when the WIN-OS2 session starts up. This file will load NETX and TBMI2 before starting WINOS2.EXE. The standard mode setting is checked through the WIN-OS2 Settings option in the "Settings" system menu option for the icon.

Comparing NetWare 3.11 & 3.12 Binderies (NetWare v3.12)

The binderies on NetWare v3.11 and v3.12 are essentially identical. This compatibility allows you to even exchange the bindery files between servers (e.g. with backups) or restore *.OLD bindery files from v3.11 with BINDREST.EXE onto NetWare v3.12.

However, unlike NetWare v3.11, the v3.12 OS will not allow you to change certain some existing standard bindery properties to have non-standard features.

For example, if you try to change the user property, "SECURITY_EQUALS" from access security "Object read, Supervisor write" to "Object read, Object write," NetWare v3.12 returns the error message:
0xF1 (241): Invalid Bindery Security
and does not complete the operation.

NetWare v4.01 bindery emulation is even more restrictive in this situation. NetWare v4.01 does not allow you to:

  • Change some existing standard bindery properties to have non-standard features (as in the example above)
  • Create certain standard bindery properties
For example, attempts to create properties HOME_DIRECTORY or MISC_LOGIN_INFO result in a successful completion status, but the properties are not created and cannot be used in bindery calls. When trying to add values to these properties, NetWare v4.01 returns error 0xFF (255) or 0xFB (251).

DPMS_M_RELOC() Returns Status 8021h (DOS Protected Mode Services v1.0)

The DPMS_M_RELOC() function relocates real mode segment of memory to extended memory. The size of that segment minus one byte is passed to the call in the CX register. Then, a pointer to the real mode segment to move into extended memory is passed to the call in the ES:SI register.

If the offset value passed in SI + CX is greater than the length of the extended segment allocated to the selector passed in BX, then the DPMS.EXE returns status 8021h (Invalid Value) in the AX register.

This status can be a problem when the real mode code and the relocatable code are in the same data or code segment. For example, if you have five bytes of real mode data and 0100h bytes of data to be relocated to extended memory, but both are in the same data segment:
SI=0005h and CX=0101h
Then, the size of the extended memory allocated to the selector (in the BX register) must be 0105h bytes, even though the call is moving 0100h bytes.

To avoid invalid values in the AX register, make sure the length of the extended segment is large enough to accomadate the offset passed in SI + CX (the length of the segment of code to be moved).

Client SDK Documentation Errors (NetWare Client SDK v1.0d)

The NetWare Client SDK v1.0d contains documentation errors in descriptions of the following APIs:
  • NWScanOpenFilesByConn2()
  • NWSendBroadcastMessage()
  • NWDownFileServer()
  • Date & Time Conversion APIs

NWScanOpenFilesByConn2() Version Compatibility

The documentation for NWScanOpen-FilesByConn2() incorrectly states that it is for NetWare 2.2 only. Actually, this function is available for NetWare versions 2.2, 3.11, and 4.01

NWSendBroadcastMessage() Broadcast Message Size

The documentation for NWSendBroad-castMessage() specifies that a broadcast message can have a size of 1 to 254 bytes for NetWare 3.11c and later versions. It also states that for NetWare 3.11c and later that the maximum number of connections to which it can broadcast is 62.

All of the references in this portion of the documentation to NetWare 3.11c should be changed to NetWare 3.11 (there is no NetWare 3.11c). Also, the maximum number of connections that can be specified for a single broadcast for NetWare 3.11 and later is 65 rather than 62.

NWDownFileServer() & ForceFlag

The documentation for NWDownFile-Server() incorrectly says that if the forceflag parameter is set to 0xff, it will force the file server to shutdown even if there are open files. Actually, this situation will only result if the forceflag parameter is set to zero. If forceflag is set to 0xff, and if any files are in use or open, NWDownFileServer() will return 0x89ff and the server will not shutdown.

Date & Time Conversion APIs

The following date and time conversion APIs of the NetWare Client SDK are not documented in the v1.0d release:
  • NWConvertDate()
  • NWConvertTime()
  • NWConvertDateTime()
The prototypes for these APIs are in the NWMISC.H include file on lines 123, 124, and 119 respectively.

WATCOM v9.5 Usage of 8087 FPU Not Compatible with v9.0 (WATCOM 32 Bit C/C++ Compiler v9.5)

The WATCOM 32-bit C/C++ Compiler v9.5 usage of the 8087 FPU is incompatible with v9.0, unless you use either the "/fpr" or "/fpc" options. Version 9.0 left just four registers of the 8087 FPU empty on entry to a routine. Version 9.5 assumes that the 8087 has eight empty registers. WATCOM made this change for Pentium optimization, but it impacts NetWare developers.

The "/fpr" option instructs v9.5 to use the old convention. A future version of WCC386 will add the "/fpr" option to the options turned on by "/bt=netware."

NLM SDK API Integer Format Function (NLM SDK v3.00)

The call to AppendToForm() under NWSNUT.NLM allows you to add a field to a form on the screen. The fData parameter contains the value to display. However, unless you give it an additional parameter, when the program is executed, the field is blank on the screen.

A format function must be provided as the fifth parameter to AppendToForm(). This function formats the value in fData that you wish to display. Figure 5 contains an example of AppendToForm() and a format function for an integer value of 4000.

FIGURE 5: AppendToForm() with format function for an integer value of 4000.

/* Before main(): */

void IntegerFieldFormat (FIELD *, BYTE *, LONG);

/* In main(): */

  BYTE fData[4]; /* for an integer field */
  *((int *)fData) = 4000;
  NWSAppendToForm (line, row, width, VNORMAL,
 IntegerFieldFormat,  /* field format function */
 NULL, NULL, NULL,
 fData,  /* field to be displayed */
 NULL, NORMAL_FIELD,
 M_INSERT|M_DELETE,
 0, handle);

/* After main(): */
void IntegerFieldFormat(FIELD *fieldPtr,
BYTE *buffer,
LONG bufLen)
{
    bufLen = bufLen;
    sprintf (buffer, "%d", *((int *)fieldPtr->fieldData));

}
END of FIGURE 5

Releasing Embedded SQL Connections (NetWare SQL v3.00d)

In an embedded SQL application, if you issue a COMMIT WORK RELEASE or ROLLBACK WORK RELEASE statement to disconnect from the database, NetWare SQL v3.00d returns a status 351 (A Transaction Has Not Yet Been Started) if the application is not currently in a transaction. NetWare SQL v3.00-3.00a returned a status 39 (End/Abort Transaction Error) instead of the status 351.

NetWare SQL v3.00d returns status 351 if implicit transaction tracking is disabled with the db_transaction_processing function, and no explicit transaction has been started with a START TRANSACTION statement.

To avoid the status 351 when implicit transactions are disabled, issue a START TRANSACTION statement immediately before the COMMIT WORK RELEASE or ROLLBACK WORK RELEASE. Alternatively, you can omit the RELEASE statement, and the embedded SQL application will automatically disconnect from the database when the application ends.

If the application needs to log out of one database and log into a different one, you can issue a CONNECT statement to the new database. Doing so will automatically logout the user from the original database.

Problems with TLI & Borland C++ for OS/2 (NetWare Client SDK v1.0d)

When linking any TLI application for OS/2 developed using the Borland C++ Compiler v1.0 for OS/2 and the NetWare Client SDK v1.0d, the following error message will be returned:

Fatal Linker Error:

THREAD fixup found in module
message.c in module TLI.LIB

The same application will compile and link sucessfully with the IBM CSET/2 or Microsoft C compilers. There is no supported solution at this time other than to switch compilers.

NetBIOS Emulator Does Not Support Multi-LAN Cards (NetBIOS for DOS v3.14)

Novell's current implementation of NetBIOS does not provide support for multiple LAN cards including both dedicated IPX and IPXODI.

Developers writing NetBIOS applications sometimes issue dummy commands to see how many LAN adapters are present. One way to check this number is to load up "filler" data and send a Network Control Block (NCB) to a specific LAN number. If the adapter in question is present, the error message returned is:

Invalid Command

If the adapter is not present, the network returns the error message:

Invalid LAN Adapter

Using Novell's NetBIOS emulator, only the "Invalid Command" error message is returned; that is, the network returns "Invalid Command" when you send data and an NCB to LAN Adapter 0, but the same error is returned when sending to LAN Adapter 1.

Some validation of NCBs takes place just after a request is made to NetBIOS. A check is made to make sure the LAN adapter number is 0 or 1. However, the emulator does not validate the existence of primary or secondary LAN adapters. The emulator just detects the presence of IPX, indicating there is a LAN card.

Under the Novell NetBIOS emulator, there is no way to detect the number of NetBIOS adapters present using NetBIOS calls. There will, however, always be only one adapter present.

One possible workaround is to check for IPX. If IPX is present, you can assume that the workstation is running Novell's NetBIOS and, therefore, the workstation has only one LAN adapter.

CloseScreen() & NetWare 4.01 (NLM SDK v3.0)

With the version of CLIB supplied with NetWare 4.01, calling CloseScreen() with a screen that is in use causes an server abend.

This situation has been resolved in the next release of CLIB. Until the new version is released, a version of CLIB that prevents the abend is available. To request a copy, contact Novell Developer Support at 1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.

NWSendConsoleBroadcast() Sends Blank Message (NetWare Client SDK v1.0d)

With the NetWare Client SDK v1.0d, NWSendConsoleBroadcast() broadcasts a blank message if issued for a NetWare v3.11 server. The function works correctly if issued for a NetWare v4.01 server.

Novell Engineering is currently investigating the problem. There is no solution at this time, but as a workaround, use the function, NWSendBroadcastMessage(), which works correctly.

Linker Errors with NWSNUT.IMP (NLM SDK v3.0)

The version of NWSNUT.IMP that shipped with the NLM SDK v3.0 is missing commas following the declarations of the following four functions:
  • NWSGetHandleCustomData()
  • NWSSetHandleCustomData()
  • NWSSetFormNoWrap()
  • NWSWaitForEscapeOrCancel()
Without these commas, linker errors result. To resolve the errors, edit the NWSNUT.IMP import file and add a comma after each declaration.

Incorrect Header File Definitions (NetWare Client SDK v1.0d)

In the Client SDK, two header files define the constants, SOCKET_NOT_OPEN and SOCKET_ALREADY_OPEN, with different values in two separate header files.

NWERROR.H incorrectly defines SOCKET_NOT_OPEN as 0x8852 and SOCKET_ALREADY_OPEN as 0x89FF, but NXTW.H defines both SOCKET_NOT_OPEN and SOCKET_ALREADY_OPEN correctly as the value, 0xFF.

When developing an MS Windows application, either remove these two definitions from NWERROR.H, or be sure to always include NWIPXSPX.H after including NWCALLS.H so that the second set of define statements is the correct one.

When developing a DOS application, you must define these two constants, since they are not included in any of the DOS header files.

t_rcvconnect() Blocks Even in Nonblocking Mode (NetWare Client SDK v1.0d)

When you call the TLI function t_rcvconnect() using the MS Windows DLLs included with the NetWare Client SDK v1.0d, the function will block even if the endpoint is in nonblocking mode.

Novell is investigating the cause, but there is no solution at this time.

Fetching Records with SQL-Level Calls (NetWare SQL v3.00)

Fetching records in a NetWare SQL application using SQL-Level functions can be done in two ways: the returned data can be formatted or unformatted. Using the iASCIIFlag parameter of the XQLFetch function, you tell NetWare SQL to return data in its internal format (as it is stored in the Btrieve data file), or already formatted according to any masks specified in the view.

The first Pascal example in Figure 6 fetches unformatted data from the "Appointments" table based on the view created with the statement:

SELECT ID, Appointment^Date, Doctor
  FROM Appointments
The second Pascal esample in Figure 6 extracts fromatted data from the same view. Notice that the data buffer now just consists of a 32-byte character string.

This will accommodate the 6-character ID, the 8-character "Appoinment Date" formatted according to the default mask of mm/dd/yy, and the 12-character "Doctor" name. Each field will have two spaces after it, since iSpacing = 2. Therefore, each record will require (6+2) + (8+2) + (12+2) = 32 characters.

Using the iASCIIFlag to return formatted data (as shown in the second example in Figture 5) is especially useful when fetching data types that are not supported by your particular compiler. For example, the "Money" type is based on a COBOL packed decimal. If a C or Pascal program is used to fetch "Money" data, it can not display it without manually interpreting the values in each byte, or using the XQLConvert function to convert the internal data to a displayable string. On the other hand, if you want your program to be able to manipulate numeric data, you would want to fetch it in internal format, rather than formatted.

FIGURE 6: Two Fetch routines

Method 1:
{ To fetch unformatted data }
.
.
.
*PROCEDURE FetchRecords (CursorID : Integer);
VAR
  bDataBuf : ARRAY [1..MaxRecs] OF RECORD
               reclen  : integer;
               ID      : ARRAY [1..6] OF char;
               AppDate : RECORD
                           day, month : byte;
                           year : integer
                         END;
               Doctor  : ARRAY [1..12] OF char
             END;
  iStatus, iOption, iBufLen, iASCIIFlag, iSpacing, i : integer;
  lCount : longint;
BEGIN
  iOption    := 1;        { Fetch first records in view }
  iASCIIFlag := 0;        { return data in internal format }
  iSpacing   := 0;
  REPEAT
    lCount  := MaxRecs;   { How many records to fetch }
    iBufLen := SizeOf(bDataBuf);
    iStatus := XQLFetch (CursorID, iOption, iBufLen, bDataBuf, lCount,
                         iASCIIFlag, iSpacing);
    IF iStatus > 0
      THEN writeln('Error on XQLFetch; status = ', iStatus)
      ELSE BEGIN
             FOR i := 1 to lCount DO       { For each record returned }
               BEGIN
                 write('Record #', i:2, ':  ');
                 write(bDataBuf[i].ID, '  ');  { display ID }
                 WITH bDataBuf[i].AppDate DO   { display Appoint. Date }
                   write(month:1, '/', day:1, '/', year:1);
                 writeln('  ', bDataBuf[i].Doctor)  { display Dr. name }
               END;
             iOption := 2 { Change option to fetch next record in view }
           END;
  UNTIL Status <> 0
END;
Method 2:
{ To Fetch data already formatted, the program can be changed as
follows: }
*PROCEDURE FetchRecords (CursorID : Integer);
VAR
  bDataBuf : ARRAY [1..MaxRecs] OF RECORD
                                     reclen : integer;
                                     data   : ARRAY [1..32] OF char
                                   END;
  iStatus, iOption, iBufLen, iASCIIFlag, iSpacing, i : integer;
  lCount : longint;
BEGIN
  iOption    := 1; { Fetch first records in view }
  iASCIIFlag := 1; { return formatted data, fields separated by spaces }
  iSpacing   := 2;    { two spaces between fields
  REPEAT
    lCount  := MaxRecs;   { How many records to fetch }
    iBufLen := SizeOf(bDataBuf);
    iStatus := XQLFetch (CursorID, iOption, iBufLen, bDataBuf, lCount,
                         iASCIIFlag, iSpacing);
    IF iStatus > 0
      THEN writeln('Error on XQLFetch; status = ', iStatus)
      ELSE BEGIN
             FOR i := 1 to lCount DO       { For each record returned }
               BEGIN
                 write('Record #', i:2, ':  ');
                 writeln(bDataBuf[1].data);      { display all fields }
               END;
             iOption := 2 { Change option to fetch next record in view }
           END;
  UNTIL Status <> 0

END;
END of FIGURE 6

Ascending Order & Autoincrement Keys (Btrieve for DOS v5.10a)

Btrieve returns a status 5 (Duplicate Key Value) when you attempt to insert a record with an autoincrement field value of zero. Btrieve returns this status code when the autoincrement key has the descending attribute set. Then, when the insert is executed, Btrieve finds the highest value for the autoincrement key equal to "1" and increments it by one to get "2." Since the value "2" already exists in the file, Btrieve returns the duplicate key value error.

Autoincrement keys should always be defined as Ascending.

Accessing Named Pipes Through UNC File Names (NetWare OS/2 SDK v2.0)

From within an application, a named pipe is accessed through the use of the Universal Naming Convention (UNC) file naming convention:

\\servername\pipe\pipename

Communications with a named pipe can also be established from the OS/2 command line with the copy or type commands and the UNC file name of the pipe. For example:

copy autoexec.bat \\myserver\pipe\mypipe

This command will also work from DOS sessions running under OS/2. In both cases, the target device can be either a named pipe or a NetWare volume specification. Specifically, the UNC specification for a NetWare volume:

\\servername\volname\path

will also work as a target device from OS/2 or DOS VDM copy commands.

The MS-DOS v5.0 COMMAND.COM file does not support UNC filename conventions for either NetWare volumes or Named Pipes. To access Named Pipes from a DOS machine, you must create an application that uses the DOS file commands (i.e., that issues int 21s) to copy to Named Pipes.

NetWare SQL Reject Counts (NetWare SQL v3.00x)

When fetching records with NetWare SQL, the reject count returned by NetWare SQL may not reflect the actual number of records in the database that did not match the view restrictions.

This discrepancy is due to the fact that NetWare SQL issues Btrieve extended calls with filters, causing Btrieve to only return records that match the filter. The reject count reflects the number of records that Btrieve returned to NetWare SQL for processing which were rejected by NetWare SQL as not meeting the view criteria.

Sometimes, NetWare SQL may return a reject count of zero, even though there are records in the file that are not returned. This reject count indicates that Btrieve filtered out the necessary records, and all data given to NetWare SQL by Btrieve matched the view restrictions.

At other times, NetWare SQL may return a reject count of one, which usually means that NetWare SQL issued a Btrieve Get First or Step First operation to establish positioning, then rejected that record for not matching the view restrictions, and finally issued the Btrieve extended calls with filters.

The types of restrictions on the view determine the types of filters that can be specified in the Btrieve extended calls. Some combinations of restrictions can be entirely filtered by Btrieve, while others can only be partially filtered by Btrieve, leaving NetWare SQL to do the rest of the processing.


NIBBLES AND BITS

Fast Answers to Common Questions

NetWare Client SDK

Q - How can I determine the maximum IPX/SPX packet size that can be used on an OS/2 Workstation?

A - The recommended maximum packet size for any particular workstation is 576 bytes. This is based on the minimum size guaranteed to be available across any given route on a network. In many cases, the actual packet size is larger, since it is based on the architecture of the NIC (network interface cards) in use. IPX for DOS and MS Windows includes an API called IpxGetMaxPacketSize() that allows the determination of the maximum packet that a particular workstation can send. This call is not available under OS/2.

An undocumented API in IPX for OS/2 that communicates with the NIC called IpxRequest() can be used to obtain the packet size for a workstation. IpxRequest() code 0x28 returns the board length for the card addressed. The syntax is:

ret = IpxRequest(USHORT command, VOID FAR *buffer);

where command is 0x428 and buffer contains an unsigned integer identifying the card to address. The card numbers are zero-based and "-1" is used for the primary NIC. An example for IpxGetMaxPacketSize() is posted on NOVDEV (NDEVSUPP, Library 1, IPXMAX.C).

Q - How can I find all of the Directory Service (DS) Trees advertising on the network?

A - Use the QueryService() API to locate the nearest Directory Service tree. It is advertised as Server Type 0x0278. To locate all DS trees, issue a general service query.

Q - When my code calls EndDiagnostics() after BeginDiagnostics() has failed, subsequent BeginDiagnostics() calls fail. What should I do?

A - To avoid this problem, do not call EndDiagnostics() when BeginDiagnostics() has failed.

NETWARE.DRV

Q - What version of NETWARE.DRV should I be running?

A - If you are using NETX.COM, you should be using NETWARE.DRV v2.02 (dated 10-27-92, file size of 126,144 bytes). This file is available in WINUP8.EXE from the NOVFILES forum. If you are using the VLMs, the correct NETWARE.DRV is v3.01 (dated 3-30-93, file size of 196,672 bytes). This file is contained in WSWIN.EXE in the CLIENT.KIT subdirectory of NOVFILES. This later version of NETWARE.DRV is intended for VLMs only and is not compatible with NETX.COM.

DOS Protected Mode Services

Q - What is the largest segment of code that can be relocated at one time by the DPMS_M_RELOC() function at one time ?

A - The DPMS_M_RELOC() function requires the size of the segment to be moved to be passed in the CX register minus one byte. Thus, the largest segment of code that can be moved into extended memory one call is 65535 bytes. The extended registers are not used by this call.

NetWare Btrieve

Q - When the primary server with NetWare SFT III goes down and resynchronization is taking place, NetWare Btrieve returns a status 95 (Session Not Valid). and NetWare SQL returns status 2103 (NW$SQL is Not Active on the Requested Server). What should I do?

A - Raise the IPX retry count in your NET.CFG. The recommended value is 40 or more. The workstations are timing out and their SPX connections are being terminated.

Q - When moving from the NetWare Btrieve NLM v5.x to the NetWare Btrieve NLM v6.x, do I have to convert the 5.x files to a 6.x format?

A - The NetWare Btrieve NLM v6.10x has built in support for v5.x files. System administrators can choose whether or not to convert the Btrieve data files in order to upgrade the NLM to 6.10x. As always, read the README that comes with Btrieve for up to date directions on moving from one version to the next.

Q - What does the error "BSPXCOM -Bad Connection ID on send" mean?

A - Btrieve has sent a message to a workstation that has been timed out by the NetWare watchdog.

To prevent the message, increase the SPX WATCHDOG ABORT TIMEOUT, SPX ACK WAIT TIMEOUT, and SPX WATCHDOG VERIFY TIMEOUT parameters on the server where BSPXCOM.NLM is loaded. Also increase the SPX ABORT TIMEOUT, SPX LISTEN TIMEOUT, and SPX VERIFY TIMEOUT parameters in the NET.CFG file on the workstation.

Q - Once I have used the NetWare Btrieve NLM v6.10x can I switch back to Btrieve for DOS, Btrieve for OS/2, or Btrieve for Windows?

A - If your system requires that the files be available for both NLM and client use, there are several steps to take to insure the proper use of the file:

  • Do not convert the 5.x files to the 6.x format. The versions of Btrieve for DOS, MS Windows, and OS/2 do not support the v6.x file format.
  • Read the section of the Btrieve v6.10 README file that gives instructions on preimage files. Btrieve v5.x and v6.x pre-image files are incompatible and you need to take steps to prevent the different versions of the engines from using different version of the pre-image file.
  • When using BSETUP, be sure to select the option that creates files in the 5.x format. If this option is not used all files that are created will be in the new 6.x format and the clients will return status 2s when trying to access them.

Xtrieve PLUS

Q - What are the valid characters for dictionary names?

A - Valid characters for dictionary names are:

  • a through z
  • A through Z
  • 0 through 9
  • ^ (caret)
  • _ (underscore)
  • ~ (tilde
  • blank space
If you have the NetWare SQL Developer Kit v3.00, a list of the valid characters can be found on page 1-16 of the "Getting Started" manual.

Q - What patches are available for Xtrieve PLUS?

A - Four patch files for Xtrieve PLUS are available on Novell's NOVDEV forum on CompuServe:

  • XTRDOS.EXE - patches for Xtrieve PLUS for DOS, v4.10 and v4.11
  • XTROS2.EXE - patches for Xtrieve PLUS for OS/2, v4.11
  • XTRNWS.EXE - patches for Xtrieve PLUS for NetWare SQL, v4.11 contains patches for both the DOS and OS/2 versions of Xtrieve PLUS that shipped with NetWare SQL v3.0.
  • XTR401.EXE - patches for Xtrieve PLUS for DOS & OS/2, v4.01x
These files are self-extracting, and each includes a document file describing the patch process and the problems fixed by the patches. These patches are also available from Novell Developer Support.

TIP: The XTRPATH environment variable can be used to tell Xtrieve PLUS where your data files are located. This can be set before getting into Xtrieve PLUS or from the Configure/ Environment menu option in Xtrieve PLUS. For example:

SET XTRPATH=F:\DATA;G:\FILES

tells Xtrieve PLUS to search for data files in the F:\DATA directory, and if they are not found, to search the G:\FILES directory.


DEVELOPER EDUCATION:

Available Novell Developer Education Courses

Novell Developer Education offers several courses for developers who use Novell's development & database tools, including NetWare SQL, Btrieve, Xtrieve PLUS, and the NetWare Client APIs.
904 - Btrieve: An Overview
905 - Programming with Btrieve
907 - Xtrieve PLUS
911 - NetWare Database Administrator
912 - Programming with NetWare SQL
930 - Developing NetWare Loadable Modules (NLMs)
940 - NetWare Programming: Basic Services
945 - NetWare Programming: Protocol Support
To obtain information on pricing, location, scheduling, & course content for classes held in the US, call 1-800-233-3382, 1-801-429-5508 or 1-800-NETWARE. For information on classes outside of the US, contact your local Novell office.

CURRENT PATCHES FOR NOVELL DEVELOPMENT TOOLS

The latest NetWare drivers, example code for NetWare API development tools, OS/2 requester patches, and patches for Novell's database products are available on Novell's NetWire forum on CompuServe. New information is first stored in NOVLIB library 1, and moved to library 7 after a period of 30 days. If you do not have access to CompuServe, request these files from Novell's Developer Support Group at 1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.

When calling, be ready to provide a shipping address, disk preference (5.25", 3.5", HD, or DD) and, if you prefer overnight delivery, your company's Federal Express account number. If you do not provide a Federal Express account number, the patch disk will be sent to you via regular mail.

Novell Professional Developers' Program members can obtain updated NetWare API SDK components from Novell's NOVDEV forum on CompuServe. For more information on Novell developer programs contact Novell at 1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.

Novell Developer Relations Automated Fax System

A document describing available patches and other files and their location on CompuServe is available through Novell Developer Relations Automated Fax System (AFS). This system can provide you other useful information as well.

To use the AFS, call 1-800-RED-WORD (1-800-733-9673) or 512- 794-1796 from a touchtone phone. Then, choose the option for the Automated Fax System, select the documents you wish to receive, and supply your fax number (the fax number to which you want the document(s) sent). Document #7805 describes the patches. Document #1 lists all other documents available through the Automated Fax System. Up to five documents can be requested per call.


CONTACTING NOVELL

Developer Support

Developers in the U.S. and Canada may contact Novell Developer Support via telephone, fax, BBS or electronic mail via CompuServe, MHS or the Internet.

Voice

For both presales and postsales support, call Novell Developer Support between 8:00 a.m. and 5:00 p.m. Mountain Time at 1-801-429-5588. Many calls to Novell Developer Support are passed to a software support engineer immediately. Calls to Novell Developer Support generally will be acknowledged or answered within four hours.

Fax

If you prefer, you may contact Novell Developer Support via fax at 1-801-429-2990. Faxed questions are acknowledged or answered within 24 hours.

Developer BBS

If you do not have access to either CompuServe or the Internet, send test cases to our BBS. Set your communication software to N-8-1 and call 1-801-429-5836.

E-mail: CompuServe

Post your messages in the appropriate section addressed to Novell at 76701,171. These messages will receive a response within 24 hours.

E-mail: MHS

You may direct your questions and comments to Novell Developer Support via Novell's Message Handling Service E-mail facility. Address your messages to devsup@novell. These messages will receive a response within 24 hours.

E-mail: Internet (SMTP)

An alternative method of contacting Novell Developer Support is through the Internet E-mail system. Send your messages to devsup@novell.com. These messages will receive a response within 24 hours.

NetWire on CompuServe

Novell's NetWire forum is open to all registered CompuServe subscribers. Through the NDEVSUP forum, professional developers writing applications with Novell development tools can gain access to information specific to Novell development. Support, patches, periodicals and product information, as well as information on all of the programs and services provided for Novell developers are accessible through this forum. Post your messages in the appropriate section addressed to Novell at 76701,171. Technical questions will be acknowledged or answered by Novell Developer Support within 24 hours.

Novell Products and SDKs

Novell products on the "Currently Shipping Developer Products" list (see page 15 of this issue), including the Red Box Products, are available to Novell Professional Developer's Program members. Call 1-800-RED-WORD (1-800-733-9673) or 1-303-894-4135 to order these products or to receive additional information. To order other Red Box Products not listed, contact your local Novell office or Novell Authorized Reseller.

DeveloperNet Labs

For information on DeveloperNet Labs development tools, education classes and product certification, in the U.S. and Canada call 1-800-453-1267 ext. 5544 or 1-801-429-5544, or call your local Novell office (see back cover of this issue).

Novell Developer Relations

Novell Professional Developers or those wishing to become members may contact Novell Developer Relations via telephone, fax, or electronic mail via Compuserve, MHS or the Internet.

Voice

For general information or questions on Novell Developer Relations programs, in the U.S. or Canada call 1-800-RED-WORD (1-800-733-9673). All others call 1-801-429-5281.

Fax

If you prefer, you may contact Novell Developer Relations via fax at 1-801-429-7207.

NetWire on CompuServe

Novell's NetWire forum is open to all registered Compuserve subscribers. Through the NDEVREL forum, Novell Professional Developer's Program-related issues or general questions may be posted. Through the NDEVINFO forum, customers who do not have products may post pre-sales product information questions on all Novell SDKs.

E-mail: MHS or Internet (SMTP)

You may direct your questions and comments to Novell Developer Relations via Novell's Message Handling Service E-mail facility. Address your messages to devprog@novell.com. Use the same address when going through the Internet E-mail system.

ACKNOWLEDGMENTS

Publisher: Mad Poarch
Editor: Kirk R. Humphries
Design: Creative Services, Provo
Articles: Chris Ojeda, Brenda Wallace
Developer News: USG ISV Marketing

Contributors: Linda Anderson, Jack Gumaer, Laura Heater, Sudz Khawaja, Nancy Kromar, Clint McVey, Chris Ojeda, Bill Prentice, Matt Pinsonneault, Jose Pruneda, Bob Quinlan, Drue Reeves, Wolfgang Schreiber, Michael Spano, Aslam Tejani, and Brenda Wallace

Special thanks to the Developer Support, Development, Developer Relations, Product Marketing, and Marketing Communications staff who contributed time and valuable input.

(c) 1993 Novell, Inc. All rights reserved.

Novell, the N design, NetWare, Btrieve, XQL and LANalyzer are registered trademarks; LAN WorlShop, NetWare SFT III, NetWare Loadable Module, NLM, Global MHS, NetWare MHS, NetWare System Calls for DOS, NetWare SQL, NetWare Btrieve, Report Executive, NetWare Asynchronous Services Interface (NASI), NetWare Management System, Xtrieve PLUS, DeveloperNet Labs, UnixWare, AppWare, AppWare Foundation, AppWare Loadable Module, ALM, AppWare Bus, Visual AppBuilder, IPX, and MacIPX are trademarks; and NetWire and Professional Developers' Program are service marks of Novell, Inc. IBM and OS/2 are registered trademarks, and NetBIOS and SAA are trademarks of International Business Machines Corporation. Microsoft is a registered trademark and Windows is a trademark of Microsoft Corporation. Apple and Macintosh are registered trademarks of Apple Computer, Inc. CompuServe is a registered trademark of CompuServe Corporation. Sun Microsystems and NFS are registered trademarks of Sun Microsystems, Inc. UNIX is a trademark of UNIX Systems Laboratories, Inc. in the USA and other countries. UNIX Systems Laboratories is a wholly-owned subsidiary of Novell, Inc. WATCOM is a registered trademarks of WATCOM Systems, Inc.