From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/nw/nwscript/drvstat.c | 268 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 private/nw/nwscript/drvstat.c (limited to 'private/nw/nwscript/drvstat.c') diff --git a/private/nw/nwscript/drvstat.c b/private/nw/nwscript/drvstat.c new file mode 100644 index 000000000..908359d79 --- /dev/null +++ b/private/nw/nwscript/drvstat.c @@ -0,0 +1,268 @@ + +/************************************************************************* +* +* 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; +} -- cgit v1.2.3