summaryrefslogtreecommitdiffstats
path: root/private/nw/nwscript/drvstat.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/nw/nwscript/drvstat.c
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/nw/nwscript/drvstat.c')
-rw-r--r--private/nw/nwscript/drvstat.c268
1 files changed, 268 insertions, 0 deletions
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;
+}