diff options
author | vincentdarley <vincentdarley> | 2004-05-07 07:44:35 (GMT) |
---|---|---|
committer | vincentdarley <vincentdarley> | 2004-05-07 07:44:35 (GMT) |
commit | 8c5df5fda90a29c593793d69237f1f8cceb0e4c0 (patch) | |
tree | 15cbaaef673cb04fd761bfd3522c629aa2dc347b /generic/tclIOUtil.c | |
parent | fcc10d4dd68b2d659c7554f1d07781320a75a74b (diff) | |
download | tcl-8c5df5fda90a29c593793d69237f1f8cceb0e4c0.zip tcl-8c5df5fda90a29c593793d69237f1f8cceb0e4c0.tar.gz tcl-8c5df5fda90a29c593793d69237f1f8cceb0e4c0.tar.bz2 |
vfs glob root volume fix
Diffstat (limited to 'generic/tclIOUtil.c')
-rw-r--r-- | generic/tclIOUtil.c | 71 |
1 files changed, 60 insertions, 11 deletions
diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index f526d40..48621d8 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -17,7 +17,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIOUtil.c,v 1.101 2004/04/23 12:09:37 vincentdarley Exp $ + * RCS: @(#) $Id: tclIOUtil.c,v 1.102 2004/05/07 07:44:37 vincentdarley Exp $ */ #include "tclInt.h" @@ -3469,13 +3469,70 @@ TclGetPathType(pathPtr, filesystemPtrPtr, driveNameLengthPtr, driveNameRef) * the path, already with a * refCount for the caller. */ { - FilesystemRecord *fsRecPtr; int pathLen; char *path; - Tcl_PathType type = TCL_PATH_RELATIVE; + Tcl_PathType type; path = Tcl_GetStringFromObj(pathPtr, &pathLen); + type = TclFSNonnativePathType(path, pathLen, filesystemPtrPtr, + driveNameLengthPtr, driveNameRef); + + if (type != TCL_PATH_ABSOLUTE) { + type = TclpGetNativePathType(pathPtr, driveNameLengthPtr, + driveNameRef); + if ((type == TCL_PATH_ABSOLUTE) && (filesystemPtrPtr != NULL)) { + *filesystemPtrPtr = &tclNativeFilesystem; + } + } + return type; +} + +/* + *---------------------------------------------------------------------- + * + * TclFSNonnativePathType -- + * + * Helper function used by TclGetPathType. Its purpose is to + * check whether the given path starts with a string which + * corresponds to a file volume in any registered filesystem + * except the native one. For speed and historical reasons the + * native filesystem has special hard-coded checks dotted here + * and there in the filesystem code. + * + * Results: + * Returns one of TCL_PATH_ABSOLUTE or TCL_PATH_RELATIVE. + * The filesystem reference will be set if and only if it is + * non-NULL and the function's return value is TCL_PATH_ABSOLUTE. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +Tcl_PathType +TclFSNonnativePathType(path, pathLen, filesystemPtrPtr, + driveNameLengthPtr, driveNameRef) + CONST char *path; /* Path to determine type for */ + int pathLen; /* Length of the path */ + Tcl_Filesystem **filesystemPtrPtr; /* If absolute path and this is + * non-NULL, then set to the + * filesystem which claims this + * path */ + int *driveNameLengthPtr; /* If the path is absolute, and + * this is non-NULL, then set to + * the length of the driveName */ + Tcl_Obj **driveNameRef; /* If the path is absolute, and + * this is non-NULL, then set to + * the name of the drive, + * network-volume which contains + * the path, already with a + * refCount for the caller. */ +{ + FilesystemRecord *fsRecPtr; + Tcl_PathType type = TCL_PATH_RELATIVE; + /* * Call each of the "listVolumes" function in succession, checking * whether the given path is an absolute path on any of the volumes @@ -3557,14 +3614,6 @@ TclGetPathType(pathPtr, filesystemPtrPtr, driveNameLengthPtr, driveNameRef) } fsRecPtr = fsRecPtr->nextPtr; } - - if (type != TCL_PATH_ABSOLUTE) { - type = TclpGetNativePathType(pathPtr, driveNameLengthPtr, - driveNameRef); - if ((type == TCL_PATH_ABSOLUTE) && (filesystemPtrPtr != NULL)) { - *filesystemPtrPtr = &tclNativeFilesystem; - } - } return type; } |