342 lines
8.6 KiB
C
342 lines
8.6 KiB
C
|
|
|||
|
/*************************************************************************
|
|||
|
*
|
|||
|
* 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 = (UCHAR) _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;
|
|||
|
}
|