diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2016-12-21 22:47:21 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2016-12-21 22:47:21 (GMT) |
commit | 5514e37335c012cc70f5b9aee3cedfe3d57f583f (patch) | |
tree | 4ba7d8aad13735e52f59bdce7ca5ba3151ebd7e3 /tcl8.6/doc/FileSystem.3 | |
parent | 768f87f613cc9789fcf8073018fa02178c8c91df (diff) | |
download | blt-5514e37335c012cc70f5b9aee3cedfe3d57f583f.zip blt-5514e37335c012cc70f5b9aee3cedfe3d57f583f.tar.gz blt-5514e37335c012cc70f5b9aee3cedfe3d57f583f.tar.bz2 |
undo subtree
Diffstat (limited to 'tcl8.6/doc/FileSystem.3')
-rw-r--r-- | tcl8.6/doc/FileSystem.3 | 1644 |
1 files changed, 0 insertions, 1644 deletions
diff --git a/tcl8.6/doc/FileSystem.3 b/tcl8.6/doc/FileSystem.3 deleted file mode 100644 index 28ee8f0..0000000 --- a/tcl8.6/doc/FileSystem.3 +++ /dev/null @@ -1,1644 +0,0 @@ -'\" -'\" Copyright (c) 2001 Vincent Darley -'\" Copyright (c) 2008-2010 Donal K. Fellows -'\" -'\" See the file "license.terms" for information on usage and redistribution -'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. -'\" -.TH Filesystem 3 8.4 Tcl "Tcl Library Procedures" -.so man.macros -.BS -.SH NAME -Tcl_FSRegister, Tcl_FSUnregister, Tcl_FSData, Tcl_FSMountsChanged, Tcl_FSGetFileSystemForPath, Tcl_FSGetPathType, Tcl_FSCopyFile, Tcl_FSCopyDirectory, Tcl_FSCreateDirectory, Tcl_FSDeleteFile, Tcl_FSRemoveDirectory, Tcl_FSRenameFile, Tcl_FSListVolumes, Tcl_FSEvalFile, Tcl_FSEvalFileEx, Tcl_FSLoadFile, Tcl_FSUnloadFile, Tcl_FSMatchInDirectory, Tcl_FSLink, Tcl_FSLstat, Tcl_FSUtime, Tcl_FSFileAttrsGet, Tcl_FSFileAttrsSet, Tcl_FSFileAttrStrings, Tcl_FSStat, Tcl_FSAccess, Tcl_FSOpenFileChannel, Tcl_FSGetCwd, Tcl_FSChdir, Tcl_FSPathSeparator, Tcl_FSJoinPath, Tcl_FSSplitPath, Tcl_FSEqualPaths, Tcl_FSGetNormalizedPath, Tcl_FSJoinToPath, Tcl_FSConvertToPathType, Tcl_FSGetInternalRep, Tcl_FSGetTranslatedPath, Tcl_FSGetTranslatedStringPath, Tcl_FSNewNativePath, Tcl_FSGetNativePath, Tcl_FSFileSystemInfo, Tcl_GetAccessTimeFromStat, Tcl_GetBlockSizeFromStat, Tcl_GetBlocksFromStat, Tcl_GetChangeTimeFromStat, Tcl_GetDeviceTypeFromStat, Tcl_GetFSDeviceFromStat, Tcl_GetFSInodeFromStat, Tcl_GetGroupIdFromStat, Tcl_GetLinkCountFromStat, Tcl_GetModeFromStat, Tcl_GetModificationTimeFromStat, Tcl_GetSizeFromStat, Tcl_GetUserIdFromStat, Tcl_AllocStatBuf \- procedures to interact with any filesystem -.SH SYNOPSIS -.nf -\fB#include <tcl.h>\fR -.sp -int -\fBTcl_FSRegister\fR(\fIclientData, fsPtr\fR) -.sp -int -\fBTcl_FSUnregister\fR(\fIfsPtr\fR) -.sp -ClientData -\fBTcl_FSData\fR(\fIfsPtr\fR) -.sp -void -\fBTcl_FSMountsChanged\fR(\fIfsPtr\fR) -.sp -const Tcl_Filesystem * -\fBTcl_FSGetFileSystemForPath\fR(\fIpathPtr\fR) -.sp -Tcl_PathType -\fBTcl_FSGetPathType\fR(\fIpathPtr\fR) -.sp -int -\fBTcl_FSCopyFile\fR(\fIsrcPathPtr, destPathPtr\fR) -.sp -int -\fBTcl_FSCopyDirectory\fR(\fIsrcPathPtr, destPathPtr, errorPtr\fR) -.sp -int -\fBTcl_FSCreateDirectory\fR(\fIpathPtr\fR) -.sp -int -\fBTcl_FSDeleteFile\fR(\fIpathPtr\fR) -.sp -int -\fBTcl_FSRemoveDirectory\fR(\fIpathPtr, int recursive, errorPtr\fR) -.sp -int -\fBTcl_FSRenameFile\fR(\fIsrcPathPtr, destPathPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSListVolumes\fR(\fIvoid\fR) -.sp -int -\fBTcl_FSEvalFileEx\fR(\fIinterp, pathPtr, encodingName\fR) -.sp -int -\fBTcl_FSEvalFile\fR(\fIinterp, pathPtr\fR) -.sp -int -\fBTcl_FSLoadFile\fR(\fIinterp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr, - loadHandlePtr, unloadProcPtr\fR) -.sp -.VS 8.6 -int -\fBTcl_FSUnloadFile\fR(\fIinterp, loadHandle\fR) -.VE 8.6 -.sp -int -\fBTcl_FSMatchInDirectory\fR(\fIinterp, resultPtr, pathPtr, pattern, types\fR) -.sp -Tcl_Obj * -\fBTcl_FSLink\fR(\fIlinkNamePtr, toPtr, linkAction\fR) -.sp -int -\fBTcl_FSLstat\fR(\fIpathPtr, statPtr\fR) -.sp -int -\fBTcl_FSUtime\fR(\fIpathPtr, tval\fR) -.sp -int -\fBTcl_FSFileAttrsGet\fR(\fIinterp, int index, pathPtr, objPtrRef\fR) -.sp -int -\fBTcl_FSFileAttrsSet\fR(\fIinterp, int index, pathPtr, Tcl_Obj *objPtr\fR) -.sp -const char *const * -\fBTcl_FSFileAttrStrings\fR(\fIpathPtr, objPtrRef\fR) -.sp -int -\fBTcl_FSStat\fR(\fIpathPtr, statPtr\fR) -.sp -int -\fBTcl_FSAccess\fR(\fIpathPtr, mode\fR) -.sp -Tcl_Channel -\fBTcl_FSOpenFileChannel\fR(\fIinterp, pathPtr, modeString, permissions\fR) -.sp -Tcl_Obj * -\fBTcl_FSGetCwd\fR(\fIinterp\fR) -.sp -int -\fBTcl_FSChdir\fR(\fIpathPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSPathSeparator\fR(\fIpathPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSJoinPath\fR(\fIlistObj, elements\fR) -.sp -Tcl_Obj * -\fBTcl_FSSplitPath\fR(\fIpathPtr, lenPtr\fR) -.sp -int -\fBTcl_FSEqualPaths\fR(\fIfirstPtr, secondPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSGetNormalizedPath\fR(\fIinterp, pathPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSJoinToPath\fR(\fIbasePtr, objc, objv\fR) -.sp -int -\fBTcl_FSConvertToPathType\fR(\fIinterp, pathPtr\fR) -.sp -ClientData -\fBTcl_FSGetInternalRep\fR(\fIpathPtr, fsPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSGetTranslatedPath\fR(\fIinterp, pathPtr\fR) -.sp -const char * -\fBTcl_FSGetTranslatedStringPath\fR(\fIinterp, pathPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSNewNativePath\fR(\fIfsPtr, clientData\fR) -.sp -const void * -\fBTcl_FSGetNativePath\fR(\fIpathPtr\fR) -.sp -Tcl_Obj * -\fBTcl_FSFileSystemInfo\fR(\fIpathPtr\fR) -.sp -Tcl_StatBuf * -\fBTcl_AllocStatBuf\fR() -.sp -.VS 8.6 -Tcl_WideInt -\fBTcl_GetAccessTimeFromStat\fR(\fIstatPtr\fR) -.sp -unsigned -\fBTcl_GetBlockSizeFromStat\fR(\fIstatPtr\fR) -.sp -Tcl_WideUInt -\fBTcl_GetBlocksFromStat\fR(\fIstatPtr\fR) -.sp -Tcl_WideInt -\fBTcl_GetChangeTimeFromStat\fR(\fIstatPtr\fR) -.sp -int -\fBTcl_GetDeviceTypeFromStat\fR(\fIstatPtr\fR) -.sp -unsigned -\fBTcl_GetFSDeviceFromStat\fR(\fIstatPtr\fR) -.sp -unsigned -\fBTcl_GetFSInodeFromStat\fR(\fIstatPtr\fR) -.sp -int -\fBTcl_GetGroupIdFromStat\fR(\fIstatPtr\fR) -.sp -int -\fBTcl_GetLinkCountFromStat\fR(\fIstatPtr\fR) -.sp -unsigned -\fBTcl_GetModeFromStat\fR(\fIstatPtr\fR) -.sp -Tcl_WideInt -\fBTcl_GetModificationTimeFromStat\fR(\fIstatPtr\fR) -.sp -Tcl_WideUInt -\fBTcl_GetSizeFromStat\fR(\fIstatPtr\fR) -.sp -int -\fBTcl_GetUserIdFromStat\fR(\fIstatPtr\fR) -.VE 8.6 -.SH ARGUMENTS -.AS Tcl_GlobTypeData **srcPathPtr out -.AP "const Tcl_Filesystem" *fsPtr in -Points to a structure containing the addresses of procedures that -can be called to perform the various filesystem operations. -.AP Tcl_Obj *pathPtr in -The path represented by this value is used for the operation in -question. If the value does not already have an internal \fBpath\fR -representation, it will be converted to have one. -.AP Tcl_Obj *srcPathPtr in -As for \fIpathPtr\fR, but used for the source file for a copy or -rename operation. -.AP Tcl_Obj *destPathPtr in -As for \fIpathPtr\fR, but used for the destination filename for a copy or -rename operation. -.AP "const char" *encodingName in -The encoding of the data stored in the -file identified by \fIpathPtr\fR and to be evaluated. -.AP "const char" *pattern in -Only files or directories matching this pattern will be returned. -.AP Tcl_GlobTypeData *types in -Only files or directories matching the type descriptions contained in -this structure will be returned. This parameter may be NULL. -.AP Tcl_Interp *interp in -Interpreter to use either for results, evaluation, or reporting error -messages. -.AP ClientData clientData in -The native description of the path value to create. -.AP Tcl_Obj *firstPtr in -The first of two path values to compare. The value may be converted -to \fBpath\fR type. -.AP Tcl_Obj *secondPtr in -The second of two path values to compare. The value may be converted -to \fBpath\fR type. -.AP Tcl_Obj *listObj in -The list of path elements to operate on with a \fBjoin\fR operation. -.AP int elements in -If non-negative, the number of elements in the \fIlistObj\fR which should -be joined together. If negative, then all elements are joined. -.AP Tcl_Obj **errorPtr out -In the case of an error, filled with a value containing the name of -the file which caused an error in the various copy/rename operations. -.AP Tcl_Obj **objPtrRef out -Filled with a value containing the result of the operation. -.AP Tcl_Obj *resultPtr out -Pre-allocated value in which to store (using -\fBTcl_ListObjAppendElement\fR) the list of -files or directories which are successfully matched. -.AP int mode in -Mask consisting of one or more of R_OK, W_OK, X_OK and F_OK. R_OK, -W_OK and X_OK request checking whether the file exists and has read, -write and execute permissions, respectively. F_OK just requests -checking for the existence of the file. -.AP Tcl_StatBuf *statPtr out -The structure that contains the result of a stat or lstat operation. -.AP "const char" *sym1 in -Name of a procedure to look up in the file's symbol table -.AP "const char" *sym2 in -Name of a procedure to look up in the file's symbol table -.AP Tcl_PackageInitProc **proc1Ptr out -Filled with the init function for this code. -.AP Tcl_PackageInitProc **proc2Ptr out -Filled with the safe-init function for this code. -.AP ClientData *clientDataPtr out -Filled with the clientData value to pass to this code's unload -function when it is called. -.AP Tcl_LoadHandle *loadHandlePtr out -Filled with an abstract token representing the loaded file. -.AP Tcl_FSUnloadFileProc **unloadProcPtr out -Filled with the function to use to unload this piece of code. -.AP Tcl_LoadHandle loadHandle in -Handle to the loaded library to be unloaded. -.AP utimbuf *tval in -The access and modification times in this structure are read and -used to set those values for a given file. -.AP "const char" *modeString in -Specifies how the file is to be accessed. May have any of the values -allowed for the \fImode\fR argument to the Tcl \fBopen\fR command. -.AP int permissions in -POSIX-style permission flags such as 0644. If a new file is created, these -permissions will be set on the created file. -.AP int *lenPtr out -If non-NULL, filled with the number of elements in the split path. -.AP Tcl_Obj *basePtr in -The base path on to which to join the given elements. May be NULL. -.AP int objc in -The number of elements in \fIobjv\fR. -.AP "Tcl_Obj *const" objv[] in -The elements to join to the given base path. -.AP Tcl_Obj *linkNamePtr in -The name of the link to be created or read. -.AP Tcl_Obj *toPtr in -What the link called \fIlinkNamePtr\fR should be linked to, or NULL if -the symbolic link specified by \fIlinkNamePtr\fR is to be read. -.AP int linkAction in -OR-ed combination of flags indicating what kind of link should be -created (will be ignored if \fItoPtr\fR is NULL). Valid bits to set -are \fBTCL_CREATE_SYMBOLIC_LINK\fR and \fBTCL_CREATE_HARD_LINK\fR. -When both flags are set and the underlying filesystem can do either, -symbolic links are preferred. -.BE -.SH DESCRIPTION -.PP -There are several reasons for calling the \fBTcl_FS\fR API functions -(e.g.\ \fBTcl_FSAccess\fR and \fBTcl_FSStat\fR) -rather than calling system level functions like \fBaccess\fR and -\fBstat\fR directly. First, they will work cross-platform, so an -extension which calls them should work unmodified on Unix and -Windows. Second, the Windows implementation of some of these functions -fixes some bugs in the system level calls. Third, these function calls -deal with any -.QW "Utf to platform-native" -path conversions which may be -required (and may cache the results of such conversions for greater -efficiency on subsequent calls). Fourth, and perhaps most importantly, -all of these functions are -.QW "virtual filesystem aware" . -Any virtual filesystem (VFS for short) which has been registered (through -\fBTcl_FSRegister\fR) may reroute file access to alternative -media or access methods. This means that all of these functions (and -therefore the corresponding \fBfile\fR, \fBglob\fR, \fBpwd\fR, \fBcd\fR, -\fBopen\fR, etc.\ Tcl commands) may be operate on -.QW files -which are not -native files in the native filesystem. This also means that any Tcl -extension which accesses the filesystem (FS for short) through this API is -automatically -.QW "virtual filesystem aware" . -Of course, if an extension -accesses the native filesystem directly (through platform-specific -APIs, for example), then Tcl cannot intercept such calls. -.PP -If appropriate VFSes have been registered, the -.QW files -may, to give two -examples, be remote (e.g.\ situated on a remote ftp server) or archived -(e.g.\ lying inside a .zip archive). Such registered filesystems provide -a lookup table of functions to implement all or some of the functionality -listed here. Finally, the \fBTcl_FSStat\fR and \fBTcl_FSLstat\fR calls -abstract away from what the -.QW "struct stat" -buffer is actually -declared to be, allowing the same code to be used both on systems with -and systems without support for files larger than 2GB in size. -.PP -The \fBTcl_FS\fR API is \fBTcl_Obj\fR-ified and may cache internal -representations and other path-related strings (e.g.\ the current working -directory). One side-effect of this is that one must not pass in values -with a reference count of zero to any of these functions. If such calls were -handled, they might result -in memory leaks (under some circumstances, the filesystem code may wish -to retain a reference to the passed in value, and so one must not assume -that after any of these calls return, the value still has a reference count of -zero - it may have been incremented) or in a direct segmentation fault -(or other memory access error) -due to the value being freed part way through the complex value -manipulation required to ensure that the path is fully normalized and -absolute for filesystem determination. The practical lesson to learn -from this is that -.PP -.CS -Tcl_Obj *path = Tcl_NewStringObj(...); -Tcl_FS\fIWhatever\fR(path); -Tcl_DecrRefCount(path); -.CE -.PP -is wrong, and may cause memory errors. The \fIpath\fR must have its -reference count incremented before passing it in, or -decrementing it. For this reason, values with a reference count of zero are -considered not to be valid filesystem paths and calling any Tcl_FS API -function with such a value will result in no action being taken. -.SS "FS API FUNCTIONS" -\fBTcl_FSCopyFile\fR attempts to copy the file given by \fIsrcPathPtr\fR to the -path name given by \fIdestPathPtr\fR. If the two paths given lie in the same -filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that -filesystem's -.QW "copy file" -function is called (if it is non-NULL). -Otherwise the function returns -1 and sets the \fBerrno\fR global C -variable to the -.QW EXDEV -POSIX error code (which signifies a -.QW "cross-domain link" ). -.PP -\fBTcl_FSCopyDirectory\fR attempts to copy the directory given by \fIsrcPathPtr\fR to the -path name given by \fIdestPathPtr\fR. If the two paths given lie in the same -filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that -filesystem's -.QW "copy file" -function is called (if it is non-NULL). -Otherwise the function returns -1 and sets the \fBerrno\fR global C -variable to the -.QW EXDEV -POSIX error code (which signifies a -.QW "cross-domain link" ). -.PP -\fBTcl_FSCreateDirectory\fR attempts to create the directory given by -\fIpathPtr\fR by calling the owning filesystem's -.QW "create directory" -function. -.PP -\fBTcl_FSDeleteFile\fR attempts to delete the file given by -\fIpathPtr\fR by calling the owning filesystem's -.QW "delete file" -function. -.PP -\fBTcl_FSRemoveDirectory\fR attempts to remove the directory given by -\fIpathPtr\fR by calling the owning filesystem's -.QW "remove directory" -function. -.PP -\fBTcl_FSRenameFile\fR attempts to rename the file or directory given by -\fIsrcPathPtr\fR to the path name given by \fIdestPathPtr\fR. If the two paths -given lie in the same filesystem (according to -\fBTcl_FSGetFileSystemForPath\fR) then that filesystem's -.QW "rename file" -function is called (if it is non-NULL). Otherwise the function returns -1 -and sets the \fBerrno\fR global C variable to the -.QW EXDEV -POSIX error code (which signifies a -.QW "cross-domain link" ). -.PP -\fBTcl_FSListVolumes\fR calls each filesystem which has a non-NULL -.QW "list volumes" -function and asks them to return their list of root volumes. It -accumulates the return values in a list which is returned to the -caller (with a reference count of 0). -.PP -\fBTcl_FSEvalFileEx\fR reads the file given by \fIpathPtr\fR using -the encoding identified by \fIencodingName\fR and evaluates -its contents as a Tcl script. It returns the same information as -\fBTcl_EvalObjEx\fR. -If \fIencodingName\fR is NULL, the system encoding is used for -reading the file contents. -If the file could not be read then a Tcl error is returned to describe -why the file could not be read. -The eofchar for files is -.QW \e32 -(^Z) for all platforms. -If you require a -.QW ^Z -in code for string comparison, you can use -.QW \e032 -or -.QW \eu001a , -which will be safely substituted by the Tcl interpreter into -.QW ^Z . -\fBTcl_FSEvalFile\fR is a simpler version of -\fBTcl_FSEvalFileEx\fR that always uses the system encoding -when reading the file. -.PP -\fBTcl_FSLoadFile\fR dynamically loads a binary code file into memory and -returns the addresses of two procedures within that file, if they are -defined. The appropriate function for the filesystem to which \fIpathPtr\fR -belongs will be called. If that filesystem does not implement this -function (most virtual filesystems will not, because of OS limitations -in dynamically loading binary code), Tcl will attempt to copy the file -to a temporary directory and load that temporary file. -.VS 8.6 -\fBTcl_FSUnloadFile\fR reverses the operation, asking for the library -indicated by the \fIloadHandle\fR to be removed from the process. Note that, -unlike with the \fBunload\fR command, this does not give the library any -opportunity to clean up. -.VE 8.6 -.PP -Both the above functions return a standard Tcl completion code. If an error -occurs, an error message is left in the \fIinterp\fR's result. -.PP -.VS 8.6 -The token provided via the variable indicated by \fIloadHandlePtr\fR may be -used with \fBTcl_FindSymbol\fR. -.VE 8.6 -.PP -\fBTcl_FSMatchInDirectory\fR is used by the globbing code to search a -directory for all files which match a given pattern. The appropriate -function for the filesystem to which \fIpathPtr\fR belongs will be called. -.PP -The return value is a standard Tcl result indicating whether an error -occurred in globbing. Error messages are placed in interp (unless -interp is NULL, which is allowed), but good results are placed in the -resultPtr given. -.PP -Note that the \fBglob\fR code implements recursive patterns internally, so -this function will only ever be passed simple patterns, which can be -matched using the logic of \fBstring match\fR. To handle recursion, Tcl -will call this function frequently asking only for directories to be -returned. A special case of being called with a NULL pattern indicates -that the path needs to be checked only for the correct type. -.PP -\fBTcl_FSLink\fR replaces the library version of \fBreadlink\fR, and -extends it to support the creation of links. The appropriate function -for the filesystem to which \fIlinkNamePtr\fR belongs will be called. -.PP -If the \fItoPtr\fR is NULL, a -.QW "read link" -action is performed. The result -is a Tcl_Obj specifying the contents of the symbolic link given by -\fIlinkNamePtr\fR, or NULL if the link could not be read. The result is owned -by the caller, which should call \fBTcl_DecrRefCount\fR when the result is no -longer needed. If the \fItoPtr\fR is not NULL, Tcl should create a link -of one of the types passed in in the \fIlinkAction\fR flag. This flag is -an ORed combination of \fBTCL_CREATE_SYMBOLIC_LINK\fR and \fBTCL_CREATE_HARD_LINK\fR. -Where a choice exists (i.e.\ more than one flag is passed in), the Tcl -convention is to prefer symbolic links. When a link is successfully -created, the return value should be \fItoPtr\fR (which is therefore -already owned by the caller). If unsuccessful, NULL is returned. -.PP -\fBTcl_FSLstat\fR fills the \fITcl_StatBuf\fR structure \fIstatPtr\fR with -information about the specified file. You do not need any access rights to the -file to get this information but you need search rights to all -directories named in the path leading to the file. The \fITcl_StatBuf\fR -structure includes info regarding device, inode (always 0 on Windows), -privilege mode, nlink (always 1 on Windows), user id (always 0 on -Windows), group id (always 0 on Windows), rdev (same as device on -Windows), size, last access time, last modification time, and -last metadata change time. -See \fBPORTABLE STAT RESULT API\fR for a description of how to write -portable code to allocate and access the \fITcl_StatBuf\fR structure. -.PP -If \fIpath\fR exists, \fBTcl_FSLstat\fR returns 0 and the stat structure -is filled with data. Otherwise, -1 is returned, and no stat info is -given. -.PP -\fBTcl_FSUtime\fR replaces the library version of utime. -.PP -This returns 0 on success and -1 on error (as per the \fButime\fR -documentation). If successful, the function -will update the -.QW atime -and -.QW mtime -values of the file given. -.PP -\fBTcl_FSFileAttrsGet\fR implements read access for the hookable \fBfile -attributes\fR subcommand. The appropriate function for the filesystem to -which \fIpathPtr\fR belongs will be called. -.PP -If the result is \fBTCL_OK\fR, then a value was placed in -\fIobjPtrRef\fR, which -will only be temporarily valid (unless \fBTcl_IncrRefCount\fR is called). -.PP -\fBTcl_FSFileAttrsSet\fR implements write access for the hookable \fBfile -attributes\fR subcommand. The appropriate function for the filesystem to -which \fIpathPtr\fR belongs will be called. -.PP -\fBTcl_FSFileAttrStrings\fR implements part of the hookable \fBfile -attributes\fR subcommand. The appropriate function for the filesystem -to which \fIpathPtr\fR belongs will be called. -.PP -The called procedure may either return an array of strings, or may -instead return NULL and place a Tcl list into the given \fIobjPtrRef\fR. Tcl -will take that list and first increment its reference count before using it. -On completion of that use, Tcl will decrement its reference count. Hence if -the list should be disposed of by Tcl when done, it should have a -reference count of zero, and if the list should not be disposed of, the -filesystem should ensure it retains a reference count to the value. -.PP -\fBTcl_FSAccess\fR checks whether the process would be allowed to read, -write or test for existence of the file (or other filesystem object) -whose name is \fIpathname\fR. If \fIpathname\fR is a symbolic link on Unix, -then permissions of the file referred by this symbolic link are -tested. -.PP -On success (all requested permissions granted), zero is returned. On -error (at least one bit in mode asked for a permission that is denied, -or some other error occurred), -1 is returned. -.PP -\fBTcl_FSStat\fR fills the \fITcl_StatBuf\fR structure \fIstatPtr\fR with -information about the specified file. You do not need any access rights to the -file to get this information but you need search rights to all -directories named in the path leading to the file. The \fITcl_StatBuf\fR -structure includes info regarding device, inode (always 0 on Windows), -privilege mode, nlink (always 1 on Windows), user id (always 0 on -Windows), group id (always 0 on Windows), rdev (same as device on -Windows), size, last access time, last modification time, and -last metadata change time. -See \fBPORTABLE STAT RESULT API\fR for a description of how to write -portable code to allocate and access the \fITcl_StatBuf\fR structure. -.PP -If \fIpath\fR exists, \fBTcl_FSStat\fR returns 0 and the stat structure -is filled with data. Otherwise, -1 is returned, and no stat info is -given. -.PP -\fBTcl_FSOpenFileChannel\fR opens a file specified by \fIpathPtr\fR and -returns a channel handle that can be used to perform input and output on -the file. This API is modeled after the \fBfopen\fR procedure of -the Unix standard I/O library. -The syntax and meaning of all arguments is similar to those -given in the Tcl \fBopen\fR command when opening a file. -If an error occurs while opening the channel, \fBTcl_FSOpenFileChannel\fR -returns NULL and records a POSIX error code that can be -retrieved with \fBTcl_GetErrno\fR. -In addition, if \fIinterp\fR is non-NULL, \fBTcl_FSOpenFileChannel\fR -leaves an error message in \fIinterp\fR's result after any error. -.PP -The newly created channel is not registered in the supplied interpreter; to -register it, use \fBTcl_RegisterChannel\fR. -If one of the standard channels, \fBstdin\fR, \fBstdout\fR or \fBstderr\fR was -previously closed, the act of creating the new channel also assigns it as a -replacement for the standard channel. -.PP -\fBTcl_FSGetCwd\fR replaces the library version of \fBgetcwd\fR. -.PP -It returns the Tcl library's current working directory. This may be -different to the native platform's working directory, which happens when -the current working directory is not in the native filesystem. -.PP -The result is a pointer to a Tcl_Obj specifying the current directory, -or NULL if the current directory could not be determined. If NULL is -returned, an error message is left in the \fIinterp\fR's result. -.PP -The result already has its reference count incremented for the caller. When -it is no longer needed, that reference count should be decremented. This is -needed for thread-safety purposes, to allow multiple threads to access -this and related functions, while ensuring the results are always -valid. -.PP -\fBTcl_FSChdir\fR replaces the library version of \fBchdir\fR. The path is -normalized and then passed to the filesystem which claims it. If that -filesystem does not implement this function, Tcl will fallback to a -combination of \fBstat\fR and \fBaccess\fR to check whether the directory -exists and has appropriate permissions. -.PP -For results, see \fBchdir\fR documentation. If successful, we keep a -record of the successful path in \fIcwdPathPtr\fR for subsequent calls to -\fBTcl_FSGetCwd\fR. -.PP -\fBTcl_FSPathSeparator\fR returns the separator character to be used for -most specific element of the path specified by \fIpathPtr\fR (i.e.\ the last -part of the path). -.PP -The separator is returned as a Tcl_Obj containing a string of length -1. If the path is invalid, NULL is returned. -.PP -\fBTcl_FSJoinPath\fR takes the given Tcl_Obj, which must be a valid -list (which is allowed to have a reference count of zero), and returns the path -value given by considering the first \fIelements\fR elements as valid path -segments (each path segment may be a complete path, a partial path or -just a single possible directory or file name). If any path segment is -actually an absolute path, then all prior path segments are discarded. -If \fIelements\fR is less than 0, we use the entire list. -.PP -It is possible that the returned value is actually an element -of the given list, so the caller should be careful to increment the -reference count of the result before freeing the list. -.PP -The returned value, typically with a reference count of zero (but it -could be shared -under some conditions), contains the joined path. The caller must -add a reference count to the value before using it. In particular, the -returned value could be an element of the given list, so freeing the -list might free the value prematurely if no reference count has been taken. -If the number of elements is zero, then the returned value will be -an empty-string Tcl_Obj. -.PP -\fBTcl_FSSplitPath\fR takes the given Tcl_Obj, which should be a valid path, -and returns a Tcl list value containing each segment of that path as -an element. -It returns a list value with a reference count of zero. If the -passed in \fIlenPtr\fR is non-NULL, the variable it points to will be -updated to contain the number of elements in the returned list. -.PP -\fBTcl_FSEqualPaths\fR tests whether the two paths given represent the same -filesystem object. -It returns 1 if the paths are equal, and 0 if they are different. If -either path is NULL, 0 is always returned. -.PP -\fBTcl_FSGetNormalizedPath\fR this important function attempts to extract -from the given Tcl_Obj a unique normalized path representation, whose -string value can be used as a unique identifier for the file. -.PP -It returns the normalized path value, owned by Tcl, or NULL if the path -was invalid or could otherwise not be successfully converted. -Extraction of absolute, normalized paths is very efficient (because the -filesystem operates on these representations internally), although the -result when the filesystem contains numerous symbolic links may not be -the most user-friendly version of a path. The return value is owned by -Tcl and has a lifetime equivalent to that of the \fIpathPtr\fR passed in -(unless that is a relative path, in which case the normalized path -value may be freed any time the cwd changes) - the caller can of -course increment the reference count if it wishes to maintain a copy for longer. -.PP -\fBTcl_FSJoinToPath\fR takes the given value, which should usually be a -valid path or NULL, and joins onto it the array of paths segments -given. -.PP -Returns a value, typically with reference count of zero (but it could be shared -under some conditions), containing the joined path. The caller must -add a reference count to the value before using it. If any of the values -passed into this function (\fIpathPtr\fR or \fIpath\fR elements) have -a reference count -of zero, they will be freed when this function returns. -.PP -\fBTcl_FSConvertToPathType\fR tries to convert the given Tcl_Obj to a valid -Tcl path type, taking account of the fact that the cwd may have changed -even if this value is already supposedly of the correct type. -The filename may begin with -.QW ~ -(to indicate current user's home directory) or -.QW ~<user> -(to indicate any user's home directory). -.PP -If the conversion succeeds (i.e.\ the value is a valid path in one of -the current filesystems), then \fBTCL_OK\fR is returned. Otherwise -\fBTCL_ERROR\fR is returned, and an error message may -be left in the interpreter. -.PP -\fBTcl_FSGetInternalRep\fR extracts the internal representation of a given -path value, in the given filesystem. If the path value belongs to a -different filesystem, we return NULL. If the internal representation is -currently NULL, we attempt to generate it, by calling the filesystem's -\fBTcl_FSCreateInternalRepProc\fR. -.PP -Returns NULL or a valid internal path representation. This internal -representation is cached, so that repeated calls to this function will -not require additional conversions. -.PP -\fBTcl_FSGetTranslatedPath\fR attempts to extract the translated path -from the given Tcl_Obj. -.PP -If the translation succeeds (i.e.\ the value is a valid path), then it is -returned. Otherwise NULL will be returned, and an error message may be -left in the interpreter. A -.QW translated -path is one which contains no -.QW ~ -or -.QW ~user -sequences (these have been expanded to their current -representation in the filesystem). The value returned is owned by the -caller, which must store it or call \fBTcl_DecrRefCount\fR to ensure memory is -freed. This function is of little practical use, and -\fBTcl_FSGetNormalizedPath\fR or \fBTcl_FSGetNativePath\fR are usually -better functions to use for most purposes. -.PP -\fBTcl_FSGetTranslatedStringPath\fR does the same as -\fBTcl_FSGetTranslatedPath\fR, but returns a character string or NULL. -The string returned is dynamically allocated and owned by the caller, -which must store it or call \fBckfree\fR to ensure it is freed. Again, -\fBTcl_FSGetNormalizedPath\fR or \fBTcl_FSGetNativePath\fR are usually -better functions to use for most purposes. -.PP -\fBTcl_FSNewNativePath\fR performs something like the reverse of the -usual obj->path->nativerep conversions. If some code retrieves a path -in native form (from, e.g.\ \fBreadlink\fR or a native dialog), and that path -is to be used at the Tcl level, then calling this function is an -efficient way of creating the appropriate path value type. -.PP -The resulting value is a pure -.QW path -value, which will only receive -a UTF-8 string representation if that is required by some Tcl code. -.PP -\fBTcl_FSGetNativePath\fR is for use by the Win/Unix native -filesystems, so that they can easily retrieve the native (char* or -TCHAR*) representation of a path. This function is a convenience -wrapper around \fBTcl_FSGetInternalRep\fR. It may be desirable in the -future to have non-string-based native representations (for example, -on MacOSX, a representation using a fileSpec of FSRef structure would -probably be more efficient). On Windows a full Unicode representation -would allow for paths of unlimited length. Currently the representation -is simply a character string which may contain either the relative path -or a complete, absolute normalized path in the native encoding (complex -conditions dictate which of these will be provided, so neither can be -relied upon, unless the path is known to be absolute). If you need a -native path which must be absolute, then you should ask for the native -version of a normalized path. If for some reason a non-absolute, -non-normalized version of the path is needed, that must be constructed -separately (e.g.\ using \fBTcl_FSGetTranslatedPath\fR). -.PP -The native representation is cached so that repeated calls to this -function will not require additional conversions. The return value is -owned by Tcl and has a lifetime equivalent to that of the \fIpathPtr\fR -passed in (unless that is a relative path, in which case the native -representation may be freed any time the cwd changes). -.PP -\fBTcl_FSFileSystemInfo\fR returns a list of two elements. The first -element is the name of the filesystem (e.g. -.QW native , -.QW vfs , -.QW zip , -or -.QW prowrap , -perhaps), and the second is the particular type of the -given path within that filesystem (which is filesystem dependent). The -second element may be empty if the filesystem does not provide a -further categorization of files. -.PP -A valid list value is returned, unless the path value is not -recognized, when NULL will be returned. -.PP -\fBTcl_FSGetFileSystemForPath\fR returns a pointer to the -\fBTcl_Filesystem\fR which accepts this path as valid. -.PP -If no filesystem will accept the path, NULL is returned. -.PP -\fBTcl_FSGetPathType\fR determines whether the given path is relative -to the current directory, relative to the current volume, or -absolute. -.PP -It returns one of \fBTCL_PATH_ABSOLUTE\fR, \fBTCL_PATH_RELATIVE\fR, or -\fBTCL_PATH_VOLUME_RELATIVE\fR -.SS "PORTABLE STAT RESULT API" -.PP -\fBTcl_AllocStatBuf\fR allocates a \fITcl_StatBuf\fR on the system heap (which -may be deallocated by being passed to \fBckfree\fR). This allows extensions to -invoke \fBTcl_FSStat\fR and \fBTcl_FSLstat\fR without being dependent on the -size of the buffer. That in turn depends on the flags used to build Tcl. -.PP -.VS 8.6 -The portable fields of a \fITcl_StatBuf\fR may be read using the following -functions, each of which returns the value of the corresponding field listed -in the table below. Note that on some platforms there may be other fields in -the \fITcl_StatBuf\fR as it is an alias for a suitable system structure, but -only the portable ones are made available here. See your system documentation -for a full description of these fields. -.DS -.ta \w'\fBTcl_GetModificationTimeFromStat\fR\0\0\0\0'u -\fIAccess Function\fR \fIField\fR - \fBTcl_GetFSDeviceFromStat\fR st_dev - \fBTcl_GetFSInodeFromStat\fR st_ino - \fBTcl_GetModeFromStat\fR st_mode - \fBTcl_GetLinkCountFromStat\fR st_nlink - \fBTcl_GetUserIdFromStat\fR st_uid - \fBTcl_GetGroupIdFromStat\fR st_gid - \fBTcl_GetDeviceTypeFromStat\fR st_rdev - \fBTcl_GetAccessTimeFromStat\fR st_atime - \fBTcl_GetModificationTimeFromStat\fR st_mtime - \fBTcl_GetChangeTimeFromStat\fR st_ctime - \fBTcl_GetSizeFromStat\fR st_size - \fBTcl_GetBlocksFromStat\fR st_blocks - \fBTcl_GetBlockSizeFromStat\fR st_blksize -.DE -.VE 8.6 -.SH "THE VIRTUAL FILESYSTEM API" -.PP -A filesystem provides a \fBTcl_Filesystem\fR structure that contains -pointers to functions that implement the various operations on a -filesystem; these operations are invoked as needed by the generic -layer, which generally occurs through the functions listed above. -.PP -The \fBTcl_Filesystem\fR structures are manipulated using the following -methods. -.PP -\fBTcl_FSRegister\fR takes a pointer to a filesystem structure and an -optional piece of data to associated with that filesystem. On calling -this function, Tcl will attach the filesystem to the list of known -filesystems, and it will become fully functional immediately. Tcl does -not check if the same filesystem is registered multiple times (and in -general that is not a good thing to do). \fBTCL_OK\fR will be returned. -.PP -\fBTcl_FSUnregister\fR removes the given filesystem structure from -the list of known filesystems, if it is known, and returns \fBTCL_OK\fR. If -the filesystem is not currently registered, \fBTCL_ERROR\fR is returned. -.PP -\fBTcl_FSData\fR will return the ClientData associated with the given -filesystem, if that filesystem is registered. Otherwise it will -return NULL. -.PP -\fBTcl_FSMountsChanged\fR is used to inform the Tcl's core that -the set of mount points for the given (already registered) filesystem -have changed, and that cached file representations may therefore no -longer be correct. -.SS "THE TCL_FILESYSTEM STRUCTURE" -.PP -The \fBTcl_Filesystem\fR structure contains the following fields: -.PP -.CS -typedef struct Tcl_Filesystem { - const char *\fItypeName\fR; - int \fIstructureLength\fR; - Tcl_FSVersion \fIversion\fR; - Tcl_FSPathInFilesystemProc *\fIpathInFilesystemProc\fR; - Tcl_FSDupInternalRepProc *\fIdupInternalRepProc\fR; - Tcl_FSFreeInternalRepProc *\fIfreeInternalRepProc\fR; - Tcl_FSInternalToNormalizedProc *\fIinternalToNormalizedProc\fR; - Tcl_FSCreateInternalRepProc *\fIcreateInternalRepProc\fR; - Tcl_FSNormalizePathProc *\fInormalizePathProc\fR; - Tcl_FSFilesystemPathTypeProc *\fIfilesystemPathTypeProc\fR; - Tcl_FSFilesystemSeparatorProc *\fIfilesystemSeparatorProc\fR; - Tcl_FSStatProc *\fIstatProc\fR; - Tcl_FSAccessProc *\fIaccessProc\fR; - Tcl_FSOpenFileChannelProc *\fIopenFileChannelProc\fR; - Tcl_FSMatchInDirectoryProc *\fImatchInDirectoryProc\fR; - Tcl_FSUtimeProc *\fIutimeProc\fR; - Tcl_FSLinkProc *\fIlinkProc\fR; - Tcl_FSListVolumesProc *\fIlistVolumesProc\fR; - Tcl_FSFileAttrStringsProc *\fIfileAttrStringsProc\fR; - Tcl_FSFileAttrsGetProc *\fIfileAttrsGetProc\fR; - Tcl_FSFileAttrsSetProc *\fIfileAttrsSetProc\fR; - Tcl_FSCreateDirectoryProc *\fIcreateDirectoryProc\fR; - Tcl_FSRemoveDirectoryProc *\fIremoveDirectoryProc\fR; - Tcl_FSDeleteFileProc *\fIdeleteFileProc\fR; - Tcl_FSCopyFileProc *\fIcopyFileProc\fR; - Tcl_FSRenameFileProc *\fIrenameFileProc\fR; - Tcl_FSCopyDirectoryProc *\fIcopyDirectoryProc\fR; - Tcl_FSLstatProc *\fIlstatProc\fR; - Tcl_FSLoadFileProc *\fIloadFileProc\fR; - Tcl_FSGetCwdProc *\fIgetCwdProc\fR; - Tcl_FSChdirProc *\fIchdirProc\fR; -} \fBTcl_Filesystem\fR; -.CE -.PP -Except for the first three fields in this structure which contain -simple data elements, all entries contain addresses of functions called -by the generic filesystem layer to perform the complete range of -filesystem related actions. -.PP -The many functions in this structure are broken down into three -categories: infrastructure functions (almost all of which must be -implemented), operational functions (which must be implemented if a -complete filesystem is provided), and efficiency functions (which need -only be implemented if they can be done so efficiently, or if they have -side-effects which are required by the filesystem; Tcl has less -efficient emulations it can fall back on). It is important to note -that, in the current version of Tcl, most of these fallbacks are only -used to handle commands initiated in Tcl, not in C. What this means is, -that if a \fBfile rename\fR command is issued in Tcl, and the relevant -filesystem(s) do not implement their \fITcl_FSRenameFileProc\fR, Tcl's -core will instead fallback on a combination of other filesystem -functions (it will use \fITcl_FSCopyFileProc\fR followed by -\fITcl_FSDeleteFileProc\fR, and if \fITcl_FSCopyFileProc\fR is not -implemented there is a further fallback). However, if a -\fITcl_FSRenameFileProc\fR command is issued at the C level, no such -fallbacks occur. This is true except for the last four entries in the -filesystem table (\fBlstat\fR, \fBload\fR, \fBgetcwd\fR and \fBchdir\fR) -for which fallbacks do in fact occur at the C level. -.PP -Any functions which take path names in Tcl_Obj form take -those names in UTF\-8 form. The filesystem infrastructure API is -designed to support efficient, cached conversion of these UTF\-8 paths -to other native representations. -.SS "EXAMPLE FILESYSTEM DEFINITION" -.PP -Here is the filesystem lookup table used by the -.QW vfs -extension which allows filesystem actions to be implemented in Tcl. -.PP -.CS -static Tcl_Filesystem vfsFilesystem = { - "tclvfs", - sizeof(Tcl_Filesystem), - TCL_FILESYSTEM_VERSION_1, - &VfsPathInFilesystem, - &VfsDupInternalRep, - &VfsFreeInternalRep, - /* No internal to normalized, since we don't create - * any pure 'internal' Tcl_Obj path representations */ - NULL, - /* No create native rep function, since we don't use - * it and don't choose to support uses of - * Tcl_FSNewNativePath */ - NULL, - /* Normalize path isn't needed - we assume paths only - * have one representation */ - NULL, - &VfsFilesystemPathType, - &VfsFilesystemSeparator, - &VfsStat, - &VfsAccess, - &VfsOpenFileChannel, - &VfsMatchInDirectory, - &VfsUtime, - /* We choose not to support symbolic links inside our - * VFS's */ - NULL, - &VfsListVolumes, - &VfsFileAttrStrings, - &VfsFileAttrsGet, - &VfsFileAttrsSet, - &VfsCreateDirectory, - &VfsRemoveDirectory, - &VfsDeleteFile, - /* No copy file; use the core fallback mechanism */ - NULL, - /* No rename file; use the core fallback mechanism */ - NULL, - /* No copy directory; use the core fallback mechanism */ - NULL, - /* Core will use stat for lstat */ - NULL, - /* No load; use the core fallback mechanism */ - NULL, - /* We don't need a getcwd or chdir; the core's own - * internal value is suitable */ - NULL, - NULL -}; -.CE -.SH "FILESYSTEM INFRASTRUCTURE" -.PP -These fields contain basic information about the filesystem structure -and addresses of functions which are used to associate -a particular filesystem with a file path, and deal with the internal -handling of path representations, for example copying and freeing such -representations. -.SS TYPENAME -.PP -The \fItypeName\fR field contains a null-terminated string that -identifies the type of the filesystem implemented, e.g. -.QW native , -.QW zip -or -.QW vfs . -.SS "STRUCTURE LENGTH" -.PP -The \fIstructureLength\fR field is generally implemented as -\fIsizeof(Tcl_Filesystem)\fR, and is there to allow easier -binary backwards compatibility if the size of the structure -changes in a future Tcl release. -.SS VERSION -.PP -The \fIversion\fR field should be set to \fBTCL_FILESYSTEM_VERSION_1\fR. -.SS PATHINFILESYSTEMPROC -.PP -The \fIpathInFilesystemProc\fR field contains the address of a function -which is called to determine whether a given path value belongs to this -filesystem or not. Tcl will only call the rest of the filesystem -functions with a path for which this function has returned \fBTCL_OK\fR. -If the path does not belong, -1 should be returned (the behavior of Tcl -for any other return value is not defined). If \fBTCL_OK\fR is returned, -then the optional \fIclientDataPtr\fR output parameter can be used to -return an internal (filesystem specific) representation of the path, -which will be cached inside the path value, and may be retrieved -efficiently by the other filesystem functions. Tcl will simultaneously -cache the fact that this path belongs to this filesystem. Such caches -are invalidated when filesystem structures are added or removed from -Tcl's internal list of known filesystems. -.PP -.CS -typedef int \fBTcl_FSPathInFilesystemProc\fR( - Tcl_Obj *\fIpathPtr\fR, - ClientData *\fIclientDataPtr\fR); -.CE -.SS DUPINTERNALREPPROC -.PP -This function makes a copy of a path's internal representation, and is -called when Tcl needs to duplicate a path value. If NULL, Tcl will -simply not copy the internal representation, which may then need to be -regenerated later. -.PP -.CS -typedef ClientData \fBTcl_FSDupInternalRepProc\fR( - ClientData \fIclientData\fR); -.CE -.SS FREEINTERNALREPPROC -Free the internal representation. This must be implemented if internal -representations need freeing (i.e.\ if some memory is allocated when an -internal representation is generated), but may otherwise be NULL. -.PP -.CS -typedef void \fBTcl_FSFreeInternalRepProc\fR( - ClientData \fIclientData\fR); -.CE -.SS INTERNALTONORMALIZEDPROC -.PP -Function to convert internal representation to a normalized path. Only -required if the filesystem creates pure path values with no string/path -representation. The return value is a Tcl value whose string -representation is the normalized path. -.PP -.CS -typedef Tcl_Obj *\fBTcl_FSInternalToNormalizedProc\fR( - ClientData \fIclientData\fR); -.CE -.SS CREATEINTERNALREPPROC -.PP -Function to take a path value, and calculate an internal -representation for it, and store that native representation in the -value. May be NULL if paths have no internal representation, or if -the \fITcl_FSPathInFilesystemProc\fR for this filesystem always -immediately creates an internal representation for paths it accepts. -.PP -.CS -typedef ClientData \fBTcl_FSCreateInternalRepProc\fR( - Tcl_Obj *\fIpathPtr\fR); -.CE -.SS NORMALIZEPATHPROC -.PP -Function to normalize a path. Should be implemented for all -filesystems which can have multiple string representations for the same -path value. In Tcl, every -.QW path -must have a single unique -.QW normalized -string representation. Depending on the filesystem, -there may be more than one unnormalized string representation which -refers to that path (e.g.\ a relative path, a path with different -character case if the filesystem is case insensitive, a path contain a -reference to a home directory such as -.QW ~ , -a path containing symbolic -links, etc). If the very last component in the path is a symbolic -link, it should not be converted into the value it points to (but -its case or other aspects should be made unique). All other path -components should be converted from symbolic links. This one -exception is required to agree with Tcl's semantics with \fBfile -delete\fR, \fBfile rename\fR, \fBfile copy\fR operating on symbolic links. -This function may be called with \fInextCheckpoint\fR either -at the beginning of the path (i.e.\ zero), at the end of the path, or -at any intermediate file separator in the path. It will never -point to any other arbitrary position in the path. In the last of -the three valid cases, the implementation can assume that the path -up to and including the file separator is known and normalized. -.PP -.CS -typedef int \fBTcl_FSNormalizePathProc\fR( - Tcl_Interp *\fIinterp\fR, - Tcl_Obj *\fIpathPtr\fR, - int \fInextCheckpoint\fR); -.CE -.SH "FILESYSTEM OPERATIONS" -.PP -The fields in this section of the structure contain addresses of -functions which are called to carry out the basic filesystem -operations. A filesystem which expects to be used with the complete -standard Tcl command set must implement all of these. If some of -them are not implemented, then certain Tcl commands may fail when -operating on paths within that filesystem. However, in some instances -this may be desirable (for example, a read-only filesystem should not -implement the last four functions, and a filesystem which does not -support symbolic links need not implement the \fBreadlink\fR function, -etc. The Tcl core expects filesystems to behave in this way). -.SS FILESYSTEMPATHTYPEPROC -.PP -Function to determine the type of a path in this filesystem. May be -NULL, in which case no type information will be available to users of -the filesystem. The -.QW type -is used only for informational purposes, -and should be returned as the string representation of the Tcl_Obj -which is returned. A typical return value might be -.QW networked , -.QW zip -or -.QW ftp . -The Tcl_Obj result is owned by the filesystem and so Tcl will -increment the reference count of that value if it wishes to retain a reference -to it. -.PP -.CS -typedef Tcl_Obj *\fBTcl_FSFilesystemPathTypeProc\fR( - Tcl_Obj *\fIpathPtr\fR); -.CE -.SS FILESYSTEMSEPARATORPROC -.PP -Function to return the separator character(s) for this filesystem. -This need only be implemented if the filesystem wishes to use a -different separator than the standard string -.QW / . -Amongst other -uses, it is returned by the \fBfile separator\fR command. The -return value should be a value with reference count of zero. -.PP -.CS -typedef Tcl_Obj *\fBTcl_FSFilesystemSeparatorProc\fR( - Tcl_Obj *\fIpathPtr\fR); -.CE -.SS STATPROC -.PP -Function to process a \fBTcl_FSStat\fR call. Must be implemented for any -reasonable filesystem, since many Tcl level commands depend crucially -upon it (e.g.\ \fBfile atime\fR, \fBfile isdirectory\fR, \fBfile size\fR, -\fBglob\fR). -.PP -.CS -typedef int \fBTcl_FSStatProc\fR( - Tcl_Obj *\fIpathPtr\fR, - Tcl_StatBuf *\fIstatPtr\fR); -.CE -.PP -The \fBTcl_FSStatProc\fR fills the stat structure \fIstatPtr\fR with -information about the specified file. You do not need any access -rights to the file to get this information but you need search rights -to all directories named in the path leading to the file. The stat -structure includes info regarding device, inode (always 0 on Windows), -privilege mode, nlink (always 1 on Windows), user id (always 0 on -Windows), group id (always 0 on Windows), rdev (same as device on -Windows), size, last access time, last modification time, and -last metadata change time. -.PP -If the file represented by \fIpathPtr\fR exists, the -\fBTcl_FSStatProc\fR returns 0 and the stat structure is filled with -data. Otherwise, -1 is returned, and no stat info is given. -.SS ACCESSPROC -.PP -Function to process a \fBTcl_FSAccess\fR call. Must be implemented for -any reasonable filesystem, since many Tcl level commands depend crucially -upon it (e.g.\ \fBfile exists\fR, \fBfile readable\fR). -.PP -.CS -typedef int \fBTcl_FSAccessProc\fR( - Tcl_Obj *\fIpathPtr\fR, - int \fImode\fR); -.CE -.PP -The \fBTcl_FSAccessProc\fR checks whether the process would be allowed -to read, write or test for existence of the file (or other filesystem -object) whose name is in \fIpathPtr\fR. If the pathname refers to a -symbolic link, then the -permissions of the file referred by this symbolic link should be tested. -.PP -On success (all requested permissions granted), zero is returned. On -error (at least one bit in mode asked for a permission that is denied, -or some other error occurred), -1 is returned. -.SS OPENFILECHANNELPROC -.PP -Function to process a \fBTcl_FSOpenFileChannel\fR call. Must be -implemented for any reasonable filesystem, since any operations -which require open or accessing a file's contents will use it -(e.g.\ \fBopen\fR, \fBencoding\fR, and many Tk commands). -.PP -.CS -typedef Tcl_Channel \fBTcl_FSOpenFileChannelProc\fR( - Tcl_Interp *\fIinterp\fR, - Tcl_Obj *\fIpathPtr\fR, - int \fImode\fR, - int \fIpermissions\fR); -.CE -.PP -The \fBTcl_FSOpenFileChannelProc\fR opens a file specified by -\fIpathPtr\fR and returns a channel handle that can be used to perform -input and output on the file. This API is modeled after the \fBfopen\fR -procedure of the Unix standard I/O library. The syntax and meaning of -all arguments is similar to those given in the Tcl \fBopen\fR command -when opening a file, where the \fImode\fR argument is a combination of -the POSIX flags O_RDONLY, O_WRONLY, etc. If an error occurs while -opening the channel, the \fBTcl_FSOpenFileChannelProc\fR returns NULL and -records a POSIX error code that can be retrieved with \fBTcl_GetErrno\fR. -In addition, if \fIinterp\fR is non-NULL, the -\fBTcl_FSOpenFileChannelProc\fR leaves an error message in \fIinterp\fR's -result after any error. -.PP -The newly created channel must not be registered in the supplied interpreter -by a \fBTcl_FSOpenFileChannelProc\fR; that task is up to the caller of -\fBTcl_FSOpenFileChannel\fR (if necessary). If one of -the standard channels, \fBstdin\fR, \fBstdout\fR or \fBstderr\fR was -previously closed, the act of creating the new channel also assigns it -as a replacement for the standard channel. -.SS MATCHINDIRECTORYPROC -.PP -Function to process a \fBTcl_FSMatchInDirectory\fR call. If not -implemented, then glob and recursive copy functionality will be lacking -in the filesystem (and this may impact commands like \fBencoding names\fR -which use glob functionality internally). -.PP -.CS -typedef int \fBTcl_FSMatchInDirectoryProc\fR( - Tcl_Interp *\fIinterp\fR, - Tcl_Obj *\fIresultPtr\fR, - Tcl_Obj *\fIpathPtr\fR, - const char *\fIpattern\fR, - Tcl_GlobTypeData *\fItypes\fR); -.CE -.PP -The function should return all files or directories (or other filesystem -objects) which match the given pattern and accord with the \fItypes\fR -specification given. There are two ways in which this function may be -called. If \fIpattern\fR is NULL, then \fIpathPtr\fR is a full path -specification of a single file or directory which should be checked for -existence and correct type. Otherwise, \fIpathPtr\fR is a directory, the -contents of which the function should search for files or directories -which have the correct type. In either case, \fIpathPtr\fR can be -assumed to be both non-NULL and non-empty. It is not currently -documented whether \fIpathPtr\fR will have a file separator at its end of -not, so code should be flexible to both possibilities. -.PP -The return value is a standard Tcl result indicating whether an error -occurred in the matching process. Error messages are placed in -\fIinterp\fR, unless \fIinterp\fR in NULL in which case no error -message need be generated; on a \fBTCL_OK\fR result, results should be -added to the \fIresultPtr\fR value given (which can be assumed to be a -valid unshared Tcl list). The matches added -to \fIresultPtr\fR should include any path prefix given in \fIpathPtr\fR -(this usually means they will be absolute path specifications). -Note that if no matches are found, that simply leads to an empty -result; errors are only signaled for actual file or filesystem -problems which may occur during the matching process. -.PP -The \fBTcl_GlobTypeData\fR structure passed in the \fItypes\fR -parameter contains the following fields: -.PP -.CS -typedef struct Tcl_GlobTypeData { - /* Corresponds to bcdpfls as in 'find -t' */ - int \fItype\fR; - /* Corresponds to file permissions */ - int \fIperm\fR; - /* Acceptable mac type */ - Tcl_Obj *\fImacType\fR; - /* Acceptable mac creator */ - Tcl_Obj *\fImacCreator\fR; -} \fBTcl_GlobTypeData\fR; -.CE -.PP -There are two specific cases which it is important to handle correctly, -both when \fItypes\fR is non-NULL. The two cases are when \fItypes->types -& TCL_GLOB_TYPE_DIR\fR or \fItypes->types & TCL_GLOB_TYPE_MOUNT\fR are -true (and in particular when the other flags are false). In the first of -these cases, the function must list the contained directories. Tcl uses -this to implement recursive globbing, so it is critical that filesystems -implement directory matching correctly. In the second of these cases, -with \fBTCL_GLOB_TYPE_MOUNT\fR, the filesystem must list the mount points -which lie within the given \fIpathPtr\fR (and in this case, \fIpathPtr\fR -need not lie within the same filesystem - different to all other cases in -which this function is called). Support for this is critical if Tcl is -to have seamless transitions between from one filesystem to another. -.SS UTIMEPROC -.PP -Function to process a \fBTcl_FSUtime\fR call. Required to allow setting -(not reading) of times with \fBfile mtime\fR, \fBfile atime\fR and the -open-r/open-w/fcopy implementation of \fBfile copy\fR. -.PP -.CS -typedef int \fBTcl_FSUtimeProc\fR( - Tcl_Obj *\fIpathPtr\fR, - struct utimbuf *\fItval\fR); -.CE -.PP -The access and modification times of the file specified by \fIpathPtr\fR -should be changed to the values given in the \fItval\fR structure. -.PP -The return value should be 0 on success and -1 on an error, as -with the system \fButime\fR. -.SS LINKPROC -.PP -Function to process a \fBTcl_FSLink\fR call. Should be implemented -only if the filesystem supports links, and may otherwise be NULL. -.PP -.CS -typedef Tcl_Obj *\fBTcl_FSLinkProc\fR( - Tcl_Obj *\fIlinkNamePtr\fR, - Tcl_Obj *\fItoPtr\fR, - int \fIlinkAction\fR); -.CE -.PP -If \fItoPtr\fR is NULL, the function is being asked to read the -contents of a link. The result is a Tcl_Obj specifying the contents of -the link given by \fIlinkNamePtr\fR, or NULL if the link could -not be read. The result is owned by the caller (and should therefore -have its ref count incremented before being returned). Any callers -should call \fBTcl_DecrRefCount\fR on this result when it is no longer needed. -If \fItoPtr\fR is not NULL, the function should attempt to create a link. -The result in this case should be \fItoPtr\fR if the link was successful -and NULL otherwise. In this case the result is not owned by the caller -(i.e.\ no reference count manipulations on either end are needed). See -the documentation for \fBTcl_FSLink\fR for the correct interpretation -of the \fIlinkAction\fR flags. -.SS LISTVOLUMESPROC -.PP -Function to list any filesystem volumes added by this filesystem. -Should be implemented only if the filesystem adds volumes at the head -of the filesystem, so that they can be returned by \fBfile volumes\fR. -.PP -.CS -typedef Tcl_Obj *\fBTcl_FSListVolumesProc\fR(void); -.CE -.PP -The result should be a list of volumes added by this filesystem, or -NULL (or an empty list) if no volumes are provided. The result value -is considered to be owned by the filesystem (not by Tcl's core), but -should be given a reference count for Tcl. Tcl will use the contents of the -list and then decrement that reference count. This allows filesystems to -choose whether they actually want to retain a -.QW "master list" -of volumes -or not (if not, they generate the list on the fly and pass it to Tcl -with a reference count of 1 and then forget about the list, if yes, then -they simply increment the reference count of their master list and pass it -to Tcl which will copy the contents and then decrement the count back -to where it was). -.PP -Therefore, Tcl considers return values from this proc to be read-only. -.SS FILEATTRSTRINGSPROC -.PP -Function to list all attribute strings which are valid for this -filesystem. If not implemented the filesystem will not support -the \fBfile attributes\fR command. This allows arbitrary additional -information to be attached to files in the filesystem. If it is -not implemented, there is no need to implement the \fBget\fR and \fBset\fR -methods. -.PP -.CS -typedef const char *const *\fBTcl_FSFileAttrStringsProc\fR( - Tcl_Obj *\fIpathPtr\fR, - Tcl_Obj **\fIobjPtrRef\fR); -.CE -.PP -The called function may either return an array of strings, or may -instead return NULL and place a Tcl list into the given \fIobjPtrRef\fR. Tcl -will take that list and first increment its reference count before using it. -On completion of that use, Tcl will decrement its reference count. Hence if -the list should be disposed of by Tcl when done, it should have a -reference count of zero, and if the list should not be disposed of, the -filesystem should ensure it returns a value with a reference count -of at least one. -.SS FILEATTRSGETPROC -.PP -Function to process a \fBTcl_FSFileAttrsGet\fR call, used by \fBfile -attributes\fR. -.PP -.CS -typedef int \fBTcl_FSFileAttrsGetProc\fR( - Tcl_Interp *\fIinterp\fR, - int \fIindex\fR, - Tcl_Obj *\fIpathPtr\fR, - Tcl_Obj **\fIobjPtrRef\fR); -.CE -.PP -Returns a standard Tcl return code. The attribute value retrieved, -which corresponds to the \fIindex\fR'th element in the list returned by -the \fBTcl_FSFileAttrStringsProc\fR, is a Tcl_Obj placed in \fIobjPtrRef\fR (if -\fBTCL_OK\fR was returned) and is likely to have a reference count of zero. Either -way we must either store it somewhere (e.g.\ the Tcl result), or -Incr/Decr its reference count to ensure it is properly freed. -.SS FILEATTRSSETPROC -.PP -Function to process a \fBTcl_FSFileAttrsSet\fR call, used by \fBfile -attributes\fR. If the filesystem is read-only, there is no need -to implement this. -.PP -.CS -typedef int \fBTcl_FSFileAttrsSetProc\fR( - Tcl_Interp *\fIinterp\fR, - int \fIindex\fR, - Tcl_Obj *\fIpathPtr\fR, - Tcl_Obj *\fIobjPtr\fR); -.CE -.PP -The attribute value of the \fIindex\fR'th element in the list returned by -the Tcl_FSFileAttrStringsProc should be set to the \fIobjPtr\fR given. -.SS CREATEDIRECTORYPROC -.PP -Function to process a \fBTcl_FSCreateDirectory\fR call. Should be -implemented unless the FS is read-only. -.PP -.CS -typedef int \fBTcl_FSCreateDirectoryProc\fR( - Tcl_Obj *\fIpathPtr\fR); -.CE -.PP -The return value is a standard Tcl result indicating whether an error -occurred in the process. If successful, a new directory should have -been added to the filesystem in the location specified by -\fIpathPtr\fR. -.SS REMOVEDIRECTORYPROC -.PP -Function to process a \fBTcl_FSRemoveDirectory\fR call. Should be -implemented unless the FS is read-only. -.PP -.CS -typedef int \fBTcl_FSRemoveDirectoryProc\fR( - Tcl_Obj *\fIpathPtr\fR, - int \fIrecursive\fR, - Tcl_Obj **\fIerrorPtr\fR); -.CE -.PP -The return value is a standard Tcl result indicating whether an error -occurred in the process. If successful, the directory specified by -\fIpathPtr\fR should have been removed from the filesystem. If the -\fIrecursive\fR flag is given, then a non-empty directory should be -deleted without error. If this flag is not given, then and the -directory is non-empty a POSIX -.QW EEXIST -error should be signaled. If an -error does occur, the name of the file or directory which caused the -error should be placed in \fIerrorPtr\fR. -.SS DELETEFILEPROC -.PP -Function to process a \fBTcl_FSDeleteFile\fR call. Should be implemented -unless the FS is read-only. -.PP -.CS -typedef int \fBTcl_FSDeleteFileProc\fR( - Tcl_Obj *\fIpathPtr\fR); -.CE -.PP -The return value is a standard Tcl result indicating whether an error -occurred in the process. If successful, the file specified by -\fIpathPtr\fR should have been removed from the filesystem. Note that, -if the filesystem supports symbolic links, Tcl will always call this -function and not Tcl_FSRemoveDirectoryProc when needed to delete them -(even if they are symbolic links to directories). -.SH "FILESYSTEM EFFICIENCY" -.PP -These functions need not be implemented for a particular filesystem -because the core has a fallback implementation available. See each -individual description for the consequences of leaving the field NULL. -.SS LSTATPROC -.PP -Function to process a \fBTcl_FSLstat\fR call. If not implemented, Tcl -will attempt to use the \fIstatProc\fR defined above instead. Therefore -it need only be implemented if a filesystem can differentiate between -\fBstat\fR and \fBlstat\fR calls. -.PP -.CS -typedef int \fBTcl_FSLstatProc\fR( - Tcl_Obj *\fIpathPtr\fR, - Tcl_StatBuf *\fIstatPtr\fR); -.CE -.PP -The behavior of this function is very similar to that of the -\fBTcl_FSStatProc\fR defined above, except that if it is applied -to a symbolic link, it returns information about the link, not -about the target file. -.SS COPYFILEPROC -.PP -Function to process a \fBTcl_FSCopyFile\fR call. If not implemented Tcl -will fall back on \fBopen\fR-r, \fBopen\fR-w and \fBfcopy\fR as a -copying mechanism. -Therefore it need only be implemented if the filesystem can perform -that action more efficiently. -.PP -.CS -typedef int \fBTcl_FSCopyFileProc\fR( - Tcl_Obj *\fIsrcPathPtr\fR, - Tcl_Obj *\fIdestPathPtr\fR); -.CE -.PP -The return value is a standard Tcl result indicating whether an error -occurred in the copying process. Note that, \fIdestPathPtr\fR is the -name of the file which should become the copy of \fIsrcPathPtr\fR. It -is never the name of a directory into which \fIsrcPathPtr\fR could be -copied (i.e.\ the function is much simpler than the Tcl level \fBfile -copy\fR subcommand). Note that, -if the filesystem supports symbolic links, Tcl will always call this -function and not \fIcopyDirectoryProc\fR when needed to copy them -(even if they are symbolic links to directories). Finally, if the -filesystem determines it cannot support the \fBfile copy\fR action, -calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR -result will tell Tcl to use its standard fallback mechanisms. -.SS RENAMEFILEPROC -.PP -Function to process a \fBTcl_FSRenameFile\fR call. If not implemented, -Tcl will fall back on a copy and delete mechanism. Therefore it need -only be implemented if the filesystem can perform that action more -efficiently. -.PP -.CS -typedef int \fBTcl_FSRenameFileProc\fR( - Tcl_Obj *\fIsrcPathPtr\fR, - Tcl_Obj *\fIdestPathPtr\fR); -.CE -.PP -The return value is a standard Tcl result indicating whether an error -occurred in the renaming process. If the -filesystem determines it cannot support the \fBfile rename\fR action, -calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR -result will tell Tcl to use its standard fallback mechanisms. -.SS COPYDIRECTORYPROC -.PP -Function to process a \fBTcl_FSCopyDirectory\fR call. If not -implemented, Tcl will fall back on a recursive \fBfile mkdir\fR, \fBfile copy\fR -mechanism. Therefore it need only be implemented if the filesystem can -perform that action more efficiently. -.PP -.CS -typedef int \fBTcl_FSCopyDirectoryProc\fR( - Tcl_Obj *\fIsrcPathPtr\fR, - Tcl_Obj *\fIdestPathPtr\fR, - Tcl_Obj **\fIerrorPtr\fR); -.CE -.PP -The return value is a standard Tcl result indicating whether an error -occurred in the copying process. If an error does occur, the name of -the file or directory which caused the error should be placed in -\fIerrorPtr\fR. Note that, \fIdestPathPtr\fR is the name of the -directory-name which should become the mirror-image of -\fIsrcPathPtr\fR. It is not the name of a directory into which -\fIsrcPathPtr\fR should be copied (i.e.\ the function is much simpler -than the Tcl level \fBfile copy\fR subcommand). Finally, if the -filesystem determines it cannot support the directory copy action, -calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR -result will tell Tcl to use its standard fallback mechanisms. -.SS LOADFILEPROC -.PP -Function to process a \fBTcl_FSLoadFile\fR call. If not implemented, Tcl -will fall back on a copy to native-temp followed by a \fBTcl_FSLoadFile\fR on -that temporary copy. Therefore it need only be implemented if the -filesystem can load code directly, or it can be implemented simply to -return \fBTCL_ERROR\fR to disable load functionality in this filesystem -entirely. -.PP -.CS -typedef int \fBTcl_FSLoadFileProc\fR( - Tcl_Interp *\fIinterp\fR, - Tcl_Obj *\fIpathPtr\fR, - Tcl_LoadHandle *\fIhandlePtr\fR, - Tcl_FSUnloadFileProc *\fIunloadProcPtr\fR); -.CE -.PP -Returns a standard Tcl completion code. If an error occurs, an error -message is left in the \fIinterp\fR's result. The function dynamically loads a -binary code file into memory. On a successful load, the \fIhandlePtr\fR -should be filled with a token for the dynamically loaded file, and the -\fIunloadProcPtr\fR should be filled in with the address of a procedure. -The unload procedure will be called with the given \fBTcl_LoadHandle\fR as its -only parameter when Tcl needs to unload the file. For example, for the -native filesystem, the \fBTcl_LoadHandle\fR returned is currently a token -which can be used in the private \fBTclpFindSymbol\fR to access functions -in the new code. Each filesystem is free to define the -\fBTcl_LoadHandle\fR as it requires. Finally, if the -filesystem determines it cannot support the file load action, -calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR -result will tell Tcl to use its standard fallback mechanisms. -.SS UNLOADFILEPROC -.PP -Function to unload a previously successfully loaded file. If load was -implemented, then this should also be implemented, if there is any -cleanup action required. -.PP -.CS -typedef void \fBTcl_FSUnloadFileProc\fR( - Tcl_LoadHandle \fIloadHandle\fR); -.CE -.SS GETCWDPROC -.PP -Function to process a \fBTcl_FSGetCwd\fR call. Most filesystems need not -implement this. It will usually only be called once, if \fBgetcwd\fR is -called before \fBchdir\fR. May be NULL. -.PP -.CS -typedef Tcl_Obj *\fBTcl_FSGetCwdProc\fR( - Tcl_Interp *\fIinterp\fR); -.CE -.PP -If the filesystem supports a native notion of a current working -directory (which might perhaps change independent of Tcl), this -function should return that cwd as the result, or NULL if the current -directory could not be determined (e.g.\ the user does not have -appropriate permissions on the cwd directory). If NULL is returned, an -error message is left in the \fIinterp\fR's result. -.SS CHDIRPROC -.PP -Function to process a \fBTcl_FSChdir\fR call. If filesystems do not -implement this, it will be emulated by a series of directory access -checks. Otherwise, virtual filesystems which do implement it need only -respond with a positive return result if the \fIpathPtr\fR is a valid, -accessible directory in their filesystem. They need not remember the -result, since that will be automatically remembered for use by -\fBTcl_FSGetCwd\fR. -Real filesystems should carry out the correct action (i.e.\ call the -correct system \fBchdir\fR API). -.PP -.CS -typedef int \fBTcl_FSChdirProc\fR( - Tcl_Obj *\fIpathPtr\fR); -.CE -.PP -The \fBTcl_FSChdirProc\fR changes the applications current working -directory to the value specified in \fIpathPtr\fR. The function returns --1 on error or 0 on success. -.SH "SEE ALSO" -cd(n), file(n), filename(n), load(n), open(n), pwd(n), source(n), unload(n) -.SH KEYWORDS -stat, access, filesystem, vfs, virtual filesystem |