| '\" |
| '\" Copyright (c) 2001 Vincent Darley |
| '\" |
| '\" See the file "license.terms" for information on usage and redistribution |
| '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
| '\" |
| '\" RCS: @(#) $Id: FileSystem.3,v 1.3 2003/01/21 19:39:58 hunt Exp $ |
| '\" |
| '\" The definitions below are for supplemental macros used in Tcl/Tk |
| '\" manual entries. |
| '\" |
| '\" .AP type name in/out ?indent? |
| '\" Start paragraph describing an argument to a library procedure. |
| '\" type is type of argument (int, etc.), in/out is either "in", "out", |
| '\" or "in/out" to describe whether procedure reads or modifies arg, |
| '\" and indent is equivalent to second arg of .IP (shouldn't ever be |
| '\" needed; use .AS below instead) |
| '\" |
| '\" .AS ?type? ?name? |
| '\" Give maximum sizes of arguments for setting tab stops. Type and |
| '\" name are examples of largest possible arguments that will be passed |
| '\" to .AP later. If args are omitted, default tab stops are used. |
| '\" |
| '\" .BS |
| '\" Start box enclosure. From here until next .BE, everything will be |
| '\" enclosed in one large box. |
| '\" |
| '\" .BE |
| '\" End of box enclosure. |
| '\" |
| '\" .CS |
| '\" Begin code excerpt. |
| '\" |
| '\" .CE |
| '\" End code excerpt. |
| '\" |
| '\" .VS ?version? ?br? |
| '\" Begin vertical sidebar, for use in marking newly-changed parts |
| '\" of man pages. The first argument is ignored and used for recording |
| '\" the version when the .VS was added, so that the sidebars can be |
| '\" found and removed when they reach a certain age. If another argument |
| '\" is present, then a line break is forced before starting the sidebar. |
| '\" |
| '\" .VE |
| '\" End of vertical sidebar. |
| '\" |
| '\" .DS |
| '\" Begin an indented unfilled display. |
| '\" |
| '\" .DE |
| '\" End of indented unfilled display. |
| '\" |
| '\" .SO |
| '\" Start of list of standard options for a Tk widget. The |
| '\" options follow on successive lines, in four columns separated |
| '\" by tabs. |
| '\" |
| '\" .SE |
| '\" End of list of standard options for a Tk widget. |
| '\" |
| '\" .OP cmdName dbName dbClass |
| '\" Start of description of a specific option. cmdName gives the |
| '\" option's name as specified in the class command, dbName gives |
| '\" the option's name in the option database, and dbClass gives |
| '\" the option's class in the option database. |
| '\" |
| '\" .UL arg1 arg2 |
| '\" Print arg1 underlined, then print arg2 normally. |
| '\" |
| '\" RCS: @(#) $Id: man.macros,v 1.4 2000/08/25 06:18:32 ericm Exp $ |
| '\" |
| '\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. |
| .if t .wh -1.3i ^B |
| .nr ^l \n(.l |
| .ad b |
| '\" # Start an argument description |
| .de AP |
| .ie !"\\$4"" .TP \\$4 |
| .el \{\ |
| . ie !"\\$2"" .TP \\n()Cu |
| . el .TP 15 |
| .\} |
| .ta \\n()Au \\n()Bu |
| .ie !"\\$3"" \{\ |
| \&\\$1 \\fI\\$2\\fP (\\$3) |
| .\".b |
| .\} |
| .el \{\ |
| .br |
| .ie !"\\$2"" \{\ |
| \&\\$1 \\fI\\$2\\fP |
| .\} |
| .el \{\ |
| \&\\fI\\$1\\fP |
| .\} |
| .\} |
| .. |
| '\" # define tabbing values for .AP |
| .de AS |
| .nr )A 10n |
| .if !"\\$1"" .nr )A \\w'\\$1'u+3n |
| .nr )B \\n()Au+15n |
| .\" |
| .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n |
| .nr )C \\n()Bu+\\w'(in/out)'u+2n |
| .. |
| .AS Tcl_Interp Tcl_CreateInterp in/out |
| '\" # BS - start boxed text |
| '\" # ^y = starting y location |
| '\" # ^b = 1 |
| .de BS |
| .br |
| .mk ^y |
| .nr ^b 1u |
| .if n .nf |
| .if n .ti 0 |
| .if n \l'\\n(.lu\(ul' |
| .if n .fi |
| .. |
| '\" # BE - end boxed text (draw box now) |
| .de BE |
| .nf |
| .ti 0 |
| .mk ^t |
| .ie n \l'\\n(^lu\(ul' |
| .el \{\ |
| .\" Draw four-sided box normally, but don't draw top of |
| .\" box if the box started on an earlier page. |
| .ie !\\n(^b-1 \{\ |
| \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' |
| .\} |
| .el \}\ |
| \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' |
| .\} |
| .\} |
| .fi |
| .br |
| .nr ^b 0 |
| .. |
| '\" # VS - start vertical sidebar |
| '\" # ^Y = starting y location |
| '\" # ^v = 1 (for troff; for nroff this doesn't matter) |
| .de VS |
| .if !"\\$2"" .br |
| .mk ^Y |
| .ie n 'mc \s12\(br\s0 |
| .el .nr ^v 1u |
| .. |
| '\" # VE - end of vertical sidebar |
| .de VE |
| .ie n 'mc |
| .el \{\ |
| .ev 2 |
| .nf |
| .ti 0 |
| .mk ^t |
| \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' |
| .sp -1 |
| .fi |
| .ev |
| .\} |
| .nr ^v 0 |
| .. |
| '\" # Special macro to handle page bottom: finish off current |
| '\" # box/sidebar if in box/sidebar mode, then invoked standard |
| '\" # page bottom macro. |
| .de ^B |
| .ev 2 |
| 'ti 0 |
| 'nf |
| .mk ^t |
| .if \\n(^b \{\ |
| .\" Draw three-sided box if this is the box's first page, |
| .\" draw two sides but no top otherwise. |
| .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c |
| .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c |
| .\} |
| .if \\n(^v \{\ |
| .nr ^x \\n(^tu+1v-\\n(^Yu |
| \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c |
| .\} |
| .bp |
| 'fi |
| .ev |
| .if \\n(^b \{\ |
| .mk ^y |
| .nr ^b 2 |
| .\} |
| .if \\n(^v \{\ |
| .mk ^Y |
| .\} |
| .. |
| '\" # DS - begin display |
| .de DS |
| .RS |
| .nf |
| .sp |
| .. |
| '\" # DE - end display |
| .de DE |
| .fi |
| .RE |
| .sp |
| .. |
| '\" # SO - start of list of standard options |
| .de SO |
| .SH "STANDARD OPTIONS" |
| .LP |
| .nf |
| .ta 5.5c 11c |
| .ft B |
| .. |
| '\" # SE - end of list of standard options |
| .de SE |
| .fi |
| .ft R |
| .LP |
| See the \\fBoptions\\fR manual entry for details on the standard options. |
| .. |
| '\" # OP - start of full description for a single option |
| .de OP |
| .LP |
| .nf |
| .ta 4c |
| Command-Line Name: \\fB\\$1\\fR |
| Database Name: \\fB\\$2\\fR |
| Database Class: \\fB\\$3\\fR |
| .fi |
| .IP |
| .. |
| '\" # CS - begin code excerpt |
| .de CS |
| .RS |
| .nf |
| .ta .25i .5i .75i 1i |
| .. |
| '\" # CE - end code excerpt |
| .de CE |
| .fi |
| .RE |
| .. |
| .de UL |
| \\$1\l'|0\(ul'\\$2 |
| .. |
| .TH Filesystem 3 8.4 Tcl "Tcl Library Procedures" |
| .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_FSLoadFile, 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_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 |
| Tcl_Filesystem* |
| \fBTcl_FSGetFileSystemForPath\fR(\fIpathObjPtr\fR) |
| .sp |
| Tcl_PathType |
| \fBTcl_FSGetPathType\fR(\fIpathObjPtr\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_FSEvalFile\fR(\fIinterp, pathPtr\fR) |
| .sp |
| int |
| \fBTcl_FSLoadFile\fR(\fIinterp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr, handlePtr, unloadProcPtr\fR) |
| .sp |
| int |
| \fBTcl_FSMatchInDirectory\fR(\fIinterp, result, 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** |
| \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 char* |
| \fBTcl_FSGetNativePath\fR(\fIpathPtr\fR) |
| .sp |
| Tcl_Obj* |
| \fBTcl_FSFileSystemInfo\fR(\fIpathPtr\fR) |
| .sp |
| Tcl_StatBuf* |
| \fBTcl_AllocStatBuf\fR() |
| .SH ARGUMENTS |
| .AS Tcl_Filesystem *fsPtr in |
| .AP 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 object is used for the operation in |
| question. If the object does not already have an internal \fBpath\fR |
| representation, it will be converted to have one. |
| .AP Tcl_Obj *srcPathPtr in |
| As for \fBpathPtr\fR, but used for the source file for a copy or |
| rename operation. |
| .AP Tcl_Obj *destPathPtr in |
| As for \fBpathPtr\fR, but used for the destination filename for a copy or |
| rename operation. |
| .AP "CONST char" *pattern in |
| Only files or directories matching this pattern will be returned by |
| \fBTcl_FSMatchInDirectory\fR. |
| .AP GlobTypeData *types in |
| Only files or directories matching the type descriptions contained in |
| this structure will be returned by \fBTcl_FSMatchInDirectory\fR. It |
| is very important that the 'directory' flag is properly handled. |
| 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 object to create. |
| .AP Tcl_Obj *firstPtr in |
| The first of two path objects to compare. The object may be converted |
| to \fBpath\fR type. |
| .AP Tcl_Obj *secondPtr in |
| The second of two path objects to compare. The object 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 listObj 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 an object containing the name of |
| the file which caused an error in the various copy/rename operations. |
| .AP Tcl_Obj **objPtrRef out |
| Filled with an object containing the result of the operation. |
| .AP Tcl_Obj *result out |
| Pre-allocated object in which to store (by lappending) the list of |
| files or directories which are successfully matched in |
| \fBTcl_FSMatchInDirectory\fR. |
| .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 TclfsUnloadFileProc_ **unloadProcPtr out |
| Filled with the function to use to unload this piece of code. |
| .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. |
| .BE |
| |
| .SH DESCRIPTION |
| .PP |
| There are several reasons for calling the \fBTcl_FS...\fR functions |
| 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, MacOS 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 '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 'virtual filesystem aware'. Any virtual |
| filesystem 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 'files' which are not |
| native files in the native filesystem. This also means that any Tcl |
| extension which accesses the filesystem through this API is |
| automatically '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 vfs's have been registered, the '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 'struct stat' buffer 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 are objectified 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 objects |
| with a refCount 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 object, and so one must not assume |
| that after any of these calls return, the object still has a refCount of |
| zero - it may have been incremented), or in a direct segfault |
| due to the object being freed part way through the complex object |
| manipulation required to ensure that the path is fully normalized and |
| absolute for filesystem determination. The practical lesson to learn |
| from this is that \fBTcl_Obj *path = Tcl_NewStringObj(...) ; |
| Tcl_FS...(path) ; Tcl_DecrRefCount(path)\fR is wrong, and may segfault. |
| The 'path' must have its refCount incremented before passing it in, or |
| decrementing it. For this reason, objects with a refCount of zero are |
| considered not to be valid filesystem paths and calling any Tcl_FS API |
| with such an object will result in no action being taken. |
| .PP |
| \fBTcl_FSCopyFile\fR attempts to copy the file given by srcPathPtr to the |
| path name given by destPathPtr. If the two paths given lie in the same |
| filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that |
| filesystem's 'copy file' function is called (if it is non-NULL). |
| Otherwise the function returns -1 and sets Tcl's errno to the 'EXDEV' |
| posix error code (which signifies a 'cross-domain link'). |
| .PP |
| \fBTcl_FSCopyDirectory\fR attempts to copy the directory given by srcPathPtr to the |
| path name given by destPathPtr. If the two paths given lie in the same |
| filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that |
| filesystem's 'copy file' function is called (if it is non-NULL). |
| Otherwise the function returns -1 and sets Tcl's errno to the 'EXDEV' |
| posix error code (which signifies a 'cross-domain link'). |
| .PP |
| \fBTcl_FSCreateDirectory\fR attempts to create the directory given by |
| pathPtr by calling the owning filesystem's 'create directory' |
| function. |
| .PP |
| \fBTcl_FSDeleteFile\fR attempts to delete the file given by |
| pathPtr by calling the owning filesystem's 'delete file' |
| function. |
| .PP |
| \fBTcl_FSRemoveDirectory\fR attempts to remove the directory given by |
| pathPtr by calling the owning filesystem's 'remove directory' |
| function. |
| .PP |
| \fBTcl_FSRenameFile\fR attempts to rename the file or directory given by |
| srcPathPtr to the path name given by destPathPtr. If the two paths |
| given lie in the same filesystem (according to |
| \fBTcl_FSGetFileSystemForPath\fR) then that filesystem's 'rename file' |
| function is called (if it is non-NULL). Otherwise the function returns -1 |
| and sets Tcl's errno to the 'EXDEV' posix error code (which signifies |
| a ``cross-domain link''). |
| .PP |
| \fBTcl_FSListVolumes\fR calls each filesystem which has a non-NULL '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 refCount of 0). |
| .PP |
| \fBTcl_FSEvalFile\fR reads the file given by \fIpathPtr\fR and evaluates |
| its contents as a Tcl script. It returns the same information as |
| \fBTcl_EvalObjEx\fR. |
| If the file couldn't be read then a Tcl error is returned to describe |
| why the file couldn't be read. |
| The eofchar for files is '\\32' (^Z) for all platforms. |
| If you require a ``^Z'' in code for string comparison, you can use |
| ``\\032'' or ``\\u001a'', which will be safely substituted by the Tcl |
| interpreter into ``^Z''. |
| .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 pathPtr |
| 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. |
| .PP |
| Returns a standard Tcl completion code. If an error occurs, an error |
| message is left in the interp's result. |
| .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 pathPtr 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, but good |
| results are placed in the resultPtr given. |
| |
| Note that the 'glob' code implements recursive patterns internally, so |
| this function will only ever be passed simple patterns, which can be |
| matched using the logic of 'string match'. To handle recursion, Tcl |
| will call this function frequently asking only for directories to be |
| returned. |
| .PP |
| \fBTcl_FSLink\fR replaces the library version of readlink(), and |
| extends it to support the creation of links. The appropriate function |
| for the filesystem to which linkNamePtr belongs will be called. |
| .PP |
| If the \fItoPtr\fR is NULL, a readlink 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 Tcl_DecrRefCount 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 or'd combination of TCL_CREATE_SYMBOLIC_LINK and TCL_CREATE_HARD_LINK. |
| 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 should be |
| returned. |
| .PP |
| \fBTcl_FSLstat\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 creation |
| time. |
| .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 |
| For results see 'utime' documentation. If successful, the function |
| will update the 'atime' and 'mtime' values of the file given. |
| .PP |
| \fBTcl_FSFileAttrsGet\fR implements read access for the hookable 'file |
| attributes' subcommand. The appropriate function for the filesystem to |
| which pathPtr belongs will be called. |
| .PP |
| If the result is TCL_OK, then an object was placed in objPtrRef, which |
| will only be temporarily valid (unless Tcl_IncrRefCount is called). |
| .PP |
| \fBTcl_FSFileAttrsSet\fR implements write access for the hookable 'file |
| attributes' subcommand. The appropriate function for the filesystem to |
| which pathPtr belongs will be called. |
| .PP |
| \fBTcl_FSFileAttrStrings\fR implements part of the hookable 'file attributes' |
| subcommand. The appropriate function for the filesystem to which |
| pathPtr 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 objPtrRef. Tcl |
| will take that list and first increment its refCount before using it. |
| On completion of that use, Tcl will decrement its refCount. Hence if |
| the list should be disposed of by Tcl when done, it should have a |
| refCount of zero, and if the list should not be disposed of, the |
| filesystem should ensure it retains a refCount on the object. |
| .PP |
| \fBTcl_FSAccess\fR checks whether the process would be allowed to read, |
| write or test for existence of the file (or other file system object) |
| whose name is pathname. If pathname 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 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 creation |
| time. |
| .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, described below. |
| If one of the standard channels, \fBstdin, stdout\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 getcwd(). |
| .PP |
| It returns the Tcl library's current working directory. This may be |
| different to the native platform's working directory, in the case for |
| which the cwd 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 interp's result. |
| |
| The result already has its refCount incremented for the caller. When |
| it is no longer needed, that refCount 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 chdir(). 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 stat and access to check whether the directory exists |
| and has appropriate permissions. |
| .PP |
| For results, see chdir() documentation. If successful, we keep a |
| record of the successful path in cwdPathPtr for subsequent calls to |
| getcwd. |
| .PP |
| \fBTcl_FSPathSeparator\fR returns the separator character to be used for |
| most specific element of the path specified by pathPtr (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 should be a valid list, |
| and returns the path object given by considering the first 'elements' |
| elements as valid path segments. If elements < 0, we use the entire |
| list. |
| .PP |
| Returns object with refCount of zero, containing the joined path. |
| .PP |
| \fBTcl_FSSplitPath\fR takes the given Tcl_Obj, which should be a valid path, |
| and returns a Tcl List object containing each segment of that path as |
| an element. |
| .PP |
| Returns list object with refCount of zero. If the passed in lenPtr is |
| non-NULL, we use it to return the number of elements in the returned |
| list. |
| .PP |
| \fBTcl_FSEqualPaths\fR tests whether the two paths given represent the same |
| filesystem object |
| .PP |
| 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 object, with refCount of zero, 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. |
| .PP |
| \fBTcl_FSJoinToPath\fR takes the given object, which should usually be a |
| valid path or NULL, and joins onto it the array of paths segments |
| given. |
| .PP |
| Returns object with refCount of zero, containing the joined path. |
| .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 object is already supposedly of the correct type. |
| The filename may begin with "~" (to indicate current user's home |
| directory) or "~<user>" (to indicate any user's home directory). |
| .PP |
| If the conversion succeeds (i.e. the object is a valid path in one of |
| the current filesystems), then TCL_OK is returned. Otherwise |
| TCL_ERROR is returned, and an error message may |
| be left in the interpreter. |
| .PP |
| \fBTcl_FSGetInternalRep\fR extracts the internal representation of a given |
| path object, in the given filesystem. If the path object 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 object is a valid path), then it |
| is returned. Otherwise NULL will be returned, and an error message may |
| be left in the interpreter. A "translated" path is one which |
| contains no "~" or "~user" sequences (these have been expanded to |
| their current representation in the filesystem). |
| .PP |
| \fBTcl_FSGetTranslatedStringPath\fR does the same as |
| \fBTcl_FSGetTranslatedPath\fR, but returns a character string or NULL. |
| .PP |
| \fBTcl_FSNewNativePath\fR performs something like that reverse of the |
| usual obj->path->nativerep conversions. If some code retrieves a path |
| in native form (from, e.g. readlink 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 object type. |
| .PP |
| The resulting object is a pure 'path' object, 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/MacOS 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, and assumes the native |
| representation is string-based. It may be desirable in the future |
| to have non-string-based native representations (for example, on |
| MacOS, 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 containing the |
| complete, absolute path in the native encoding. |
| .PP |
| The native representation is cached so that repeated calls to this |
| function will not require additional conversions. |
| .PP |
| \fBTcl_FSFileSystemInfo\fR returns a list of two elements. The first |
| element is the name of the filesystem (e.g. "native" or "vfs" or "zip" |
| or "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 object is returned, unless the path object is not |
| recognized, when NULL will be returned. |
| .PP |
| \fBTcl_FSGetFileSystemForPath\fR returns the 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 TCL_PATH_ABSOLUTE, TCL_PATH_RELATIVE, or |
| TCL_PATH_VOLUME_RELATIVE |
| .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 |
| .SH TCL_FILESYSTEM |
| .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). TCL_OK will be returned. |
| .PP |
| \fBTcl_FSUnregister\fR removes the given filesystem structure from |
| the list of known filesystems, if it is known, and returns TCL_OK. If |
| the filesystem is not currently registered, TCL_ERROR 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. |
| .PP |
| The \fBTcl_Filesystem\fR structure contains the following fields: |
| .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; |
| } Tcl_Filesystem; |
| .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 'file rename' 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_FSRenameFile\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 (lstat, load, getcwd and chdir) |
| for which fallbacks do in fact occur at the C level. |
| .PP |
| As an example, here is the filesystem lookup table used by the |
| "vfs" extension which allows filesystem actions to be implemented |
| in Tcl. |
| .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 - fallback will occur at Tcl level */ |
| NULL, |
| /* No rename file - fallback will occur at Tcl level */ |
| NULL, |
| /* No copy directory - fallback will occur at Tcl level */ |
| NULL, |
| /* Core will use stat for lstat */ |
| NULL, |
| /* No load - fallback on core implementation */ |
| NULL, |
| /* We don't need a getcwd or chdir - fallback on Tcl's versions */ |
| NULL, |
| NULL |
| }; |
| .CE |
| .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. |
| .SH TYPENAME |
| .PP |
| The \fItypeName\fR field contains a null-terminated string that |
| identifies the type of the filesystem implemented, e.g. |
| \fBnative\fR or \fBzip\fR or \fBvfs\fR. |
| .PP |
| .SH "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. |
| .SH VERSION |
| .PP |
| The \fIversion\fR field should be set to \fBTCL_FILESYSTEM_VERSION_1\fR. |
| .SH "FILESYSTEM INFRASTRUCTURE" |
| .PP |
| These fields contain 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. |
| .SH PATHINFILESYSTEMPROC |
| .PP |
| The \fIpathInFilesystemProc\fR field contains the address of a function |
| which is called to determine whether a given path object 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, \fBTCL_ERROR\fR should be |
| returned. If \fBTCL_OK\fR is returned, then the optional |
| \fBclientDataPtr\fR output parameter can be used to return an internal |
| (filesystem specific) representation of the path, which will be cached |
| inside the path object, 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 Tcl_FSPathInFilesystemProc( |
| Tcl_Obj *\fIpathPtr\fR, |
| ClientData *\fIclientDataPtr\fR); |
| .CE |
| .SH DUPINTERNALREPPROC |
| .PP |
| This function makes a copy of a path's internal representation, and is |
| called when Tcl needs to duplicate a path object. If NULL, Tcl will |
| simply not copy the internal representation, which may then need to be |
| regenerated later. |
| .PP |
| .CS |
| typedef ClientData Tcl_FSDupInternalRepProc( |
| ClientData \fIclientData\fR); |
| .CE |
| .SH 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 Tcl_FSFreeInternalRepProc( |
| ClientData \fIclientData\fR); |
| .CE |
| .SH INTERNALTONORMALIZEDPROC |
| .PP |
| Function to convert internal representation to a normalized path. Only |
| required if the filesystem creates pure path objects with no string/path |
| representation. The return value is a Tcl object whose string |
| representation is the normalized path. |
| .PP |
| .CS |
| typedef Tcl_Obj* Tcl_FSInternalToNormalizedProc( |
| ClientData \fIclientData\fR); |
| .CE |
| .SH CREATEINTERNALREPPROC |
| .PP |
| Function to take a path object, and calculate an internal |
| representation for it, and store that native representation in the |
| object. 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 Tcl_FSCreateInternalRepProc( |
| Tcl_Obj *\fIpathPtr\fR); |
| .CE |
| .SH NORMALIZEPATHPROC |
| .PP |
| Function to normalize a path. Should be implemented for all |
| filesystems which can have multiple string representations for the same |
| path object. In Tcl, every 'path' must have a single unique '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 '~', 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 object 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 'file |
| delete', 'file rename', 'file copy' operating on symbolic links. |
| .PP |
| .CS |
| typedef int Tcl_FSNormalizePathProc( |
| 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). |
| .SH 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 '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 "networked", "zip" |
| or "ftp". The Tcl_Obj result is owned by the filesystem and so Tcl will |
| increment the refCount of that object if it wishes to retain a reference |
| to it. |
| .PP |
| .CS |
| typedef Tcl_Obj* Tcl_FSFilesystemPathTypeProc( |
| Tcl_Obj *\fIpathPtr\fR); |
| .CE |
| .SH FILESYSTEMSEPARATORPROC |
| .PP |
| Function to return the separator character(s) for this filesystem. |
| Must be implemented, otherwise the \fBfile separator\fR command will not |
| function correctly. The usual return value will be a Tcl_Obj |
| containing the string "/". |
| .PP |
| .CS |
| typedef Tcl_Obj* Tcl_FSFilesystemSeparatorProc( |
| Tcl_Obj *\fIpathPtr\fR); |
| .CE |
| .SH 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 Tcl_FSStatProc( |
| 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 creation |
| 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. |
| .SH 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 Tcl_FSAccessProc( |
| 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 file system |
| object) whose name is pathname. If pathname is a symbolic link, then |
| 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. |
| .PP |
| .SH 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 Tcl_FSOpenFileChannelProc( |
| 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 is not registered in the supplied |
| interpreter; to register it, use \fBTcl_RegisterChannel\fR. If one of |
| the standard channels, \fBstdin, stdout\fR or \fBstderr\fR was |
| previously closed, the act of creating the new channel also assigns it |
| as a replacement for the standard channel. |
| .SH 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 'encoding names' |
| which use glob functionality internally). |
| .PP |
| .CS |
| typedef int Tcl_FSMatchInDirectoryProc( |
| Tcl_Interp* \fIinterp\fR, |
| Tcl_Obj *\fIresult\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. |
| .PP |
| The return value is a standard Tcl result indicating whether an error |
| occurred in the matching process. Error messages are placed in interp, |
| but on a TCL_OK result, the interpreter should not be modified, but |
| rather results should be added to the \fIresult\fR object given |
| (which can be assumed to be a valid Tcl list). The matches added |
| to \fIresult\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. |
| .SH UTIMEPROC |
| .PP |
| Function to process a \fBTcl_FSUtime()\fR call. Required to allow setting |
| (not reading) of times with 'file mtime', 'file atime' and the |
| open-r/open-w/fcopy implementation of 'file copy'. |
| .PP |
| .CS |
| typedef int Tcl_FSUtimeProc( |
| 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 is a standard Tcl result indicating whether an error |
| occurred in the process. |
| .SH 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* Tcl_FSLinkProc( |
| 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, which should call |
| Tcl_DecrRefCount when the result 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. See |
| the documentation for \fBTcl_FSLink\fR for the correct interpretation |
| of the \fIlinkAction\fR flags. |
| .SH 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 'file volumes'. |
| .PP |
| .CS |
| typedef Tcl_Obj* Tcl_FSListVolumesProc(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 object |
| is considered to be owned by the filesystem (not by Tcl's core), but |
| should be given a refCount for Tcl. Tcl will use the contents of the |
| list and then decrement that refCount. This allows filesystems to |
| choose whether they actually want to retain a 'master list' of volumes |
| or not (if not, they generate the list on the fly and pass it to Tcl |
| with a refCount of 1 and then forget about the list, if yes, then |
| they simply increment the refCount 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. |
| .PP |
| .SH 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** Tcl_FSFileAttrStringsProc( |
| 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 objPtrRef. Tcl |
| will take that list and first increment its refCount before using it. |
| On completion of that use, Tcl will decrement its refCount. Hence if |
| the list should be disposed of by Tcl when done, it should have a |
| refCount of zero, and if the list should not be disposed of, the |
| filesystem should ensure it retains a refCount on the object. |
| .SH FILEATTRSGETPROC |
| .PP |
| Function to process a \fBTcl_FSFileAttrsGet()\fR call, used by 'file |
| attributes'. |
| .PP |
| .CS |
| typedef int Tcl_FSFileAttrsGetProc( |
| 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 Tcl_FSFileAttrStringsProc, is a Tcl_Obj placed in objPtrRef (if |
| TCL_OK was returned) and is likely to have a refCount of zero. Either |
| way we must either store it somewhere (e.g. the Tcl result), or |
| Incr/Decr its refCount to ensure it is properly freed. |
| .SH FILEATTRSSETPROC |
| .PP |
| Function to process a \fBTcl_FSFileAttrsSet()\fR call, used by 'file |
| attributes'. If the filesystem is read-only, there is no need |
| to implement this. |
| .PP |
| .CS |
| typedef int Tcl_FSFileAttrsSetProc( |
| 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. |
| .SH CREATEDIRECTORYPROC |
| .PP |
| Function to process a \fBTcl_FSCreateDirectory()\fR call. Should be |
| implemented unless the FS is read-only. |
| .PP |
| .CS |
| typedef int Tcl_FSCreateDirectoryProc( |
| 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. |
| .SH REMOVEDIRECTORYPROC |
| .PP |
| Function to process a 'Tcl_FSRemoveDirectory()' call. Should be |
| implemented unless the FS is read-only. |
| .PP |
| .CS |
| typedef int Tcl_FSRemoveDirectoryProc( |
| 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 an error does occur, the name of |
| the file or directory which caused the error should be placed in |
| \fIerrorPtr\fR. |
| .SH DELETEFILEPROC |
| .PP |
| Function to process a \fBTcl_FSDeleteFile()\fR call. Should be implemented |
| unless the FS is read-only. |
| .PP |
| .CS |
| typedef int Tcl_FSDeleteFileProc( |
| 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 |
| .SH 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 Tcl_FSLstatProc( |
| Tcl_Obj *\fIpathPtr\fR, |
| Tcl_StatBuf *\fIstatPtr\fR); |
| .CE |
| .PP |
| The behavior of this function is very similar to that of the |
| Tcl_FSStatProc defined above, except that if it is applied |
| to a symbolic link, it returns information about the link, not |
| about the target file. |
| .PP |
| .SH COPYFILEPROC |
| .PP |
| Function to process a \fBTcl_FSCopyFile()\fR call. If not implemented Tcl |
| will fall back on open-r, open-w and fcopy as a copying mechanism. |
| Therefore it need only be implemented if the filesystem can perform |
| that action more efficiently. |
| .PP |
| .CS |
| typedef int Tcl_FSCopyFileProc( |
| 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 'file |
| copy' subcommand). Note that, |
| if the filesystem supports symbolic links, Tcl will always call this |
| function and not Tcl_FSCopyDirectoryProc when needed to copy them |
| (even if they are symbolic links to directories). |
| .SH 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 Tcl_FSRenameFileProc( |
| 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. |
| .SH COPYDIRECTORYPROC |
| .PP |
| Function to process a \fBTcl_FSCopyDirectory()\fR call. If not |
| implemented, Tcl will fall back on a recursive create-dir, file copy |
| mechanism. Therefore it need only be implemented if the filesystem can |
| perform that action more efficiently. |
| .PP |
| .CS |
| typedef int Tcl_FSCopyDirectoryProc( |
| 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 'file copy' subcommand). |
| .SH 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 Tcl_FSLoadFile 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 TCL_ERROR to disable load functionality in this filesystem |
| entirely. |
| .PP |
| .CS |
| typedef int Tcl_FSLoadFileProc( |
| 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 interp'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 procedure will be |
| called with the given Tcl_LoadHandle as its only parameter when Tcl |
| needs to unload the file. |
| .SH 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 Tcl_FSUnloadFileProc( |
| Tcl_LoadHandle \fIloadHandle\fR); |
| .CE |
| .SH GETCWDPROC |
| .PP |
| Function to process a \fBTcl_FSGetCwd()\fR call. Most filesystems need not |
| implement this. It will usually only be called once, if 'getcwd' is |
| called before 'chdir'. May be NULL. |
| .PP |
| .CS |
| typedef Tcl_Obj* Tcl_FSGetCwdProc( |
| 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 interp's result. |
| .PP |
| .SH 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 dirName is a valid, |
| accessible directory in their filesystem. They need not remember the |
| result, since that will be automatically remembered for use by GetCwd. |
| Real filesystems should carry out the correct action (i.e. call the |
| correct system 'chdir' api). |
| .PP |
| .CS |
| typedef int Tcl_FSChdirProc( |
| 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 KEYWORDS |
| stat access filesystem vfs |