|
|
/*************************************************************************
* * 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; }
|