summaryrefslogblamecommitdiffstats
path: root/private/nw/nwscript/drvstat.c
blob: 908359d79d9cdd1da2e3c68a225ad24690324847 (plain) (tree)











































































































































































































































































                                                                                                           

/*************************************************************************
*
*  DRVSTAT.C
*
*  Drive status routines, ported from DOS
*
*  Copyright (c) 1995 Microsoft Corporation
*
*  $Log:   N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\DRVSTAT.C  $
*  
*     Rev 1.2   10 Apr 1996 14:22:20   terryt
*  Hotfix for 21181hq
*  
*     Rev 1.2   12 Mar 1996 19:53:36   terryt
*  Relative NDS names and merge
*  
*     Rev 1.1   22 Dec 1995 14:24:32   terryt
*  Add Microsoft headers
*  
*     Rev 1.0   15 Nov 1995 18:06:54   terryt
*  Initial revision.
*  
*     Rev 1.1   25 Aug 1995 16:22:44   terryt
*  Capture support
*  
*     Rev 1.0   15 May 1995 19:10:32   terryt
*  Initial revision.
*  
*************************************************************************/

/*++

Copyright (c) 1994  Micro Computer Systems, Inc.

Module Name:

    nwlibs\drvstat.c

Abstract:

    Directory APIs.

Author:

    Shawn Walker (v-swalk) 10-10-1994

Revision History:

--*/
#include "common.h"


/*++
*******************************************************************

        GetDriveStatus

Routine Description:

        Get the drive status.

Arguments:

        DriveNumber = The drive to number to use. (1=A,2=B,C=3,...)
        PathFormat = Format for the return path.
                        NW_FORMAT_NETWARE - volume:path
                        NW_FORMAT_SERVER_VOLUME - server\volume:path
                        NW_FORMAT_DRIVE - G:\path
                        NW_FORMAT_UNC - \\server\volume\path
        pStatus = A pointer to return the status of the drive.
        pConnectionHandle = A pointer to return the connection handle
                                for the drive.
        pRootPath = The pointer to return the base root path. OPTIONAL
        pRelativePath = The pointer to return the relative to root path.
        pFullPath = The pointer to return the full path.

Return Value:

        0x0000      SUCCESSFUL
        0x00FF      INVALID_DRIVE

*******************************************************************
--*/
unsigned int
GetDriveStatus(
    unsigned short  DriveNumber,
    unsigned short  PathFormat,
    unsigned short *pStatus,
    unsigned int   *pConnectionHandle,
    unsigned char  *pRootPath,
    unsigned char  *pRelativePath,
    unsigned char  *pFullPath
    )
{
    unsigned char     *p;
    unsigned int       Result;
    unsigned short     Status;
    unsigned char      Path[NCP_MAX_PATH_LENGTH + 1];
    unsigned char      WorkPath[NCP_MAX_PATH_LENGTH + 1];
    unsigned char      ServerName[NCP_SERVER_NAME_LENGTH + 1];

    /** Make sure the drive number is valid **/

    if (DriveNumber < 1 || DriveNumber > 32) {
        return 0x000F;      /* INVALID_DRIVE */
    }

    Status = 0;

    DriveNumber--;


    if (pConnectionHandle) {
        /* 
         *  This should never occur.
         */
        DisplayError (0xff, "GetDriveStatus");
        return 0xff;
    }

    /** Get the directory path from the server **/
    Result = NTGetNWDrivePath( DriveNumber, ServerName, Path );
    if ( Result ) {
        *Path = 0;
        *ServerName = 0;
    }

    /** Convert the / in the path to \ **/
    for (p = Path; *p != 0 ; p++)
    {
        if (*p == '/')
            *p = '\\';
    }

    /** Get the status of the drive if we need to **/
    Status = NTNetWareDriveStatus( DriveNumber );

    /** Get the status of the drive if we need to **/

    if (pStatus) {
        *pStatus = Status;
    }

    /** Get the full path if we need to **/

    if (pFullPath) {

        if (Status & NETWARE_LOCAL_FREE_DRIVE) {
            *pFullPath = 0;
        }
        else {
            strcpy(WorkPath, Path);

            /** Build the NetWare path format (volume:path) **/

            if (PathFormat == NETWARE_FORMAT_NETWARE) {
                strcpy(pFullPath, WorkPath);
            }

            /** Build the server volume path (server\volume:path) **/

            else if (PathFormat == NETWARE_FORMAT_SERVER_VOLUME) {
                sprintf(pFullPath, "%s\\%s", ServerName, WorkPath);
            }

            /** Build the drive path (G:\path) **/

            else if (PathFormat == NETWARE_FORMAT_DRIVE) {

                p = WorkPath;
                while (*p != ':' && *p) {
                    p++;
                }

                if (*p == ':') {
                    p++;
                }

                sprintf(pFullPath, "%c:\\%s", DriveNumber + 'A', p);
            }

            /** Build the UNC path (\\server\volume\path) **/

            else if (PathFormat == NETWARE_FORMAT_UNC) {

                p = WorkPath;
                while (*p != ':' && *p) {
                    p++;
                }

                if (*p == ':') {
                    *p = '\\';
                }

                sprintf(pFullPath, "\\\\%s\\%s", ServerName, WorkPath);
            }
        }
    }

    strcpy(WorkPath, Path);
    /*
     * Path does not have the relative path (current directory) in it.
     */

    /** Get the root path if we need to **/

    if (pRootPath) {

        if (Status & NETWARE_LOCAL_FREE_DRIVE) {
            *pRootPath = 0;
        }
        else {

            /** Build the NetWare root path format (volume:) **/

            if (PathFormat == NETWARE_FORMAT_NETWARE) {
                sprintf(pRootPath, strchr(WorkPath, ':')? "%s" : "%s:", WorkPath);
            }

            /** Build the server volume root path (server\volume:) **/

            else if (PathFormat == NETWARE_FORMAT_SERVER_VOLUME) {
                if ( fNDS && !_strcmpi( ServerName, NDSTREE) )
                    sprintf(pRootPath, strchr (WorkPath, ':')? "%s" : "%s:", WorkPath);
                else
                    sprintf(pRootPath, strchr (WorkPath, ':')? "%s\\%s" : "%s\\%s:", ServerName, WorkPath);
            }

            /** Build the drive root path (G:\) **/

            else if (PathFormat == NETWARE_FORMAT_DRIVE) {
                sprintf(pRootPath, "%c:\\", DriveNumber + 'A');
            }

            /** Build the UNC root path (\\server\volume) **/

            else if (PathFormat == NETWARE_FORMAT_UNC) {
                sprintf(pRootPath, "\\\\%s\\%s", ServerName, WorkPath);
            }
        }
    }

    /** Get the relative path if we need to **/

    if (pRelativePath) {

        if (Status & NETWARE_LOCAL_FREE_DRIVE) {
            *pRelativePath = 0;
        }
        else {
            int i;
            NTGetCurrentDirectory( (unsigned char)DriveNumber, pRelativePath );
            /* 
             * Skip the drive letter
             */
            if ( pRelativePath[0] ) {
                for ( i = 0; ;i++ ) {
                    pRelativePath[i] = pRelativePath[i+3];
                    if ( !pRelativePath[i] )
                        break;
                }
            }
        }
    }

    return 0x0000;
}