diff options
Diffstat (limited to '')
-rw-r--r-- | private/nw/nwscript/parspath.c | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/private/nw/nwscript/parspath.c b/private/nw/nwscript/parspath.c new file mode 100644 index 000000000..77f3a250c --- /dev/null +++ b/private/nw/nwscript/parspath.c @@ -0,0 +1,341 @@ + +/************************************************************************* +* +* PARSPATH.C +* +* NetWare parsing routines, ported from DOS +* +* Copyright (c) 1995 Microsoft Corporation +* +* $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\PARSPATH.C $ +* +* Rev 1.3 22 Jan 1996 16:48:38 terryt +* Add automatic attach query during map +* +* Rev 1.2 22 Dec 1995 14:26:16 terryt +* Add Microsoft headers +* +* Rev 1.1 22 Dec 1995 11:08:50 terryt +* Fixes +* +* Rev 1.0 15 Nov 1995 18:07:48 terryt +* Initial revision. +* +* Rev 1.1 25 Aug 1995 16:23:34 terryt +* Capture support +* +* Rev 1.0 15 May 1995 19:11:00 terryt +* Initial revision. +* +*************************************************************************/ + +/*++ + +Copyright (c) 1994 Micro Computer Systems, Inc. + +Module Name: + + nwlibs\parspath.c + +Abstract: + + Directory APIs. + +Author: + + Shawn Walker (v-swalk) 10-10-1994 + +Revision History: + +--*/ +#include "common.h" +#include <ctype.h> +#include <direct.h> +#include "inc\nwlibs.h" + + +/*++ +******************************************************************* + + ParsePath + +Routine Description: + + Parse the path string. + +Arguments: + + pPath = The pointer to the path to parse. + pServerName = The pointer to return the server name. + pVolumeName = The pointer to return the volume name. + pDirPath = The pointer to return the directory path. + +Return Value: + + 0x0000 SUCCESSFUL + 0x000F INVALID_DRIVE + 0x8800 Unknown error + +******************************************************************* +--*/ +unsigned int +ParsePath( + unsigned char *pPath, + unsigned char *pServerName, //OPTIONAL + unsigned char *pVolumeName, //OPTIONAL + unsigned char *pDirPath //OPTIONAL + ) +{ + unsigned char *p, *p2; + unsigned int Result; + unsigned int Remote; + unsigned int NcpError = 0; + unsigned char DriveNumber = (unsigned char)-1; + unsigned char CurrentPath[64]; + unsigned char RootPath[NCP_MAX_PATH_LENGTH]; + unsigned char ServerName[NCP_MAX_PATH_LENGTH]; + unsigned char *pRootDir; + unsigned char NetWarePath[NCP_MAX_PATH_LENGTH]; + unsigned char VolumeName[NCP_VOLUME_LENGTH]; + unsigned int LocalDriveForce = FALSE; + + RootPath[0] = 0; + VolumeName[0] = 0; + ServerName[0] = 0; + + if ( pServerName ) + *pServerName = '\0'; + + /** See if there is a volume on the path **/ + + p = pPath; + while (*p != ':' && *p) { + p++; + } + + if (*p == ':') { + *p = 0; + + /** + Check to see if this is a drive letter. The volume must + be 2 characters or more. + **/ + + if ((p - pPath) == 1) { + + /** Make sure it is a valid alpha char **/ + + if (!isalpha((int) *pPath)) { + return 0x000F; + } + + *pPath = (unsigned char) toupper((int) *pPath); + + /** Make it a drive number **/ + + DriveNumber = (unsigned char) (*pPath - 'A'); + GetDriveStatus ((unsigned short)(DriveNumber+1), + NETWARE_FORMAT_SERVER_VOLUME, + NULL, + NULL, + RootPath, + NULL, + NULL); + pRootDir = strchr (RootPath, ':'); + if (pRootDir) + { + /* + * Setup the pServerName here + */ + + pRootDir[0] = '\0'; + p2 = RootPath; + while (*p2) + { + if (*p2 == '\\' || *p2 == '/') + { + *p2++ = 0; + strcpy(ServerName, RootPath); + if (pServerName) { + strcpy(pServerName, RootPath); + } + break; + } + p2++; + } + strcpy (RootPath, pRootDir+1); + } + else + RootPath[0] = 0; + } + else { + + DriveNumber = 0; + LocalDriveForce = TRUE; + + /** + If there is a server name, save the server name + and set the error code to 0x880F but still parse + the path. This just means that there is no connection + for this server. Even if we do have one. + **/ + + p2 = pPath; + while (*p2) { + if (*p2 == '\\' || *p2 == '/') { + *p2++ = 0; + + strcpy(ServerName, pPath); + if (pServerName) { + strcpy(pServerName, pPath); + } + pPath = p2; + + NcpError = 0x880F; + break; + } + p2++; + } + + if (NcpError == 0x880F) { + /** + Do any attach processing. + **/ + + NcpError = DoAttachProcessing( ServerName ); + + } + + strcpy(VolumeName, pPath); + } + + /** Get the directory **/ + + p++; + pPath = p; + } + + /** + If we did not get the drive letter of volume name + from above, then get the current drive we are on. + **/ + + if (DriveNumber == (unsigned char) -1) { + DriveNumber = _getdrive(); + } + + /* + * Use the PREFERRED_SERVER for 3X logins if no server name + * was specified. + */ + if (pServerName && !fNDS && !pServerName[0] ) { + strcpy( pServerName, PREFERRED_SERVER ); + } + + if (pVolumeName) { + + /** + Check if the drive is remote, if so, then go get the path + from the server. + **/ + if ( LocalDriveForce ) { + Result = 0; + Remote = 0; + } + else { + Result = IsDriveRemote(DriveNumber, &Remote); + + } + + if (NcpError != 0x880F && !VolumeName[0] && (Result || !Remote)) { + pVolumeName[0] = (unsigned char) (DriveNumber + 'A'); + pVolumeName[1] = 0; + } + else { + if (VolumeName[0]) { + strcpy(pVolumeName, VolumeName); + } + else { + Result = NTGetNWDrivePath( DriveNumber, NULL, NetWarePath ); + if (Result) { + return Result; + } + + p = NetWarePath; + while (*p != ':' && *p) { + p++; + } + + if (*p == ':') { + *p = 0; + } + strcpy(pVolumeName, NetWarePath); + } + } + } + + if (pDirPath) { + + memset(CurrentPath, 0, sizeof(CurrentPath)); + + if (VolumeName[0]) { + strcpy(pDirPath, pPath); + } + else { + Result = NTGetCurrentDirectory(DriveNumber, CurrentPath); + if (Result) { + CurrentPath[0] = 0; + } + else { + /* + * Skip the drive letter + */ + if ( CurrentPath[0] ) { + int i; + for ( i = 0; ;i++ ) { + CurrentPath[i] = CurrentPath[i+3]; + if ( !CurrentPath[i] ) + break; + } + } + } + + if (CurrentPath[0] == 0) { + if ( (*pPath == '\\') || ( *pPath == '/' ) ) { + sprintf(pDirPath, "%s%s", RootPath, pPath); + } + else if ( !(*pPath) ) { + sprintf(pDirPath, "%s", RootPath); + } + else { + sprintf(pDirPath, "%s\\%s", RootPath, pPath); + } + } + else { + if (*pPath) { + if ( (*pPath == '\\') || ( *pPath == '/' ) ) { + strcpy (pDirPath, RootPath); + if (pPath[1]) { + strcat(pDirPath, pPath); + } + } + else { + sprintf(pDirPath, "%s\\%s\\%s", RootPath, CurrentPath, pPath); + } + } + else { + sprintf(pDirPath, "%s\\%s", RootPath, CurrentPath); + } + } + } + + /** Convert the / in the path to \ **/ + for (p = pDirPath; ( p && ( *p != 0 ) ) ; p++) + { + if (*p == '/') + *p = '\\'; + } + } + + return NcpError; +} |