| 1 | '\" | 
|---|
| 2 | '\" Copyright (c) 2001 Vincent Darley | 
|---|
| 3 | '\" | 
|---|
| 4 | '\" See the file "license.terms" for information on usage and redistribution | 
|---|
| 5 | '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
| 6 | '\"  | 
|---|
| 7 | '\" RCS: @(#) $Id: FileSystem.3,v 1.62 2007/12/13 15:22:31 dgp Exp $ | 
|---|
| 8 | '\"  | 
|---|
| 9 | .so man.macros | 
|---|
| 10 | .TH Filesystem 3 8.4 Tcl "Tcl Library Procedures" | 
|---|
| 11 | .BS | 
|---|
| 12 | .SH NAME | 
|---|
| 13 | 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_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 | 
|---|
| 14 | .SH SYNOPSIS | 
|---|
| 15 | .nf | 
|---|
| 16 | \fB#include <tcl.h>\fR | 
|---|
| 17 | .sp | 
|---|
| 18 | int | 
|---|
| 19 | \fBTcl_FSRegister\fR(\fIclientData, fsPtr\fR) | 
|---|
| 20 | .sp | 
|---|
| 21 | int | 
|---|
| 22 | \fBTcl_FSUnregister\fR(\fIfsPtr\fR) | 
|---|
| 23 | .sp | 
|---|
| 24 | ClientData | 
|---|
| 25 | \fBTcl_FSData\fR(\fIfsPtr\fR) | 
|---|
| 26 | .sp | 
|---|
| 27 | void | 
|---|
| 28 | \fBTcl_FSMountsChanged\fR(\fIfsPtr\fR) | 
|---|
| 29 | .sp | 
|---|
| 30 | Tcl_Filesystem* | 
|---|
| 31 | \fBTcl_FSGetFileSystemForPath\fR(\fIpathPtr\fR) | 
|---|
| 32 | .sp | 
|---|
| 33 | Tcl_PathType | 
|---|
| 34 | \fBTcl_FSGetPathType\fR(\fIpathPtr\fR) | 
|---|
| 35 | .sp | 
|---|
| 36 | int | 
|---|
| 37 | \fBTcl_FSCopyFile\fR(\fIsrcPathPtr, destPathPtr\fR) | 
|---|
| 38 | .sp | 
|---|
| 39 | int | 
|---|
| 40 | \fBTcl_FSCopyDirectory\fR(\fIsrcPathPtr, destPathPtr, errorPtr\fR) | 
|---|
| 41 | .sp | 
|---|
| 42 | int | 
|---|
| 43 | \fBTcl_FSCreateDirectory\fR(\fIpathPtr\fR) | 
|---|
| 44 | .sp | 
|---|
| 45 | int | 
|---|
| 46 | \fBTcl_FSDeleteFile\fR(\fIpathPtr\fR) | 
|---|
| 47 | .sp | 
|---|
| 48 | int | 
|---|
| 49 | \fBTcl_FSRemoveDirectory\fR(\fIpathPtr, int recursive, errorPtr\fR) | 
|---|
| 50 | .sp | 
|---|
| 51 | int | 
|---|
| 52 | \fBTcl_FSRenameFile\fR(\fIsrcPathPtr, destPathPtr\fR) | 
|---|
| 53 | .sp | 
|---|
| 54 | Tcl_Obj* | 
|---|
| 55 | \fBTcl_FSListVolumes\fR(\fIvoid\fR) | 
|---|
| 56 | .sp | 
|---|
| 57 | .VS 8.5 | 
|---|
| 58 | int | 
|---|
| 59 | \fBTcl_FSEvalFileEx\fR(\fIinterp, pathPtr, encodingName\fR) | 
|---|
| 60 | .VE 8.5 | 
|---|
| 61 | .sp | 
|---|
| 62 | int | 
|---|
| 63 | \fBTcl_FSEvalFile\fR(\fIinterp, pathPtr\fR) | 
|---|
| 64 | .sp | 
|---|
| 65 | int | 
|---|
| 66 | \fBTcl_FSLoadFile\fR(\fIinterp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr, | 
|---|
| 67 |                handlePtr, unloadProcPtr\fR) | 
|---|
| 68 | .sp | 
|---|
| 69 | int | 
|---|
| 70 | \fBTcl_FSMatchInDirectory\fR(\fIinterp, resultPtr, pathPtr, pattern, types\fR) | 
|---|
| 71 | .sp | 
|---|
| 72 | Tcl_Obj* | 
|---|
| 73 | \fBTcl_FSLink\fR(\fIlinkNamePtr, toPtr, linkAction\fR) | 
|---|
| 74 | .sp | 
|---|
| 75 | int | 
|---|
| 76 | \fBTcl_FSLstat\fR(\fIpathPtr, statPtr\fR) | 
|---|
| 77 | .sp | 
|---|
| 78 | int | 
|---|
| 79 | \fBTcl_FSUtime\fR(\fIpathPtr, tval\fR) | 
|---|
| 80 | .sp | 
|---|
| 81 | int | 
|---|
| 82 | \fBTcl_FSFileAttrsGet\fR(\fIinterp, int index, pathPtr, objPtrRef\fR) | 
|---|
| 83 | .sp | 
|---|
| 84 | int | 
|---|
| 85 | \fBTcl_FSFileAttrsSet\fR(\fIinterp, int index, pathPtr, Tcl_Obj *objPtr\fR) | 
|---|
| 86 | .sp | 
|---|
| 87 | const char** | 
|---|
| 88 | \fBTcl_FSFileAttrStrings\fR(\fIpathPtr, objPtrRef\fR) | 
|---|
| 89 | .sp | 
|---|
| 90 | int | 
|---|
| 91 | \fBTcl_FSStat\fR(\fIpathPtr, statPtr\fR) | 
|---|
| 92 | .sp | 
|---|
| 93 | int | 
|---|
| 94 | \fBTcl_FSAccess\fR(\fIpathPtr, mode\fR) | 
|---|
| 95 | .sp | 
|---|
| 96 | Tcl_Channel | 
|---|
| 97 | \fBTcl_FSOpenFileChannel\fR(\fIinterp, pathPtr, modeString, permissions\fR) | 
|---|
| 98 | .sp | 
|---|
| 99 | Tcl_Obj* | 
|---|
| 100 | \fBTcl_FSGetCwd\fR(\fIinterp\fR) | 
|---|
| 101 | .sp | 
|---|
| 102 | int | 
|---|
| 103 | \fBTcl_FSChdir\fR(\fIpathPtr\fR) | 
|---|
| 104 | .sp | 
|---|
| 105 | Tcl_Obj* | 
|---|
| 106 | \fBTcl_FSPathSeparator\fR(\fIpathPtr\fR) | 
|---|
| 107 | .sp | 
|---|
| 108 | Tcl_Obj* | 
|---|
| 109 | \fBTcl_FSJoinPath\fR(\fIlistObj, elements\fR) | 
|---|
| 110 | .sp | 
|---|
| 111 | Tcl_Obj* | 
|---|
| 112 | \fBTcl_FSSplitPath\fR(\fIpathPtr, lenPtr\fR) | 
|---|
| 113 | .sp | 
|---|
| 114 | int | 
|---|
| 115 | \fBTcl_FSEqualPaths\fR(\fIfirstPtr, secondPtr\fR) | 
|---|
| 116 | .sp | 
|---|
| 117 | Tcl_Obj* | 
|---|
| 118 | \fBTcl_FSGetNormalizedPath\fR(\fIinterp, pathPtr\fR) | 
|---|
| 119 | .sp | 
|---|
| 120 | Tcl_Obj* | 
|---|
| 121 | \fBTcl_FSJoinToPath\fR(\fIbasePtr, objc, objv\fR) | 
|---|
| 122 | .sp | 
|---|
| 123 | int | 
|---|
| 124 | \fBTcl_FSConvertToPathType\fR(\fIinterp, pathPtr\fR) | 
|---|
| 125 | .sp | 
|---|
| 126 | ClientData | 
|---|
| 127 | \fBTcl_FSGetInternalRep\fR(\fIpathPtr, fsPtr\fR) | 
|---|
| 128 | .sp | 
|---|
| 129 | Tcl_Obj * | 
|---|
| 130 | \fBTcl_FSGetTranslatedPath\fR(\fIinterp, pathPtr\fR) | 
|---|
| 131 | .sp | 
|---|
| 132 | const char * | 
|---|
| 133 | \fBTcl_FSGetTranslatedStringPath\fR(\fIinterp, pathPtr\fR) | 
|---|
| 134 | .sp | 
|---|
| 135 | Tcl_Obj* | 
|---|
| 136 | \fBTcl_FSNewNativePath\fR(\fIfsPtr, clientData\fR) | 
|---|
| 137 | .sp | 
|---|
| 138 | const char * | 
|---|
| 139 | \fBTcl_FSGetNativePath\fR(\fIpathPtr\fR) | 
|---|
| 140 | .sp | 
|---|
| 141 | Tcl_Obj* | 
|---|
| 142 | \fBTcl_FSFileSystemInfo\fR(\fIpathPtr\fR) | 
|---|
| 143 | .sp | 
|---|
| 144 | Tcl_StatBuf* | 
|---|
| 145 | \fBTcl_AllocStatBuf\fR() | 
|---|
| 146 | .SH ARGUMENTS | 
|---|
| 147 | .AS Tcl_FSUnloadFileProc **unloadProcPtr out | 
|---|
| 148 | .AP Tcl_Filesystem *fsPtr in | 
|---|
| 149 | Points to a structure containing the addresses of procedures that | 
|---|
| 150 | can be called to perform the various filesystem operations. | 
|---|
| 151 | .AP Tcl_Obj *pathPtr in | 
|---|
| 152 | The path represented by this object is used for the operation in | 
|---|
| 153 | question.  If the object does not already have an internal \fBpath\fR | 
|---|
| 154 | representation, it will be converted to have one. | 
|---|
| 155 | .AP Tcl_Obj *srcPathPtr in | 
|---|
| 156 | As for \fIpathPtr\fR, but used for the source file for a copy or | 
|---|
| 157 | rename operation. | 
|---|
| 158 | .AP Tcl_Obj *destPathPtr in | 
|---|
| 159 | As for \fIpathPtr\fR, but used for the destination filename for a copy or | 
|---|
| 160 | rename operation. | 
|---|
| 161 | .AP "const char" *encodingName in | 
|---|
| 162 | The encoding of the data stored in the | 
|---|
| 163 | file identified by \fIpathPtr\fR and to be evaluted. | 
|---|
| 164 | .AP "const char" *pattern in | 
|---|
| 165 | Only files or directories matching this pattern will be returned. | 
|---|
| 166 | .AP Tcl_GlobTypeData *types in | 
|---|
| 167 | Only files or directories matching the type descriptions contained in | 
|---|
| 168 | this structure will be returned.  This parameter may be NULL. | 
|---|
| 169 | .AP Tcl_Interp *interp in | 
|---|
| 170 | Interpreter to use either for results, evaluation, or reporting error | 
|---|
| 171 | messages. | 
|---|
| 172 | .AP ClientData clientData in | 
|---|
| 173 | The native description of the path object to create. | 
|---|
| 174 | .AP Tcl_Obj *firstPtr in | 
|---|
| 175 | The first of two path objects to compare.  The object may be converted | 
|---|
| 176 | to \fBpath\fR type. | 
|---|
| 177 | .AP Tcl_Obj *secondPtr in | 
|---|
| 178 | The second of two path objects to compare.  The object may be converted | 
|---|
| 179 | to \fBpath\fR type. | 
|---|
| 180 | .AP Tcl_Obj *listObj in | 
|---|
| 181 | The list of path elements to operate on with a \fBjoin\fR operation. | 
|---|
| 182 | .AP int elements in | 
|---|
| 183 | If non-negative, the number of elements in the \fIlistObj\fR which should | 
|---|
| 184 | be joined together.  If negative, then all elements are joined. | 
|---|
| 185 | .AP Tcl_Obj **errorPtr out | 
|---|
| 186 | In the case of an error, filled with an object containing the name of | 
|---|
| 187 | the file which caused an error in the various copy/rename operations. | 
|---|
| 188 | .AP Tcl_Obj **objPtrRef out | 
|---|
| 189 | Filled with an object containing the result of the operation. | 
|---|
| 190 | .AP Tcl_Obj *resultPtr out | 
|---|
| 191 | Pre-allocated object in which to store (using | 
|---|
| 192 | \fBTcl_ListObjAppendElement\fR) the list of | 
|---|
| 193 | files or directories which are successfully matched. | 
|---|
| 194 | .AP int mode in | 
|---|
| 195 | Mask consisting of one or more of R_OK, W_OK, X_OK and F_OK.  R_OK, | 
|---|
| 196 | W_OK and X_OK request checking whether the file exists and  has  read, | 
|---|
| 197 | write and  execute  permissions, respectively.  F_OK just requests | 
|---|
| 198 | checking for the existence of the file. | 
|---|
| 199 | .AP Tcl_StatBuf *statPtr out | 
|---|
| 200 | The structure that contains the result of a stat or lstat operation. | 
|---|
| 201 | .AP "const char" *sym1 in | 
|---|
| 202 | Name of a procedure to look up in the file's symbol table | 
|---|
| 203 | .AP "const char" *sym2 in | 
|---|
| 204 | Name of a procedure to look up in the file's symbol table | 
|---|
| 205 | .AP Tcl_PackageInitProc **proc1Ptr out | 
|---|
| 206 | Filled with the init function for this code. | 
|---|
| 207 | .AP Tcl_PackageInitProc **proc2Ptr out | 
|---|
| 208 | Filled with the safe-init function for this code. | 
|---|
| 209 | .AP ClientData *clientDataPtr out | 
|---|
| 210 | Filled with the clientData value to pass to this code's unload | 
|---|
| 211 | function when it is called. | 
|---|
| 212 | .AP Tcl_LoadHandle *handlePtr out | 
|---|
| 213 | Filled with an abstract token representing the loaded file. | 
|---|
| 214 | .AP Tcl_FSUnloadFileProc **unloadProcPtr out | 
|---|
| 215 | Filled with the function to use to unload this piece of code. | 
|---|
| 216 | .AP utimbuf *tval in | 
|---|
| 217 | The access and modification times in this structure are read and | 
|---|
| 218 | used to set those values for a given file. | 
|---|
| 219 | .AP "const char" *modeString in | 
|---|
| 220 | Specifies how the file is to be accessed.  May have any of the values | 
|---|
| 221 | allowed for the \fImode\fR argument to the Tcl \fBopen\fR command. | 
|---|
| 222 | .AP int permissions in | 
|---|
| 223 | POSIX-style permission flags such as 0644.  If a new file is created, these | 
|---|
| 224 | permissions will be set on the created file. | 
|---|
| 225 | .AP int *lenPtr out | 
|---|
| 226 | If non-NULL, filled with the number of elements in the split path. | 
|---|
| 227 | .AP Tcl_Obj *basePtr in | 
|---|
| 228 | The base path on to which to join the given elements.  May be NULL. | 
|---|
| 229 | .AP int objc in | 
|---|
| 230 | The number of elements in \fIobjv\fR. | 
|---|
| 231 | .AP "Tcl_Obj *const" objv[] in | 
|---|
| 232 | The elements to join to the given base path. | 
|---|
| 233 | .AP Tcl_Obj *linkNamePtr in | 
|---|
| 234 | The name of the link to be created or read. | 
|---|
| 235 | .AP Tcl_Obj *toPtr in | 
|---|
| 236 | What the link called \fIlinkNamePtr\fR should be linked to, or NULL if | 
|---|
| 237 | the symbolic link specified by \fIlinkNamePtr\fR is to be read. | 
|---|
| 238 | .AP int linkAction in | 
|---|
| 239 | OR-ed combination of flags indicating what kind of link should be | 
|---|
| 240 | created (will be ignored if \fItoPtr\fR is NULL). Valid bits to set | 
|---|
| 241 | are \fBTCL_CREATE_SYMBOLIC_LINK\fR and \fBTCL_CREATE_HARD_LINK\fR. | 
|---|
| 242 | When both flags are set and the underlying filesystem can do either, | 
|---|
| 243 | symbolic links are preferred. | 
|---|
| 244 | .BE | 
|---|
| 245 |  | 
|---|
| 246 | .SH DESCRIPTION | 
|---|
| 247 | .PP | 
|---|
| 248 | There are several reasons for calling the \fBTcl_FS\fR API functions | 
|---|
| 249 | (e.g. \fBTcl_FSAccess\fR and \fBTcl_FSStat\fR) | 
|---|
| 250 | rather than calling system level functions like \fBaccess\fR and | 
|---|
| 251 | \fBstat\fR directly.  First, they will work cross-platform, so an | 
|---|
| 252 | extension which calls them should work unmodified on Unix and | 
|---|
| 253 | Windows.  Second, the Windows implementation of some of these functions | 
|---|
| 254 | fixes some bugs in the system level calls.  Third, these function calls | 
|---|
| 255 | deal with any | 
|---|
| 256 | .QW "Utf to platform-native" | 
|---|
| 257 | path conversions which may be | 
|---|
| 258 | required (and may cache the results of such conversions for greater | 
|---|
| 259 | efficiency on subsequent calls).  Fourth, and perhaps most importantly, | 
|---|
| 260 | all of these functions are | 
|---|
| 261 | .QW "virtual filesystem aware" . | 
|---|
| 262 | Any virtual filesystem (VFS for short) which has been registered (through | 
|---|
| 263 | \fBTcl_FSRegister\fR) may reroute file access to alternative | 
|---|
| 264 | media or access methods.  This means that all of these functions (and | 
|---|
| 265 | therefore the corresponding \fBfile\fR, \fBglob\fR, \fBpwd\fR, \fBcd\fR, | 
|---|
| 266 | \fBopen\fR, etc.  Tcl commands) may be operate on | 
|---|
| 267 | .QW files | 
|---|
| 268 | which are not | 
|---|
| 269 | native files in the native filesystem.  This also means that any Tcl | 
|---|
| 270 | extension which accesses the filesystem (FS for short) through this API is | 
|---|
| 271 | automatically | 
|---|
| 272 | .QW "virtual filesystem aware" . | 
|---|
| 273 | Of course, if an extension | 
|---|
| 274 | accesses the native filesystem directly (through platform-specific | 
|---|
| 275 | APIs, for example), then Tcl cannot intercept such calls. | 
|---|
| 276 | .PP | 
|---|
| 277 | If appropriate VFSes have been registered, the | 
|---|
| 278 | .QW files | 
|---|
| 279 | may, to give two | 
|---|
| 280 | examples, be remote (e.g. situated on a remote ftp server) or archived | 
|---|
| 281 | (e.g. lying inside a .zip archive).  Such registered filesystems provide | 
|---|
| 282 | a lookup table of functions to implement all or some of the functionality | 
|---|
| 283 | listed here.  Finally, the \fBTcl_FSStat\fR and \fBTcl_FSLstat\fR calls | 
|---|
| 284 | abstract away from what the | 
|---|
| 285 | .QW "struct stat" | 
|---|
| 286 | buffer is actually | 
|---|
| 287 | declared to be, allowing the same code to be used both on systems with | 
|---|
| 288 | and systems without support for files larger than 2GB in size. | 
|---|
| 289 | .PP | 
|---|
| 290 | The \fBTcl_FS\fR API is objectified and may cache internal | 
|---|
| 291 | representations and other path-related strings (e.g. the current working | 
|---|
| 292 | directory).  One side-effect of this is that one must not pass in objects | 
|---|
| 293 | with a reference count of zero to any of these functions.  If such calls were | 
|---|
| 294 | handled, they might result | 
|---|
| 295 | in memory leaks (under some circumstances, the filesystem code may wish | 
|---|
| 296 | to retain a reference to the passed in object, and so one must not assume | 
|---|
| 297 | that after any of these calls return, the object still has a reference count of | 
|---|
| 298 | zero - it may have been incremented) or in a direct segmentation fault | 
|---|
| 299 | (or other memory access error) | 
|---|
| 300 | due to the object being freed part way through the complex object | 
|---|
| 301 | manipulation required to ensure that the path is fully normalized and | 
|---|
| 302 | absolute for filesystem determination.  The practical lesson to learn | 
|---|
| 303 | from this is that | 
|---|
| 304 | .CS | 
|---|
| 305 | Tcl_Obj *path = Tcl_NewStringObj(...); | 
|---|
| 306 | Tcl_FS\fIWhatever\fR(path); | 
|---|
| 307 | Tcl_DecrRefCount(path); | 
|---|
| 308 | .CE | 
|---|
| 309 | is wrong, and may cause memory errors. The \fIpath\fR must have its | 
|---|
| 310 | reference count incremented before passing it in, or | 
|---|
| 311 | decrementing it.  For this reason, objects with a reference count of zero are | 
|---|
| 312 | considered not to be valid filesystem paths and calling any Tcl_FS API | 
|---|
| 313 | function with such an object will result in no action being taken. | 
|---|
| 314 | .SS "FS API FUNCTIONS" | 
|---|
| 315 | \fBTcl_FSCopyFile\fR attempts to copy the file given by \fIsrcPathPtr\fR to the | 
|---|
| 316 | path name given by \fIdestPathPtr\fR.  If the two paths given lie in the same | 
|---|
| 317 | filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that | 
|---|
| 318 | filesystem's | 
|---|
| 319 | .QW "copy file" | 
|---|
| 320 | function is called (if it is non-NULL). | 
|---|
| 321 | Otherwise the function returns -1 and sets the \fBerrno\fR global C | 
|---|
| 322 | variable to the | 
|---|
| 323 | .QW EXDEV | 
|---|
| 324 | POSIX error code (which signifies a | 
|---|
| 325 | .QW "cross-domain link" ). | 
|---|
| 326 | .PP | 
|---|
| 327 | \fBTcl_FSCopyDirectory\fR attempts to copy the directory given by \fIsrcPathPtr\fR to the | 
|---|
| 328 | path name given by \fIdestPathPtr\fR.  If the two paths given lie in the same | 
|---|
| 329 | filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that | 
|---|
| 330 | filesystem's | 
|---|
| 331 | .QW "copy file" | 
|---|
| 332 | function is called (if it is non-NULL). | 
|---|
| 333 | Otherwise the function returns -1 and sets the \fBerrno\fR global C | 
|---|
| 334 | variable to the | 
|---|
| 335 | .QW EXDEV | 
|---|
| 336 | POSIX error code (which signifies a | 
|---|
| 337 | .QW "cross-domain link" ). | 
|---|
| 338 | .PP | 
|---|
| 339 | \fBTcl_FSCreateDirectory\fR attempts to create the directory given by | 
|---|
| 340 | \fIpathPtr\fR by calling the owning filesystem's | 
|---|
| 341 | .QW "create directory" | 
|---|
| 342 | function. | 
|---|
| 343 | .PP | 
|---|
| 344 | \fBTcl_FSDeleteFile\fR attempts to delete the file given by | 
|---|
| 345 | \fIpathPtr\fR by calling the owning filesystem's | 
|---|
| 346 | .QW "delete file" | 
|---|
| 347 | function. | 
|---|
| 348 | .PP | 
|---|
| 349 | \fBTcl_FSRemoveDirectory\fR attempts to remove the directory given by | 
|---|
| 350 | \fIpathPtr\fR by calling the owning filesystem's | 
|---|
| 351 | .QW "remove directory" | 
|---|
| 352 | function. | 
|---|
| 353 | .PP | 
|---|
| 354 | \fBTcl_FSRenameFile\fR attempts to rename the file or directory given by | 
|---|
| 355 | \fIsrcPathPtr\fR to the path name given by \fIdestPathPtr\fR.  If the two paths | 
|---|
| 356 | given lie in the same filesystem (according to | 
|---|
| 357 | \fBTcl_FSGetFileSystemForPath\fR) then that filesystem's | 
|---|
| 358 | .QW "rename file" | 
|---|
| 359 | function is called (if it is non-NULL).  Otherwise the function returns -1 | 
|---|
| 360 | and sets the \fBerrno\fR global C variable to the | 
|---|
| 361 | .QW EXDEV | 
|---|
| 362 | POSIX error code (which signifies a | 
|---|
| 363 | .QW "cross-domain link" ). | 
|---|
| 364 | .PP | 
|---|
| 365 | \fBTcl_FSListVolumes\fR calls each filesystem which has a non-NULL | 
|---|
| 366 | .QW "list volumes" | 
|---|
| 367 | function and asks them to return their list of root volumes.  It | 
|---|
| 368 | accumulates the return values in a list which is returned to the | 
|---|
| 369 | caller (with a reference count of 0). | 
|---|
| 370 | .PP | 
|---|
| 371 | .VS 8.5 | 
|---|
| 372 | \fBTcl_FSEvalFileEx\fR reads the file given by \fIpathPtr\fR using | 
|---|
| 373 | the encoding identified by \fIencodingName\fR and evaluates | 
|---|
| 374 | its contents as a Tcl script.  It returns the same information as | 
|---|
| 375 | \fBTcl_EvalObjEx\fR. | 
|---|
| 376 | If \fIencodingName\fR is NULL, the system encoding is used for | 
|---|
| 377 | reading the file contents. | 
|---|
| 378 | If the file could not be read then a Tcl error is returned to describe | 
|---|
| 379 | why the file could not be read. | 
|---|
| 380 | The eofchar for files is | 
|---|
| 381 | .QW \e32 | 
|---|
| 382 | (^Z) for all platforms. | 
|---|
| 383 | If you require a | 
|---|
| 384 | .QW ^Z | 
|---|
| 385 | in code for string comparison, you can use | 
|---|
| 386 | .QW \e032 | 
|---|
| 387 | or | 
|---|
| 388 | .QW \eu001a , | 
|---|
| 389 | which will be safely substituted by the Tcl interpreter into | 
|---|
| 390 | .QW ^Z . | 
|---|
| 391 | \fBTcl_FSEvalFile\fR is a simpler version of | 
|---|
| 392 | \fBTcl_FSEvalFileEx\fR that always uses the system encoding | 
|---|
| 393 | when reading the file. | 
|---|
| 394 | .VE 8.5 | 
|---|
| 395 | .PP | 
|---|
| 396 | \fBTcl_FSLoadFile\fR dynamically loads a binary code file into memory and | 
|---|
| 397 | returns the addresses of two procedures within that file, if they are | 
|---|
| 398 | defined.  The appropriate function for the filesystem to which \fIpathPtr\fR | 
|---|
| 399 | belongs will be called.  If that filesystem does not implement this | 
|---|
| 400 | function (most virtual filesystems will not, because of OS limitations | 
|---|
| 401 | in dynamically loading binary code), Tcl will attempt to copy the file | 
|---|
| 402 | to a temporary directory and load that temporary file. | 
|---|
| 403 | .PP | 
|---|
| 404 | Returns a standard Tcl completion code.  If an error occurs, an error | 
|---|
| 405 | message is left in the \fIinterp\fR's result. | 
|---|
| 406 | .PP | 
|---|
| 407 | \fBTcl_FSMatchInDirectory\fR is used by the globbing code to search a | 
|---|
| 408 | directory for all files which match a given pattern.  The appropriate | 
|---|
| 409 | function for the filesystem to which \fIpathPtr\fR belongs will be called. | 
|---|
| 410 | .PP | 
|---|
| 411 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 412 | occurred in globbing.  Error messages are placed in interp (unless  | 
|---|
| 413 | interp is NULL, which is allowed), but good results are placed in the  | 
|---|
| 414 | resultPtr given. | 
|---|
| 415 | .PP | 
|---|
| 416 | Note that the \fBglob\fR code implements recursive patterns internally, so | 
|---|
| 417 | this function will only ever be passed simple patterns, which can be | 
|---|
| 418 | matched using the logic of \fBstring match\fR.  To handle recursion, Tcl | 
|---|
| 419 | will call this function frequently asking only for directories to be | 
|---|
| 420 | returned.  A special case of being called with a NULL pattern indicates | 
|---|
| 421 | that the path needs to be checked only for the correct type. | 
|---|
| 422 | .PP | 
|---|
| 423 | \fBTcl_FSLink\fR replaces the library version of \fBreadlink\fR, and | 
|---|
| 424 | extends it to support the creation of links.  The appropriate function | 
|---|
| 425 | for the filesystem to which \fIlinkNamePtr\fR belongs will be called. | 
|---|
| 426 | .PP | 
|---|
| 427 | If the \fItoPtr\fR is NULL, a | 
|---|
| 428 | .QW "read link" | 
|---|
| 429 | action is performed.  The result | 
|---|
| 430 | is a Tcl_Obj specifying the contents of the symbolic link given by | 
|---|
| 431 | \fIlinkNamePtr\fR, or NULL if the link could not be read.  The result is owned | 
|---|
| 432 | by the caller, which should call Tcl_DecrRefCount when the result is no | 
|---|
| 433 | longer needed.  If the \fItoPtr\fR is not NULL, Tcl should create a link | 
|---|
| 434 | of one of the types passed in in the \fIlinkAction\fR flag.  This flag is | 
|---|
| 435 | an ORed combination of \fBTCL_CREATE_SYMBOLIC_LINK\fR and \fBTCL_CREATE_HARD_LINK\fR. | 
|---|
| 436 | Where a choice exists (i.e. more than one flag is passed in), the Tcl | 
|---|
| 437 | convention is to prefer symbolic links.  When a link is successfully | 
|---|
| 438 | created, the return value should be \fItoPtr\fR (which is therefore | 
|---|
| 439 | already owned by the caller).  If unsuccessful, NULL is returned. | 
|---|
| 440 | .PP | 
|---|
| 441 | \fBTcl_FSLstat\fR fills the stat structure \fIstatPtr\fR with information | 
|---|
| 442 | about the specified file.  You do not need any access rights to the | 
|---|
| 443 | file to get this information but you need search rights to all | 
|---|
| 444 | directories named in the path leading to the file.  The stat structure | 
|---|
| 445 | includes info regarding device, inode (always 0 on Windows), | 
|---|
| 446 | privilege mode, nlink (always 1 on Windows), user id (always 0 on | 
|---|
| 447 | Windows), group id (always 0 on Windows), rdev (same as device on | 
|---|
| 448 | Windows), size, last access time, last modification time, and creation | 
|---|
| 449 | time. | 
|---|
| 450 | .PP | 
|---|
| 451 | If \fIpath\fR exists, \fBTcl_FSLstat\fR returns 0 and the stat structure | 
|---|
| 452 | is filled with data.  Otherwise, -1 is returned, and no stat info is | 
|---|
| 453 | given. | 
|---|
| 454 | .PP | 
|---|
| 455 | \fBTcl_FSUtime\fR replaces the library version of utime. | 
|---|
| 456 | .PP | 
|---|
| 457 | This returns 0 on success and -1 on error (as per the \fButime\fR | 
|---|
| 458 | documentation).  If successful, the function | 
|---|
| 459 | will update the | 
|---|
| 460 | .QW atime | 
|---|
| 461 | and | 
|---|
| 462 | .QW mtime | 
|---|
| 463 | values of the file given. | 
|---|
| 464 | .PP | 
|---|
| 465 | \fBTcl_FSFileAttrsGet\fR implements read access for the hookable \fBfile | 
|---|
| 466 | attributes\fR subcommand.  The appropriate function for the filesystem to | 
|---|
| 467 | which \fIpathPtr\fR belongs will be called. | 
|---|
| 468 | .PP | 
|---|
| 469 | If the result is \fBTCL_OK\fR, then an object was placed in | 
|---|
| 470 | \fIobjPtrRef\fR, which | 
|---|
| 471 | will only be temporarily valid (unless \fBTcl_IncrRefCount\fR is called). | 
|---|
| 472 | .PP | 
|---|
| 473 | \fBTcl_FSFileAttrsSet\fR implements write access for the hookable \fBfile | 
|---|
| 474 | attributes\fR subcommand.  The appropriate function for the filesystem to | 
|---|
| 475 | which \fIpathPtr\fR belongs will be called. | 
|---|
| 476 | .PP | 
|---|
| 477 | \fBTcl_FSFileAttrStrings\fR implements part of the hookable \fBfile | 
|---|
| 478 | attributes\fR subcommand.  The appropriate function for the filesystem | 
|---|
| 479 | to which \fIpathPtr\fR belongs will be called. | 
|---|
| 480 | .PP | 
|---|
| 481 | The called procedure may either return an array of strings, or may | 
|---|
| 482 | instead return NULL and place a Tcl list into the given \fIobjPtrRef\fR.  Tcl | 
|---|
| 483 | will take that list and first increment its reference count before using it. | 
|---|
| 484 | On completion of that use, Tcl will decrement its reference count.  Hence if | 
|---|
| 485 | the list should be disposed of by Tcl when done, it should have a | 
|---|
| 486 | reference count of zero, and if the list should not be disposed of, the | 
|---|
| 487 | filesystem should ensure it retains a reference count to the object. | 
|---|
| 488 | .PP | 
|---|
| 489 | \fBTcl_FSAccess\fR checks whether the process would be allowed to read, | 
|---|
| 490 | write or test for existence of the file (or other filesystem object) | 
|---|
| 491 | whose name is \fIpathname\fR.   If \fIpathname\fR is a symbolic link on Unix, | 
|---|
| 492 | then permissions of the file referred by this symbolic link are | 
|---|
| 493 | tested. | 
|---|
| 494 | .PP | 
|---|
| 495 | On success (all requested permissions granted), zero is returned.  On | 
|---|
| 496 | error (at least one bit in mode asked for a permission that is denied, | 
|---|
| 497 | or some other error occurred), -1 is returned. | 
|---|
| 498 | .PP | 
|---|
| 499 | \fBTcl_FSStat\fR fills the stat structure \fIstatPtr\fR with information | 
|---|
| 500 | about the specified file.  You do not need any access rights to the | 
|---|
| 501 | file to get this information but you need search rights to all | 
|---|
| 502 | directories named in the path leading to the file.  The stat structure | 
|---|
| 503 | includes info regarding device, inode (always 0 on Windows), | 
|---|
| 504 | privilege mode, nlink (always 1 on Windows), user id (always 0 on | 
|---|
| 505 | Windows), group id (always 0 on Windows), rdev (same as device on | 
|---|
| 506 | Windows), size, last access time, last modification time, and creation | 
|---|
| 507 | time. | 
|---|
| 508 | .PP | 
|---|
| 509 | If \fIpath\fR exists, \fBTcl_FSStat\fR returns 0 and the stat structure | 
|---|
| 510 | is filled with data.  Otherwise, -1 is returned, and no stat info is | 
|---|
| 511 | given. | 
|---|
| 512 | .PP | 
|---|
| 513 | \fBTcl_FSOpenFileChannel\fR opens a file specified by \fIpathPtr\fR and | 
|---|
| 514 | returns a channel handle that can be used to perform input and output on | 
|---|
| 515 | the file. This API is modeled after the \fBfopen\fR procedure of | 
|---|
| 516 | the Unix standard I/O library. | 
|---|
| 517 | The syntax and meaning of all arguments is similar to those | 
|---|
| 518 | given in the Tcl \fBopen\fR command when opening a file. | 
|---|
| 519 | If an error occurs while opening the channel, \fBTcl_FSOpenFileChannel\fR | 
|---|
| 520 | returns NULL and records a POSIX error code that can be | 
|---|
| 521 | retrieved with \fBTcl_GetErrno\fR. | 
|---|
| 522 | In addition, if \fIinterp\fR is non-NULL, \fBTcl_FSOpenFileChannel\fR | 
|---|
| 523 | leaves an error message in \fIinterp\fR's result after any error. | 
|---|
| 524 | .PP | 
|---|
| 525 | The newly created channel is not registered in the supplied interpreter; to | 
|---|
| 526 | register it, use \fBTcl_RegisterChannel\fR, described below. | 
|---|
| 527 | If one of the standard channels, \fBstdin, stdout\fR or \fBstderr\fR was | 
|---|
| 528 | previously closed, the act of creating the new channel also assigns it as a | 
|---|
| 529 | replacement for the standard channel. | 
|---|
| 530 | .PP | 
|---|
| 531 | \fBTcl_FSGetCwd\fR replaces the library version of \fBgetcwd\fR. | 
|---|
| 532 | .PP | 
|---|
| 533 | It returns the Tcl library's current working directory.  This may be | 
|---|
| 534 | different to the native platform's working directory, which happens when | 
|---|
| 535 | the current working directory is not in the native filesystem. | 
|---|
| 536 | .PP | 
|---|
| 537 | The result is a pointer to a Tcl_Obj specifying the current directory, | 
|---|
| 538 | or NULL if the current directory could not be determined.  If NULL is | 
|---|
| 539 | returned, an error message is left in the \fIinterp\fR's result. | 
|---|
| 540 | .PP | 
|---|
| 541 | The result already has its reference count incremented for the caller.  When | 
|---|
| 542 | it is no longer needed, that reference count should be decremented.  This is | 
|---|
| 543 | needed for thread-safety purposes, to allow multiple threads to access | 
|---|
| 544 | this and related functions, while ensuring the results are always | 
|---|
| 545 | valid. | 
|---|
| 546 | .PP | 
|---|
| 547 | \fBTcl_FSChdir\fR replaces the library version of \fBchdir\fR.  The path is | 
|---|
| 548 | normalized and then passed to the filesystem which claims it.  If that | 
|---|
| 549 | filesystem does not implement this function, Tcl will fallback to a | 
|---|
| 550 | combination of \fBstat\fR and \fBaccess\fR to check whether the directory | 
|---|
| 551 | exists and has appropriate permissions. | 
|---|
| 552 | .PP | 
|---|
| 553 | For results, see \fBchdir\fR documentation.  If successful, we keep a | 
|---|
| 554 | record of the successful path in \fIcwdPathPtr\fR for subsequent calls to | 
|---|
| 555 | \fBTcl_FSGetCwd\fR. | 
|---|
| 556 | .PP | 
|---|
| 557 | \fBTcl_FSPathSeparator\fR returns the separator character to be used for | 
|---|
| 558 | most specific element of the path specified by \fIpathPtr\fR (i.e. the last | 
|---|
| 559 | part of the path). | 
|---|
| 560 | .PP | 
|---|
| 561 | The separator is returned as a Tcl_Obj containing a string of length | 
|---|
| 562 | 1.  If the path is invalid, NULL is returned. | 
|---|
| 563 | .PP | 
|---|
| 564 | \fBTcl_FSJoinPath\fR takes the given Tcl_Obj, which must be a valid | 
|---|
| 565 | list (which is allowed to have a reference count of zero), and returns the path | 
|---|
| 566 | object given by considering the first \fIelements\fR elements as valid path | 
|---|
| 567 | segments (each path segment may be a complete path, a partial path or | 
|---|
| 568 | just a single possible directory or file name).  If any path segment is | 
|---|
| 569 | actually an absolute path, then all prior path segments are discarded. | 
|---|
| 570 | If \fIelements\fR is less than 0, we use the entire list. | 
|---|
| 571 | .PP | 
|---|
| 572 | It is possible that the returned object is actually an element | 
|---|
| 573 | of the given list, so the caller should be careful to increment the | 
|---|
| 574 | reference count of the result before freeing the list. | 
|---|
| 575 | .PP | 
|---|
| 576 | The returned object, typically with a reference count of zero (but it | 
|---|
| 577 | could be shared | 
|---|
| 578 | under some conditions), contains the joined path.  The caller must | 
|---|
| 579 | add a reference count to the object before using it.  In particular, the | 
|---|
| 580 | returned object could be an element of the given list, so freeing the | 
|---|
| 581 | list might free the object prematurely if no reference count has been taken. | 
|---|
| 582 | If the number of elements is zero, then the returned object will be | 
|---|
| 583 | an empty-string Tcl_Obj. | 
|---|
| 584 | .PP | 
|---|
| 585 | \fBTcl_FSSplitPath\fR takes the given Tcl_Obj, which should be a valid path, | 
|---|
| 586 | and returns a Tcl list object containing each segment of that path as | 
|---|
| 587 | an element. | 
|---|
| 588 | It returns a list object with a reference count of zero.  If the | 
|---|
| 589 | passed in \fIlenPtr\fR is non-NULL, the variable it points to will be | 
|---|
| 590 | updated to contain the number of elements in the returned list. | 
|---|
| 591 | .PP | 
|---|
| 592 | \fBTcl_FSEqualPaths\fR tests whether the two paths given represent the same | 
|---|
| 593 | filesystem object | 
|---|
| 594 | .PP | 
|---|
| 595 | It returns 1 if the paths are equal, and 0 if they are different.  If | 
|---|
| 596 | either path is NULL, 0 is always returned. | 
|---|
| 597 | .PP | 
|---|
| 598 | \fBTcl_FSGetNormalizedPath\fR this important function attempts to extract | 
|---|
| 599 | from the given Tcl_Obj a unique normalized path representation, whose | 
|---|
| 600 | string value can be used as a unique identifier for the file. | 
|---|
| 601 | .PP | 
|---|
| 602 | It returns the normalized path object, owned by Tcl, or NULL if the path | 
|---|
| 603 | was invalid or could otherwise not be successfully converted. | 
|---|
| 604 | Extraction of absolute, normalized paths is very efficient (because the | 
|---|
| 605 | filesystem operates on these representations internally), although the | 
|---|
| 606 | result when the filesystem contains numerous symbolic links may not be | 
|---|
| 607 | the most user-friendly version of a path.  The return value is owned by | 
|---|
| 608 | Tcl and has a lifetime equivalent to that of the \fIpathPtr\fR passed in | 
|---|
| 609 | (unless that is a relative path, in which case the normalized path | 
|---|
| 610 | object may be freed any time the cwd changes) - the caller can of | 
|---|
| 611 | course increment the refCount if it wishes to maintain a copy for longer. | 
|---|
| 612 | .PP | 
|---|
| 613 | \fBTcl_FSJoinToPath\fR takes the given object, which should usually be a | 
|---|
| 614 | valid path or NULL, and joins onto it the array of paths segments | 
|---|
| 615 | given. | 
|---|
| 616 | .PP | 
|---|
| 617 | Returns object, typically with refCount of zero (but it could be shared | 
|---|
| 618 | under some conditions), containing the joined path.  The caller must | 
|---|
| 619 | add a refCount to the object before using it.  If any of the objects | 
|---|
| 620 | passed into this function (pathPtr or path elements) have a refCount | 
|---|
| 621 | of zero, they will be freed when this function returns. | 
|---|
| 622 | .PP | 
|---|
| 623 | \fBTcl_FSConvertToPathType\fR tries to convert the given Tcl_Obj to a valid | 
|---|
| 624 | Tcl path type, taking account of the fact that the cwd may have changed | 
|---|
| 625 | even if this object is already supposedly of the correct type. | 
|---|
| 626 | The filename may begin with | 
|---|
| 627 | .QW ~ | 
|---|
| 628 | (to indicate current user's home directory) or | 
|---|
| 629 | .QW ~<user> | 
|---|
| 630 | (to indicate any user's home directory). | 
|---|
| 631 | .PP | 
|---|
| 632 | If the conversion succeeds (i.e. the object is a valid path in one of | 
|---|
| 633 | the current filesystems), then \fBTCL_OK\fR is returned.  Otherwise | 
|---|
| 634 | \fBTCL_ERROR\fR is returned, and an error message may | 
|---|
| 635 | be left in the interpreter. | 
|---|
| 636 | .PP | 
|---|
| 637 | \fBTcl_FSGetInternalRep\fR extracts the internal representation of a given | 
|---|
| 638 | path object, in the given filesystem.  If the path object belongs to a | 
|---|
| 639 | different filesystem, we return NULL. If the internal representation is | 
|---|
| 640 | currently NULL, we attempt to generate it, by calling the filesystem's | 
|---|
| 641 | \fBTcl_FSCreateInternalRepProc\fR. | 
|---|
| 642 | .PP | 
|---|
| 643 | Returns NULL or a valid internal path representation.  This internal | 
|---|
| 644 | representation is cached, so that repeated calls to this function will | 
|---|
| 645 | not require additional conversions. | 
|---|
| 646 | .PP | 
|---|
| 647 | \fBTcl_FSGetTranslatedPath\fR attempts to extract the translated path | 
|---|
| 648 | from the given Tcl_Obj. | 
|---|
| 649 | .PP | 
|---|
| 650 | If the translation succeeds (i.e. the object is a valid path), then it is | 
|---|
| 651 | returned.  Otherwise NULL will be returned, and an error message may be | 
|---|
| 652 | left in the interpreter.  A | 
|---|
| 653 | .QW translated | 
|---|
| 654 | path is one which contains no | 
|---|
| 655 | .QW ~ | 
|---|
| 656 | or | 
|---|
| 657 | .QW ~user | 
|---|
| 658 | sequences (these have been expanded to their current | 
|---|
| 659 | representation in the filesystem).  The object returned is owned by the | 
|---|
| 660 | caller, which must store it or call Tcl_DecrRefCount to ensure memory is | 
|---|
| 661 | freed.  This function is of little practical use, and | 
|---|
| 662 | \fBTcl_FSGetNormalizedPath\fR or \fBTcl_GetNativePath\fR are usually | 
|---|
| 663 | better functions to use for most purposes. | 
|---|
| 664 | .PP | 
|---|
| 665 | \fBTcl_FSGetTranslatedStringPath\fR does the same as | 
|---|
| 666 | \fBTcl_FSGetTranslatedPath\fR, but returns a character string or NULL. | 
|---|
| 667 | The string returned is dynamically allocated and owned by the caller, | 
|---|
| 668 | which must store it or call \fBckfree\fR to ensure it is freed.  Again, | 
|---|
| 669 | \fBTcl_FSGetNormalizedPath\fR or \fBTcl_GetNativePath\fR are usually | 
|---|
| 670 | better functions to use for most purposes. | 
|---|
| 671 | .PP | 
|---|
| 672 | \fBTcl_FSNewNativePath\fR performs something like the reverse of the | 
|---|
| 673 | usual obj->path->nativerep conversions.  If some code retrieves a path | 
|---|
| 674 | in native form (from, e.g. \fBreadlink\fR or a native dialog), and that path | 
|---|
| 675 | is to be used at the Tcl level, then calling this function is an | 
|---|
| 676 | efficient way of creating the appropriate path object type. | 
|---|
| 677 | .PP | 
|---|
| 678 | The resulting object is a pure | 
|---|
| 679 | .QW path | 
|---|
| 680 | object, which will only receive | 
|---|
| 681 | a UTF-8 string representation if that is required by some Tcl code. | 
|---|
| 682 | .PP | 
|---|
| 683 | \fBTcl_FSGetNativePath\fR is for use by the Win/Unix native | 
|---|
| 684 | filesystems, so that they can easily retrieve the native (char* or | 
|---|
| 685 | TCHAR*) representation of a path.  This function is a convenience | 
|---|
| 686 | wrapper around \fBTcl_FSGetInternalRep\fR, and assumes the native | 
|---|
| 687 | representation is string-based.  It may be desirable in the future to | 
|---|
| 688 | have non-string-based native representations (for example, on MacOSX, a | 
|---|
| 689 | representation using a fileSpec of FSRef structure would probably be | 
|---|
| 690 | more efficient).  On Windows a full Unicode representation would allow | 
|---|
| 691 | for paths of unlimited length.  Currently the representation is simply a | 
|---|
| 692 | character string which may contain either the relative path or a | 
|---|
| 693 | complete, absolute normalized path in the native encoding (complex | 
|---|
| 694 | conditions dictate which of these will be provided, so neither can be | 
|---|
| 695 | relied upon, unless the path is known to be absolute).  If you need a | 
|---|
| 696 | native path which must be absolute, then you should ask for the native | 
|---|
| 697 | version of a normalized path.  If for some reason a non-absolute, | 
|---|
| 698 | non-normalized version of the path is needed, that must be constructed | 
|---|
| 699 | separately (e.g. using \fBTcl_FSGetTranslatedPath\fR). | 
|---|
| 700 | .PP | 
|---|
| 701 | The native representation is cached so that repeated calls to this | 
|---|
| 702 | function will not require additional conversions.  The return value is | 
|---|
| 703 | owned by Tcl and has a lifetime equivalent to that of the \fIpathPtr\fR | 
|---|
| 704 | passed in (unless that is a relative path, in which case the native | 
|---|
| 705 | representation may be freed any time the cwd changes). | 
|---|
| 706 | .PP | 
|---|
| 707 | \fBTcl_FSFileSystemInfo\fR returns a list of two elements.  The first | 
|---|
| 708 | element is the name of the filesystem (e.g. | 
|---|
| 709 | .QW native , | 
|---|
| 710 | .QW vfs , | 
|---|
| 711 | .QW zip , | 
|---|
| 712 | or | 
|---|
| 713 | .QW prowrap , | 
|---|
| 714 | perhaps), and the second is the particular type of the | 
|---|
| 715 | given path within that filesystem (which is filesystem dependent).  The | 
|---|
| 716 | second element may be empty if the filesystem does not provide a | 
|---|
| 717 | further categorization of files. | 
|---|
| 718 | .PP | 
|---|
| 719 | A valid list object is returned, unless the path object is not | 
|---|
| 720 | recognized, when NULL will be returned. | 
|---|
| 721 | .PP | 
|---|
| 722 | \fBTcl_FSGetFileSystemForPath\fR returns the a pointer to the | 
|---|
| 723 | \fBTcl_Filesystem\fR which accepts this path as valid. | 
|---|
| 724 | .PP | 
|---|
| 725 | If no filesystem will accept the path, NULL is returned. | 
|---|
| 726 | .PP | 
|---|
| 727 | \fBTcl_FSGetPathType\fR determines whether the given path is relative | 
|---|
| 728 | to the current directory, relative to the current volume, or | 
|---|
| 729 | absolute. | 
|---|
| 730 | .PP | 
|---|
| 731 | It returns one of \fBTCL_PATH_ABSOLUTE\fR, \fBTCL_PATH_RELATIVE\fR, or | 
|---|
| 732 | \fBTCL_PATH_VOLUME_RELATIVE\fR | 
|---|
| 733 | .PP | 
|---|
| 734 | \fBTcl_AllocStatBuf\fR allocates a \fITcl_StatBuf\fR on the system | 
|---|
| 735 | heap (which may be deallocated by being passed to \fBckfree\fR.)  This | 
|---|
| 736 | allows extensions to invoke \fBTcl_FSStat\fR and \fBTcl_FSLStat\fR | 
|---|
| 737 | without being dependent on the size of the buffer.  That in turn | 
|---|
| 738 | depends on the flags used to build Tcl. | 
|---|
| 739 | .SH "THE VIRTUAL FILESYSTEM API" | 
|---|
| 740 | .PP | 
|---|
| 741 | A filesystem provides a \fBTcl_Filesystem\fR structure that contains | 
|---|
| 742 | pointers to functions that implement the various operations on a | 
|---|
| 743 | filesystem; these operations are invoked as needed by the generic | 
|---|
| 744 | layer, which generally occurs through the functions listed above. | 
|---|
| 745 | .PP | 
|---|
| 746 | The \fBTcl_Filesystem\fR structures are manipulated using the following | 
|---|
| 747 | methods. | 
|---|
| 748 | .PP | 
|---|
| 749 | \fBTcl_FSRegister\fR takes a pointer to a filesystem structure and an | 
|---|
| 750 | optional piece of data to associated with that filesystem.  On calling | 
|---|
| 751 | this function, Tcl will attach the filesystem to the list of known | 
|---|
| 752 | filesystems, and it will become fully functional immediately.  Tcl does | 
|---|
| 753 | not check if the same filesystem is registered multiple times (and in | 
|---|
| 754 | general that is not a good thing to do).  \fBTCL_OK\fR will be returned. | 
|---|
| 755 | .PP | 
|---|
| 756 | \fBTcl_FSUnregister\fR removes the given filesystem structure from | 
|---|
| 757 | the list of known filesystems, if it is known, and returns \fBTCL_OK\fR.  If | 
|---|
| 758 | the filesystem is not currently registered, \fBTCL_ERROR\fR is returned. | 
|---|
| 759 | .PP | 
|---|
| 760 | \fBTcl_FSData\fR will return the ClientData associated with the given | 
|---|
| 761 | filesystem, if that filesystem is registered.  Otherwise it will | 
|---|
| 762 | return NULL. | 
|---|
| 763 | .PP | 
|---|
| 764 | \fBTcl_FSMountsChanged\fR is used to inform the Tcl's core that | 
|---|
| 765 | the set of mount points for the given (already registered) filesystem | 
|---|
| 766 | have changed, and that cached file representations may therefore no | 
|---|
| 767 | longer be correct. | 
|---|
| 768 | .SS "THE TCL_FILESYSTEM STRUCTURE" | 
|---|
| 769 | .PP | 
|---|
| 770 | The \fBTcl_Filesystem\fR structure contains the following fields: | 
|---|
| 771 | .CS | 
|---|
| 772 | typedef struct Tcl_Filesystem { | 
|---|
| 773 |     const char *\fItypeName\fR; | 
|---|
| 774 |     int \fIstructureLength\fR; | 
|---|
| 775 |     Tcl_FSVersion \fIversion\fR; | 
|---|
| 776 |     Tcl_FSPathInFilesystemProc *\fIpathInFilesystemProc\fR; | 
|---|
| 777 |     Tcl_FSDupInternalRepProc *\fIdupInternalRepProc\fR; | 
|---|
| 778 |     Tcl_FSFreeInternalRepProc *\fIfreeInternalRepProc\fR; | 
|---|
| 779 |     Tcl_FSInternalToNormalizedProc *\fIinternalToNormalizedProc\fR; | 
|---|
| 780 |     Tcl_FSCreateInternalRepProc *\fIcreateInternalRepProc\fR; | 
|---|
| 781 |     Tcl_FSNormalizePathProc *\fInormalizePathProc\fR; | 
|---|
| 782 |     Tcl_FSFilesystemPathTypeProc *\fIfilesystemPathTypeProc\fR; | 
|---|
| 783 |     Tcl_FSFilesystemSeparatorProc *\fIfilesystemSeparatorProc\fR; | 
|---|
| 784 |     Tcl_FSStatProc *\fIstatProc\fR; | 
|---|
| 785 |     Tcl_FSAccessProc *\fIaccessProc\fR; | 
|---|
| 786 |     Tcl_FSOpenFileChannelProc *\fIopenFileChannelProc\fR; | 
|---|
| 787 |     Tcl_FSMatchInDirectoryProc *\fImatchInDirectoryProc\fR; | 
|---|
| 788 |     Tcl_FSUtimeProc *\fIutimeProc\fR; | 
|---|
| 789 |     Tcl_FSLinkProc *\fIlinkProc\fR; | 
|---|
| 790 |     Tcl_FSListVolumesProc *\fIlistVolumesProc\fR; | 
|---|
| 791 |     Tcl_FSFileAttrStringsProc *\fIfileAttrStringsProc\fR; | 
|---|
| 792 |     Tcl_FSFileAttrsGetProc *\fIfileAttrsGetProc\fR; | 
|---|
| 793 |     Tcl_FSFileAttrsSetProc *\fIfileAttrsSetProc\fR; | 
|---|
| 794 |     Tcl_FSCreateDirectoryProc *\fIcreateDirectoryProc\fR; | 
|---|
| 795 |     Tcl_FSRemoveDirectoryProc *\fIremoveDirectoryProc\fR; | 
|---|
| 796 |     Tcl_FSDeleteFileProc *\fIdeleteFileProc\fR; | 
|---|
| 797 |     Tcl_FSCopyFileProc *\fIcopyFileProc\fR; | 
|---|
| 798 |     Tcl_FSRenameFileProc *\fIrenameFileProc\fR; | 
|---|
| 799 |     Tcl_FSCopyDirectoryProc *\fIcopyDirectoryProc\fR; | 
|---|
| 800 |     Tcl_FSLstatProc *\fIlstatProc\fR; | 
|---|
| 801 |     Tcl_FSLoadFileProc *\fIloadFileProc\fR; | 
|---|
| 802 |     Tcl_FSGetCwdProc *\fIgetCwdProc\fR; | 
|---|
| 803 |     Tcl_FSChdirProc *\fIchdirProc\fR; | 
|---|
| 804 | } Tcl_Filesystem; | 
|---|
| 805 | .CE | 
|---|
| 806 | .PP | 
|---|
| 807 | Except for the first three fields in this structure which contain | 
|---|
| 808 | simple data elements, all entries contain addresses of functions called | 
|---|
| 809 | by the generic filesystem layer to perform the complete range of | 
|---|
| 810 | filesystem related actions. | 
|---|
| 811 | .PP | 
|---|
| 812 | The many functions in this structure are broken down into three | 
|---|
| 813 | categories: infrastructure functions (almost all of which must be | 
|---|
| 814 | implemented), operational functions (which must be implemented if a | 
|---|
| 815 | complete filesystem is provided), and efficiency functions (which need | 
|---|
| 816 | only be implemented if they can be done so efficiently, or if they have | 
|---|
| 817 | side-effects which are required by the filesystem; Tcl has less | 
|---|
| 818 | efficient emulations it can fall back on).  It is important to note | 
|---|
| 819 | that, in the current version of Tcl, most of these fallbacks are only | 
|---|
| 820 | used to handle commands initiated in Tcl, not in C. What this means is, | 
|---|
| 821 | that if a \fBfile rename\fR command is issued in Tcl, and the relevant | 
|---|
| 822 | filesystem(s) do not implement their \fITcl_FSRenameFileProc\fR, Tcl's | 
|---|
| 823 | core will instead fallback on a combination of other filesystem | 
|---|
| 824 | functions (it will use \fITcl_FSCopyFileProc\fR followed by | 
|---|
| 825 | \fITcl_FSDeleteFileProc\fR, and if \fITcl_FSCopyFileProc\fR is not | 
|---|
| 826 | implemented there is a further fallback).  However, if a | 
|---|
| 827 | \fITcl_FSRenameFileProc\fR command is issued at the C level, no such | 
|---|
| 828 | fallbacks occur.  This is true except for the last four entries in the | 
|---|
| 829 | filesystem table (\fBlstat\fR, \fBload\fR, \fBgetcwd\fR and \fBchdir\fR) | 
|---|
| 830 | for which fallbacks do in fact occur at the C level. | 
|---|
| 831 | .PP | 
|---|
| 832 | Any functions which take path names in Tcl_Obj form take | 
|---|
| 833 | those names in UTF\-8 form.  The filesystem infrastructure API is | 
|---|
| 834 | designed to support efficient, cached conversion of these UTF\-8 paths | 
|---|
| 835 | to other native representations. | 
|---|
| 836 | .SS "EXAMPLE FILESYSTEM DEFINITION" | 
|---|
| 837 | .PP | 
|---|
| 838 | Here is the filesystem lookup table used by the | 
|---|
| 839 | .QW vfs | 
|---|
| 840 | extension which allows filesystem actions to be implemented in Tcl. | 
|---|
| 841 | .CS | 
|---|
| 842 | static Tcl_Filesystem vfsFilesystem = { | 
|---|
| 843 |     "tclvfs", | 
|---|
| 844 |     sizeof(Tcl_Filesystem), | 
|---|
| 845 |     TCL_FILESYSTEM_VERSION_1, | 
|---|
| 846 |     &VfsPathInFilesystem, | 
|---|
| 847 |     &VfsDupInternalRep, | 
|---|
| 848 |     &VfsFreeInternalRep, | 
|---|
| 849 |     /* No internal to normalized, since we don't create | 
|---|
| 850 |      * any pure 'internal' Tcl_Obj path representations */ | 
|---|
| 851 |     NULL, | 
|---|
| 852 |     /* No create native rep function, since we don't use | 
|---|
| 853 |      * it and don't choose to support uses of | 
|---|
| 854 |      * Tcl_FSNewNativePath */ | 
|---|
| 855 |     NULL, | 
|---|
| 856 |     /* Normalize path isn't needed - we assume paths only | 
|---|
| 857 |      * have one representation */ | 
|---|
| 858 |     NULL, | 
|---|
| 859 |     &VfsFilesystemPathType, | 
|---|
| 860 |     &VfsFilesystemSeparator, | 
|---|
| 861 |     &VfsStat, | 
|---|
| 862 |     &VfsAccess, | 
|---|
| 863 |     &VfsOpenFileChannel, | 
|---|
| 864 |     &VfsMatchInDirectory, | 
|---|
| 865 |     &VfsUtime, | 
|---|
| 866 |     /* We choose not to support symbolic links inside our | 
|---|
| 867 |      * VFS's */ | 
|---|
| 868 |     NULL, | 
|---|
| 869 |     &VfsListVolumes, | 
|---|
| 870 |     &VfsFileAttrStrings, | 
|---|
| 871 |     &VfsFileAttrsGet, | 
|---|
| 872 |     &VfsFileAttrsSet, | 
|---|
| 873 |     &VfsCreateDirectory, | 
|---|
| 874 |     &VfsRemoveDirectory, | 
|---|
| 875 |     &VfsDeleteFile, | 
|---|
| 876 |     /* No copy file; use the core fallback mechanism */ | 
|---|
| 877 |     NULL, | 
|---|
| 878 |     /* No rename file; use the core fallback mechanism */ | 
|---|
| 879 |     NULL, | 
|---|
| 880 |     /* No copy directory; use the core fallback mechanism */ | 
|---|
| 881 |     NULL, | 
|---|
| 882 |     /* Core will use stat for lstat */ | 
|---|
| 883 |     NULL, | 
|---|
| 884 |     /* No load; use the core fallback mechansism */ | 
|---|
| 885 |     NULL, | 
|---|
| 886 |     /* We don't need a getcwd or chdir; the core's own | 
|---|
| 887 |      * internal value is suitable */ | 
|---|
| 888 |     NULL, | 
|---|
| 889 |     NULL | 
|---|
| 890 | }; | 
|---|
| 891 | .CE | 
|---|
| 892 | .SH "FILESYSTEM INFRASTRUCTURE" | 
|---|
| 893 | .PP | 
|---|
| 894 | These fields contain basic information about the filesystem structure | 
|---|
| 895 | and addresses of functions which are used to associate | 
|---|
| 896 | a particular filesystem with a file path, and deal with the internal | 
|---|
| 897 | handling of path representations, for example copying and freeing such | 
|---|
| 898 | representations. | 
|---|
| 899 | .SS TYPENAME | 
|---|
| 900 | .PP | 
|---|
| 901 | The \fItypeName\fR field contains a null-terminated string that | 
|---|
| 902 | identifies the type of the filesystem implemented, e.g. | 
|---|
| 903 | .QW native , | 
|---|
| 904 | .QW zip | 
|---|
| 905 | or | 
|---|
| 906 | .QW vfs . | 
|---|
| 907 | .SS "STRUCTURE LENGTH" | 
|---|
| 908 | .PP | 
|---|
| 909 | The \fIstructureLength\fR field is generally implemented as | 
|---|
| 910 | \fIsizeof(Tcl_Filesystem)\fR, and is there to allow easier | 
|---|
| 911 | binary backwards compatibility if the size of the structure | 
|---|
| 912 | changes in a future Tcl release. | 
|---|
| 913 | .SS VERSION | 
|---|
| 914 | .PP | 
|---|
| 915 | The \fIversion\fR field should be set to \fBTCL_FILESYSTEM_VERSION_1\fR. | 
|---|
| 916 | .SS PATHINFILESYSTEMPROC | 
|---|
| 917 | .PP | 
|---|
| 918 | The \fIpathInFilesystemProc\fR field contains the address of a function | 
|---|
| 919 | which is called to determine whether a given path object belongs to this | 
|---|
| 920 | filesystem or not.  Tcl will only call the rest of the filesystem | 
|---|
| 921 | functions with a path for which this function has returned \fBTCL_OK\fR. | 
|---|
| 922 | If the path does not belong, -1 should be returned (the behaviour of Tcl | 
|---|
| 923 | for any other return value is not defined).  If \fBTCL_OK\fR is returned, | 
|---|
| 924 | then the optional \fIclientDataPtr\fR output parameter can be used to | 
|---|
| 925 | return an internal (filesystem specific) representation of the path, | 
|---|
| 926 | which will be cached inside the path object, and may be retrieved | 
|---|
| 927 | efficiently by the other filesystem functions.  Tcl will simultaneously | 
|---|
| 928 | cache the fact that this path belongs to this filesystem.  Such caches | 
|---|
| 929 | are invalidated when filesystem structures are added or removed from | 
|---|
| 930 | Tcl's internal list of known filesystems. | 
|---|
| 931 | .PP | 
|---|
| 932 | .CS | 
|---|
| 933 | typedef int Tcl_FSPathInFilesystemProc( | 
|---|
| 934 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 935 |         ClientData *\fIclientDataPtr\fR); | 
|---|
| 936 | .CE | 
|---|
| 937 | .SS DUPINTERNALREPPROC | 
|---|
| 938 | .PP | 
|---|
| 939 | This function makes a copy of a path's internal representation, and is | 
|---|
| 940 | called when Tcl needs to duplicate a path object.  If NULL, Tcl will | 
|---|
| 941 | simply not copy the internal representation, which may then need to be | 
|---|
| 942 | regenerated later. | 
|---|
| 943 | .PP | 
|---|
| 944 | .CS | 
|---|
| 945 | typedef ClientData Tcl_FSDupInternalRepProc( | 
|---|
| 946 |         ClientData \fIclientData\fR); | 
|---|
| 947 | .CE | 
|---|
| 948 | .SS FREEINTERNALREPPROC | 
|---|
| 949 | Free the internal representation.  This must be implemented if internal | 
|---|
| 950 | representations need freeing (i.e. if some memory is allocated when an | 
|---|
| 951 | internal representation is generated), but may otherwise be NULL. | 
|---|
| 952 | .PP | 
|---|
| 953 | .CS | 
|---|
| 954 | typedef void Tcl_FSFreeInternalRepProc( | 
|---|
| 955 |         ClientData \fIclientData\fR); | 
|---|
| 956 | .CE | 
|---|
| 957 | .SS INTERNALTONORMALIZEDPROC | 
|---|
| 958 | .PP | 
|---|
| 959 | Function to convert internal representation to a normalized path.  Only | 
|---|
| 960 | required if the filesystem creates pure path objects with no string/path | 
|---|
| 961 | representation.  The return value is a Tcl object whose string | 
|---|
| 962 | representation is the normalized path. | 
|---|
| 963 | .PP | 
|---|
| 964 | .CS | 
|---|
| 965 | typedef Tcl_Obj* Tcl_FSInternalToNormalizedProc( | 
|---|
| 966 |         ClientData \fIclientData\fR); | 
|---|
| 967 | .CE | 
|---|
| 968 | .SS CREATEINTERNALREPPROC | 
|---|
| 969 | .PP | 
|---|
| 970 | Function to take a path object, and calculate an internal | 
|---|
| 971 | representation for it, and store that native representation in the | 
|---|
| 972 | object.  May be NULL if paths have no internal representation, or if | 
|---|
| 973 | the \fITcl_FSPathInFilesystemProc\fR for this filesystem always | 
|---|
| 974 | immediately creates an internal representation for paths it accepts. | 
|---|
| 975 | .PP | 
|---|
| 976 | .CS | 
|---|
| 977 | typedef ClientData Tcl_FSCreateInternalRepProc( | 
|---|
| 978 |         Tcl_Obj *\fIpathPtr\fR); | 
|---|
| 979 | .CE | 
|---|
| 980 | .SS NORMALIZEPATHPROC | 
|---|
| 981 | .PP | 
|---|
| 982 | Function to normalize a path.  Should be implemented for all | 
|---|
| 983 | filesystems which can have multiple string representations for the same | 
|---|
| 984 | path object.  In Tcl, every | 
|---|
| 985 | .QW path | 
|---|
| 986 | must have a single unique | 
|---|
| 987 | .QW normalized | 
|---|
| 988 | string representation.  Depending on the filesystem, | 
|---|
| 989 | there may be more than one unnormalized string representation which | 
|---|
| 990 | refers to that path (e.g. a relative path, a path with different | 
|---|
| 991 | character case if the filesystem is case insensitive, a path contain a | 
|---|
| 992 | reference to a home directory such as | 
|---|
| 993 | .QW ~ , | 
|---|
| 994 | a path containing symbolic | 
|---|
| 995 | links, etc).  If the very last component in the path is a symbolic | 
|---|
| 996 | link, it should not be converted into the object it points to (but | 
|---|
| 997 | its case or other aspects should be made unique).  All other path | 
|---|
| 998 | components should be converted from symbolic links.  This one | 
|---|
| 999 | exception is required to agree with Tcl's semantics with \fBfile | 
|---|
| 1000 | delete\fR, \fBfile rename\fR, \fBfile copy\fR operating on symbolic links. | 
|---|
| 1001 | This function may be called with \fInextCheckpoint\fR either | 
|---|
| 1002 | at the beginning of the path (i.e. zero), at the end of the path, or | 
|---|
| 1003 | at any intermediate file separator in the path.  It will never | 
|---|
| 1004 | point to any other arbitrary position in the path. In the last of | 
|---|
| 1005 | the three valid cases, the implementation can assume that the path | 
|---|
| 1006 | up to and including the file separator is known and normalized. | 
|---|
| 1007 | .PP | 
|---|
| 1008 | .CS | 
|---|
| 1009 | typedef int Tcl_FSNormalizePathProc( | 
|---|
| 1010 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 1011 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1012 |         int \fInextCheckpoint\fR); | 
|---|
| 1013 | .CE | 
|---|
| 1014 | .SH "FILESYSTEM OPERATIONS" | 
|---|
| 1015 | .PP | 
|---|
| 1016 | The fields in this section of the structure contain addresses of | 
|---|
| 1017 | functions which are called to carry out the basic filesystem | 
|---|
| 1018 | operations.  A filesystem which expects to be used with the complete | 
|---|
| 1019 | standard Tcl command set must implement all of these.  If some of | 
|---|
| 1020 | them are not implemented, then certain Tcl commands may fail when | 
|---|
| 1021 | operating on paths within that filesystem.  However, in some instances | 
|---|
| 1022 | this may be desirable (for example, a read-only filesystem should not | 
|---|
| 1023 | implement the last four functions, and a filesystem which does not | 
|---|
| 1024 | support symbolic links need not implement the \fBreadlink\fR function, | 
|---|
| 1025 | etc.  The Tcl core expects filesystems to behave in this way). | 
|---|
| 1026 | .SS FILESYSTEMPATHTYPEPROC | 
|---|
| 1027 | .PP | 
|---|
| 1028 | Function to determine the type of a path in this filesystem.  May be | 
|---|
| 1029 | NULL, in which case no type information will be available to users of | 
|---|
| 1030 | the filesystem.  The | 
|---|
| 1031 | .QW type | 
|---|
| 1032 | is used only for informational purposes, | 
|---|
| 1033 | and should be returned as the string representation of the Tcl_Obj | 
|---|
| 1034 | which is returned.  A typical return value might be | 
|---|
| 1035 | .QW networked , | 
|---|
| 1036 | .QW zip | 
|---|
| 1037 | or | 
|---|
| 1038 | .QW ftp . | 
|---|
| 1039 | The Tcl_Obj result is owned by the filesystem and so Tcl will | 
|---|
| 1040 | increment the refCount of that object if it wishes to retain a reference | 
|---|
| 1041 | to it. | 
|---|
| 1042 | .PP | 
|---|
| 1043 | .CS | 
|---|
| 1044 | typedef Tcl_Obj* Tcl_FSFilesystemPathTypeProc( | 
|---|
| 1045 |         Tcl_Obj *\fIpathPtr\fR); | 
|---|
| 1046 | .CE | 
|---|
| 1047 | .SS FILESYSTEMSEPARATORPROC | 
|---|
| 1048 | .PP | 
|---|
| 1049 | Function to return the separator character(s) for this filesystem. | 
|---|
| 1050 | This need only be implemented if the filesystem wishes to use a | 
|---|
| 1051 | different separator than the standard string | 
|---|
| 1052 | .QW / . | 
|---|
| 1053 | Amongst other | 
|---|
| 1054 | uses, it is returned by the \fBfile separator\fR command.  The | 
|---|
| 1055 | return value should be an object with refCount of zero. | 
|---|
| 1056 | .PP | 
|---|
| 1057 | .CS | 
|---|
| 1058 | typedef Tcl_Obj* Tcl_FSFilesystemSeparatorProc( | 
|---|
| 1059 |         Tcl_Obj *\fIpathPtr\fR); | 
|---|
| 1060 | .CE | 
|---|
| 1061 | .SS STATPROC | 
|---|
| 1062 | .PP | 
|---|
| 1063 | Function to process a \fBTcl_FSStat\fR call.  Must be implemented for any | 
|---|
| 1064 | reasonable filesystem, since many Tcl level commands depend crucially | 
|---|
| 1065 | upon it (e.g. \fBfile atime\fR, \fBfile isdirectory\fR, \fBfile size\fR, | 
|---|
| 1066 | \fBglob\fR). | 
|---|
| 1067 | .PP | 
|---|
| 1068 | .CS | 
|---|
| 1069 | typedef int Tcl_FSStatProc( | 
|---|
| 1070 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1071 |         Tcl_StatBuf *\fIstatPtr\fR); | 
|---|
| 1072 | .CE | 
|---|
| 1073 | .PP | 
|---|
| 1074 | The \fBTcl_FSStatProc\fR fills the stat structure \fIstatPtr\fR with | 
|---|
| 1075 | information about the specified file.  You do not need any access | 
|---|
| 1076 | rights to the file to get this information but you need search rights | 
|---|
| 1077 | to all directories named in the path leading to the file.  The stat | 
|---|
| 1078 | structure includes info regarding device, inode (always 0 on Windows), | 
|---|
| 1079 | privilege mode, nlink (always 1 on Windows), user id (always 0 on | 
|---|
| 1080 | Windows), group id (always 0 on Windows), rdev (same as device on | 
|---|
| 1081 | Windows), size, last access time, last modification time, and creation | 
|---|
| 1082 | time. | 
|---|
| 1083 | .PP | 
|---|
| 1084 | If the file represented by \fIpathPtr\fR exists, the | 
|---|
| 1085 | \fBTcl_FSStatProc\fR returns 0 and the stat structure is filled with | 
|---|
| 1086 | data.  Otherwise, -1 is returned, and no stat info is given. | 
|---|
| 1087 | .SS ACCESSPROC | 
|---|
| 1088 | .PP | 
|---|
| 1089 | Function to process a \fBTcl_FSAccess\fR call.  Must be implemented for | 
|---|
| 1090 | any reasonable filesystem, since many Tcl level commands depend crucially | 
|---|
| 1091 | upon it (e.g. \fBfile exists\fR, \fBfile readable\fR). | 
|---|
| 1092 | .PP | 
|---|
| 1093 | .CS | 
|---|
| 1094 | typedef int Tcl_FSAccessProc( | 
|---|
| 1095 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1096 |         int \fImode\fR); | 
|---|
| 1097 | .CE | 
|---|
| 1098 | .PP | 
|---|
| 1099 | The \fBTcl_FSAccessProc\fR checks whether the process would be allowed | 
|---|
| 1100 | to read, write or test for existence of the file (or other filesystem | 
|---|
| 1101 | object) whose name is in \fIpathPtr\fR.  If the pathname refers to a | 
|---|
| 1102 | symbolic link, then the | 
|---|
| 1103 | permissions of the file referred by this symbolic link should be tested. | 
|---|
| 1104 | .PP | 
|---|
| 1105 | On success (all requested permissions granted), zero is returned.  On | 
|---|
| 1106 | error (at least one bit in mode asked for a permission that is denied, | 
|---|
| 1107 | or some other  error occurred), -1 is returned. | 
|---|
| 1108 | .SS OPENFILECHANNELPROC | 
|---|
| 1109 | .PP | 
|---|
| 1110 | Function to process a \fBTcl_FSOpenFileChannel\fR call.  Must be | 
|---|
| 1111 | implemented for any reasonable filesystem, since any operations | 
|---|
| 1112 | which require open or accessing a file's contents will use it | 
|---|
| 1113 | (e.g. \fBopen\fR, \fBencoding\fR, and many Tk commands). | 
|---|
| 1114 | .PP | 
|---|
| 1115 | .CS | 
|---|
| 1116 | typedef Tcl_Channel Tcl_FSOpenFileChannelProc( | 
|---|
| 1117 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 1118 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1119 |         int \fImode\fR, | 
|---|
| 1120 |         int \fIpermissions\fR); | 
|---|
| 1121 | .CE | 
|---|
| 1122 | .PP | 
|---|
| 1123 | The \fBTcl_FSOpenFileChannelProc\fR opens a file specified by | 
|---|
| 1124 | \fIpathPtr\fR and returns a channel handle that can be used to perform | 
|---|
| 1125 | input and output on the file.  This API is modeled after the \fBfopen\fR | 
|---|
| 1126 | procedure of the Unix standard I/O library.  The syntax and meaning of | 
|---|
| 1127 | all arguments is similar to those given in the Tcl \fBopen\fR command | 
|---|
| 1128 | when opening a file, where the \fImode\fR argument is a combination of | 
|---|
| 1129 | the POSIX flags O_RDONLY, O_WRONLY, etc.  If an error occurs while | 
|---|
| 1130 | opening the channel, the \fBTcl_FSOpenFileChannelProc\fR returns NULL and | 
|---|
| 1131 | records a POSIX error code that can be retrieved with \fBTcl_GetErrno\fR. | 
|---|
| 1132 | In addition, if \fIinterp\fR is non-NULL, the | 
|---|
| 1133 | \fBTcl_FSOpenFileChannelProc\fR leaves an error message in \fIinterp\fR's | 
|---|
| 1134 | result after any error. | 
|---|
| 1135 | .PP | 
|---|
| 1136 | The newly created channel is not registered in the supplied | 
|---|
| 1137 | interpreter; to register it, use \fBTcl_RegisterChannel\fR. If one of | 
|---|
| 1138 | the standard channels, \fBstdin, stdout\fR or \fBstderr\fR was | 
|---|
| 1139 | previously closed, the act of creating the new channel also assigns it | 
|---|
| 1140 | as a replacement for the standard channel. | 
|---|
| 1141 | .SS MATCHINDIRECTORYPROC | 
|---|
| 1142 | .PP | 
|---|
| 1143 | Function to process a \fBTcl_FSMatchInDirectory\fR call.  If not | 
|---|
| 1144 | implemented, then glob and recursive copy functionality will be lacking | 
|---|
| 1145 | in the filesystem (and this may impact commands like \fBencoding names\fR | 
|---|
| 1146 | which use glob functionality internally). | 
|---|
| 1147 | .PP | 
|---|
| 1148 | .CS | 
|---|
| 1149 | typedef int Tcl_FSMatchInDirectoryProc( | 
|---|
| 1150 |         Tcl_Interp* \fIinterp\fR, | 
|---|
| 1151 |         Tcl_Obj *\fIresultPtr\fR, | 
|---|
| 1152 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1153 |         const char *\fIpattern\fR, | 
|---|
| 1154 |         Tcl_GlobTypeData *\fItypes\fR); | 
|---|
| 1155 | .CE | 
|---|
| 1156 | .PP | 
|---|
| 1157 | The function should return all files or directories (or other filesystem | 
|---|
| 1158 | objects) which match the given pattern and accord with the \fItypes\fR | 
|---|
| 1159 | specification given.  There are two ways in which this function may be | 
|---|
| 1160 | called.  If \fIpattern\fR is NULL, then \fIpathPtr\fR is a full path | 
|---|
| 1161 | specification of a single file or directory which should be checked for | 
|---|
| 1162 | existence and correct type.  Otherwise, \fIpathPtr\fR is a directory, the | 
|---|
| 1163 | contents of which the function should search for files or directories | 
|---|
| 1164 | which have the correct type.  In either case, \fIpathPtr\fR can be | 
|---|
| 1165 | assumed to be both non-NULL and non-empty.  It is not currently | 
|---|
| 1166 | documented whether \fIpathPtr\fR will have a file separator at its end of | 
|---|
| 1167 | not, so code should be flexible to both possibilities. | 
|---|
| 1168 | .PP | 
|---|
| 1169 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 1170 | occurred in the matching process.  Error messages are placed in | 
|---|
| 1171 | \fIinterp\fR, unless \fIinterp\fR in NULL in which case no error | 
|---|
| 1172 | message need be generated; on a \fBTCL_OK\fR result, results should be  | 
|---|
| 1173 | added to the \fIresultPtr\fR object given (which can be assumed to be a  | 
|---|
| 1174 | valid unshared Tcl list).  The matches added | 
|---|
| 1175 | to \fIresultPtr\fR should include any path prefix given in \fIpathPtr\fR | 
|---|
| 1176 | (this usually means they will be absolute path specifications). | 
|---|
| 1177 | Note that if no matches are found, that simply leads to an empty | 
|---|
| 1178 | result; errors are only signaled for actual file or filesystem | 
|---|
| 1179 | problems which may occur during the matching process. | 
|---|
| 1180 | .PP | 
|---|
| 1181 | The \fBTcl_GlobTypeData\fR structure passed in the \fItypes\fR  | 
|---|
| 1182 | parameter contains the following fields: | 
|---|
| 1183 | .CS | 
|---|
| 1184 | typedef struct Tcl_GlobTypeData { | 
|---|
| 1185 |         /* Corresponds to bcdpfls as in 'find -t' */ | 
|---|
| 1186 |         int \fItype\fR; | 
|---|
| 1187 |         /* Corresponds to file permissions */ | 
|---|
| 1188 |         int \fIperm\fR; | 
|---|
| 1189 |         /* Acceptable mac type */ | 
|---|
| 1190 |         Tcl_Obj *\fImacType\fR; | 
|---|
| 1191 |         /* Acceptable mac creator */ | 
|---|
| 1192 |         Tcl_Obj *\fImacCreator\fR; | 
|---|
| 1193 | } Tcl_GlobTypeData; | 
|---|
| 1194 | .CE | 
|---|
| 1195 | .PP | 
|---|
| 1196 | There are two specific cases which it is important to handle correctly, | 
|---|
| 1197 | both when \fItypes\fR is non-NULL. The two cases are when \fItypes->types | 
|---|
| 1198 | & TCL_GLOB_TYPE_DIR\fR or \fItypes->types & TCL_GLOB_TYPE_MOUNT\fR are | 
|---|
| 1199 | true (and in particular when the other flags are false).  In the first of | 
|---|
| 1200 | these cases, the function must list the contained directories.  Tcl uses | 
|---|
| 1201 | this to implement recursive globbing, so it is critical that filesystems | 
|---|
| 1202 | implement directory matching correctly.  In the second of these cases, | 
|---|
| 1203 | with \fBTCL_GLOB_TYPE_MOUNT\fR, the filesystem must list the mount points | 
|---|
| 1204 | which lie within the given \fIpathPtr\fR (and in this case, \fIpathPtr\fR | 
|---|
| 1205 | need not lie within the same filesystem - different to all other cases in | 
|---|
| 1206 | which this function is called).  Support for this is critical if Tcl is | 
|---|
| 1207 | to have seamless transitions between from one filesystem to another. | 
|---|
| 1208 | .SS UTIMEPROC | 
|---|
| 1209 | .PP | 
|---|
| 1210 | Function to process a \fBTcl_FSUtime\fR call.  Required to allow setting | 
|---|
| 1211 | (not reading) of times with \fBfile mtime\fR, \fBfile atime\fR and the | 
|---|
| 1212 | open-r/open-w/fcopy implementation of \fBfile copy\fR. | 
|---|
| 1213 | .PP | 
|---|
| 1214 | .CS | 
|---|
| 1215 | typedef int Tcl_FSUtimeProc( | 
|---|
| 1216 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1217 |         struct utimbuf *\fItval\fR); | 
|---|
| 1218 | .CE | 
|---|
| 1219 | .PP | 
|---|
| 1220 | The access and modification times of the file specified by \fIpathPtr\fR | 
|---|
| 1221 | should be changed to the values given in the \fItval\fR structure. | 
|---|
| 1222 | .PP | 
|---|
| 1223 | The return value should be 0 on success and -1 on an error, as | 
|---|
| 1224 | with the system \fButime\fR. | 
|---|
| 1225 | .SS LINKPROC | 
|---|
| 1226 | .PP | 
|---|
| 1227 | Function to process a \fBTcl_FSLink\fR call.  Should be implemented | 
|---|
| 1228 | only if the filesystem supports links, and may otherwise be NULL. | 
|---|
| 1229 | .PP | 
|---|
| 1230 | .CS | 
|---|
| 1231 | typedef Tcl_Obj* Tcl_FSLinkProc( | 
|---|
| 1232 |         Tcl_Obj *\fIlinkNamePtr\fR, | 
|---|
| 1233 |         Tcl_Obj *\fItoPtr\fR, | 
|---|
| 1234 |         int \fIlinkAction\fR); | 
|---|
| 1235 | .CE | 
|---|
| 1236 | .PP | 
|---|
| 1237 | If \fItoPtr\fR is NULL, the function is being asked to read the | 
|---|
| 1238 | contents of a link.  The result is a Tcl_Obj specifying the contents of | 
|---|
| 1239 | the link given by \fIlinkNamePtr\fR, or NULL if the link could | 
|---|
| 1240 | not be read.  The result is owned by the caller (and should therefore | 
|---|
| 1241 | have its ref count incremented before being returned).  Any callers | 
|---|
| 1242 | should call Tcl_DecrRefCount on this result when it is no longer needed. | 
|---|
| 1243 | If \fItoPtr\fR is not NULL, the function should attempt to create a link. | 
|---|
| 1244 | The result in this case should be \fItoPtr\fR if the link was successful | 
|---|
| 1245 | and NULL otherwise.  In this case the result is not owned by the caller | 
|---|
| 1246 | (i.e. no ref count manipulation on either end is needed). See | 
|---|
| 1247 | the documentation for \fBTcl_FSLink\fR for the correct interpretation | 
|---|
| 1248 | of the \fIlinkAction\fR flags. | 
|---|
| 1249 | .SS LISTVOLUMESPROC | 
|---|
| 1250 | .PP | 
|---|
| 1251 | Function to list any filesystem volumes added by this filesystem. | 
|---|
| 1252 | Should be implemented only if the filesystem adds volumes at the head | 
|---|
| 1253 | of the filesystem, so that they can be returned by \fBfile volumes\fR. | 
|---|
| 1254 | .PP | 
|---|
| 1255 | .CS | 
|---|
| 1256 | typedef Tcl_Obj* Tcl_FSListVolumesProc(void); | 
|---|
| 1257 | .CE | 
|---|
| 1258 | .PP | 
|---|
| 1259 | The result should be a list of volumes added by this filesystem, or | 
|---|
| 1260 | NULL (or an empty list) if no volumes are provided.  The result object | 
|---|
| 1261 | is considered to be owned by the filesystem (not by Tcl's core), but | 
|---|
| 1262 | should be given a refCount for Tcl.  Tcl will use the contents of the | 
|---|
| 1263 | list and then decrement that refCount.  This allows filesystems to | 
|---|
| 1264 | choose whether they actually want to retain a | 
|---|
| 1265 | .QW "master list" | 
|---|
| 1266 | of volumes | 
|---|
| 1267 | or not (if not, they generate the list on the fly and pass it to Tcl | 
|---|
| 1268 | with a refCount of 1 and then forget about the list, if yes, then | 
|---|
| 1269 | they simply increment the refCount of their master list and pass it | 
|---|
| 1270 | to Tcl which will copy the contents and then decrement the count back | 
|---|
| 1271 | to where it was). | 
|---|
| 1272 | .PP | 
|---|
| 1273 | Therefore, Tcl considers return values from this proc to be read-only. | 
|---|
| 1274 | .SS FILEATTRSTRINGSPROC | 
|---|
| 1275 | .PP | 
|---|
| 1276 | Function to list all attribute strings which are valid for this | 
|---|
| 1277 | filesystem.  If not implemented the filesystem will not support | 
|---|
| 1278 | the \fBfile attributes\fR command.  This allows arbitrary additional | 
|---|
| 1279 | information to be attached to files in the filesystem.  If it is | 
|---|
| 1280 | not implemented, there is no need to implement the \fBget\fR and \fBset\fR | 
|---|
| 1281 | methods. | 
|---|
| 1282 | .PP | 
|---|
| 1283 | .CS | 
|---|
| 1284 | typedef const char** Tcl_FSFileAttrStringsProc( | 
|---|
| 1285 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1286 |         Tcl_Obj** \fIobjPtrRef\fR); | 
|---|
| 1287 | .CE | 
|---|
| 1288 | .PP | 
|---|
| 1289 | The called function may either return an array of strings, or may | 
|---|
| 1290 | instead return NULL and place a Tcl list into the given \fIobjPtrRef\fR.  Tcl | 
|---|
| 1291 | will take that list and first increment its reference count before using it. | 
|---|
| 1292 | On completion of that use, Tcl will decrement its reference count.  Hence if | 
|---|
| 1293 | the list should be disposed of by Tcl when done, it should have a | 
|---|
| 1294 | reference count of zero, and if the list should not be disposed of, the | 
|---|
| 1295 | filesystem should ensure it returns an object with a refererence count | 
|---|
| 1296 | of at least one. | 
|---|
| 1297 | .SS FILEATTRSGETPROC | 
|---|
| 1298 | .PP | 
|---|
| 1299 | Function to process a \fBTcl_FSFileAttrsGet\fR call, used by \fBfile | 
|---|
| 1300 | attributes\fR. | 
|---|
| 1301 | .PP | 
|---|
| 1302 | .CS | 
|---|
| 1303 | typedef int Tcl_FSFileAttrsGetProc( | 
|---|
| 1304 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 1305 |         int \fIindex\fR, | 
|---|
| 1306 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1307 |         Tcl_Obj **\fIobjPtrRef\fR); | 
|---|
| 1308 | .CE | 
|---|
| 1309 | .PP | 
|---|
| 1310 | Returns a standard Tcl return code.  The attribute value retrieved, | 
|---|
| 1311 | which corresponds to the \fIindex\fR'th element in the list returned by | 
|---|
| 1312 | the \fBTcl_FSFileAttrStringsProc\fR, is a Tcl_Obj placed in \fIobjPtrRef\fR (if | 
|---|
| 1313 | \fBTCL_OK\fR was returned) and is likely to have a reference count of zero.  Either | 
|---|
| 1314 | way we must either store it somewhere (e.g. the Tcl result), or | 
|---|
| 1315 | Incr/Decr its reference count to ensure it is properly freed. | 
|---|
| 1316 | .SS FILEATTRSSETPROC | 
|---|
| 1317 | .PP | 
|---|
| 1318 | Function to process a \fBTcl_FSFileAttrsSet\fR call, used by \fBfile | 
|---|
| 1319 | attributes\fR.  If the filesystem is read-only, there is no need | 
|---|
| 1320 | to implement this. | 
|---|
| 1321 | .PP | 
|---|
| 1322 | .CS | 
|---|
| 1323 | typedef int Tcl_FSFileAttrsSetProc( | 
|---|
| 1324 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 1325 |         int \fIindex\fR, | 
|---|
| 1326 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1327 |         Tcl_Obj *\fIobjPtr\fR); | 
|---|
| 1328 | .CE | 
|---|
| 1329 | .PP | 
|---|
| 1330 | The attribute value of the \fIindex\fR'th element in the list returned by | 
|---|
| 1331 | the Tcl_FSFileAttrStringsProc should be set to the \fIobjPtr\fR given. | 
|---|
| 1332 | .SS CREATEDIRECTORYPROC | 
|---|
| 1333 | .PP | 
|---|
| 1334 | Function to process a \fBTcl_FSCreateDirectory\fR call.  Should be | 
|---|
| 1335 | implemented unless the FS is read-only. | 
|---|
| 1336 | .PP | 
|---|
| 1337 | .CS | 
|---|
| 1338 | typedef int Tcl_FSCreateDirectoryProc( | 
|---|
| 1339 |         Tcl_Obj *\fIpathPtr\fR); | 
|---|
| 1340 | .CE | 
|---|
| 1341 | .PP | 
|---|
| 1342 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 1343 | occurred in the process.  If successful, a new directory should have | 
|---|
| 1344 | been added to the filesystem in the location specified by | 
|---|
| 1345 | \fIpathPtr\fR. | 
|---|
| 1346 | .SS REMOVEDIRECTORYPROC | 
|---|
| 1347 | .PP | 
|---|
| 1348 | Function to process a \fBTcl_FSRemoveDirectory\fR call.  Should be | 
|---|
| 1349 | implemented unless the FS is read-only. | 
|---|
| 1350 | .PP | 
|---|
| 1351 | .CS | 
|---|
| 1352 | typedef int Tcl_FSRemoveDirectoryProc( | 
|---|
| 1353 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1354 |         int \fIrecursive\fR, | 
|---|
| 1355 |         Tcl_Obj **\fIerrorPtr\fR); | 
|---|
| 1356 | .CE | 
|---|
| 1357 | .PP | 
|---|
| 1358 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 1359 | occurred in the process.  If successful, the directory specified by | 
|---|
| 1360 | \fIpathPtr\fR should have been removed from the filesystem.  If the | 
|---|
| 1361 | \fIrecursive\fR flag is given, then a non-empty directory should be | 
|---|
| 1362 | deleted without error.  If this flag is not given, then and the | 
|---|
| 1363 | directory is non-empty a POSIX | 
|---|
| 1364 | .QW EEXIST | 
|---|
| 1365 | error should be signalled.  If an | 
|---|
| 1366 | error does occur, the name of the file or directory which caused the | 
|---|
| 1367 | error should be placed in \fIerrorPtr\fR. | 
|---|
| 1368 | .SS DELETEFILEPROC | 
|---|
| 1369 | .PP | 
|---|
| 1370 | Function to process a \fBTcl_FSDeleteFile\fR call.  Should be implemented | 
|---|
| 1371 | unless the FS is read-only. | 
|---|
| 1372 | .PP | 
|---|
| 1373 | .CS | 
|---|
| 1374 | typedef int Tcl_FSDeleteFileProc( | 
|---|
| 1375 |         Tcl_Obj *\fIpathPtr\fR); | 
|---|
| 1376 | .CE | 
|---|
| 1377 | .PP | 
|---|
| 1378 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 1379 | occurred in the process.  If successful, the file specified by | 
|---|
| 1380 | \fIpathPtr\fR should have been removed from the filesystem.  Note that, | 
|---|
| 1381 | if the filesystem supports symbolic links, Tcl will always call this | 
|---|
| 1382 | function and not Tcl_FSRemoveDirectoryProc when needed to delete them | 
|---|
| 1383 | (even if they are symbolic links to directories). | 
|---|
| 1384 | .SH "FILESYSTEM EFFICIENCY" | 
|---|
| 1385 | .PP | 
|---|
| 1386 | These functions need not be implemented for a particular filesystem | 
|---|
| 1387 | because the core has a fallback implementation available. See each | 
|---|
| 1388 | individual description for the consequences of leaving the field NULL. | 
|---|
| 1389 | .SS LSTATPROC | 
|---|
| 1390 | .PP | 
|---|
| 1391 | Function to process a \fBTcl_FSLstat\fR call.  If not implemented, Tcl | 
|---|
| 1392 | will attempt to use the \fIstatProc\fR defined above instead.  Therefore | 
|---|
| 1393 | it need only be implemented if a filesystem can differentiate between | 
|---|
| 1394 | \fBstat\fR and \fBlstat\fR calls. | 
|---|
| 1395 | .PP | 
|---|
| 1396 | .CS | 
|---|
| 1397 | typedef int Tcl_FSLstatProc( | 
|---|
| 1398 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1399 |         Tcl_StatBuf *\fIstatPtr\fR); | 
|---|
| 1400 | .CE | 
|---|
| 1401 | .PP | 
|---|
| 1402 | The behavior of this function is very similar to that of the | 
|---|
| 1403 | \fBTcl_FSStatProc\fR defined above, except that if it is applied | 
|---|
| 1404 | to a symbolic link, it returns information about the link, not | 
|---|
| 1405 | about the target file. | 
|---|
| 1406 | .SS COPYFILEPROC | 
|---|
| 1407 | .PP | 
|---|
| 1408 | Function to process a \fBTcl_FSCopyFile\fR call.  If not implemented Tcl | 
|---|
| 1409 | will fall back on \fBopen\fR-r, \fBopen\fR-w and \fBfcopy\fR as a | 
|---|
| 1410 | copying mechanism. | 
|---|
| 1411 | Therefore it need only be implemented if the filesystem can perform | 
|---|
| 1412 | that action more efficiently. | 
|---|
| 1413 | .PP | 
|---|
| 1414 | .CS | 
|---|
| 1415 | typedef int Tcl_FSCopyFileProc( | 
|---|
| 1416 |         Tcl_Obj *\fIsrcPathPtr\fR, | 
|---|
| 1417 |         Tcl_Obj *\fIdestPathPtr\fR); | 
|---|
| 1418 | .CE | 
|---|
| 1419 | .PP | 
|---|
| 1420 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 1421 | occurred in the copying process.  Note that, \fIdestPathPtr\fR is the | 
|---|
| 1422 | name of the file which should become the copy of \fIsrcPathPtr\fR. It | 
|---|
| 1423 | is never the name of a directory into which \fIsrcPathPtr\fR could be | 
|---|
| 1424 | copied (i.e. the function is much simpler than the Tcl level \fBfile | 
|---|
| 1425 | copy\fR subcommand).  Note that, | 
|---|
| 1426 | if the filesystem supports symbolic links, Tcl will always call this | 
|---|
| 1427 | function and not \fIcopyDirectoryProc\fR when needed to copy them | 
|---|
| 1428 | (even if they are symbolic links to directories).  Finally, if the | 
|---|
| 1429 | filesystem determines it cannot support the \fBfile copy\fR action, | 
|---|
| 1430 | calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR | 
|---|
| 1431 | result will tell Tcl to use its standard fallback mechanisms. | 
|---|
| 1432 | .SS RENAMEFILEPROC | 
|---|
| 1433 | .PP | 
|---|
| 1434 | Function to process a \fBTcl_FSRenameFile\fR call.  If not implemented, | 
|---|
| 1435 | Tcl will fall back on a copy and delete mechanism.  Therefore it need | 
|---|
| 1436 | only be implemented if the filesystem can perform that action more | 
|---|
| 1437 | efficiently. | 
|---|
| 1438 | .PP | 
|---|
| 1439 | .CS | 
|---|
| 1440 | typedef int Tcl_FSRenameFileProc( | 
|---|
| 1441 |         Tcl_Obj *\fIsrcPathPtr\fR, | 
|---|
| 1442 |         Tcl_Obj *\fIdestPathPtr\fR); | 
|---|
| 1443 | .CE | 
|---|
| 1444 | .PP | 
|---|
| 1445 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 1446 | occurred in the renaming process.  If the | 
|---|
| 1447 | filesystem determines it cannot support the \fBfile rename\fR action, | 
|---|
| 1448 | calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR | 
|---|
| 1449 | result will tell Tcl to use its standard fallback mechanisms. | 
|---|
| 1450 | .SS COPYDIRECTORYPROC | 
|---|
| 1451 | .PP | 
|---|
| 1452 | Function to process a \fBTcl_FSCopyDirectory\fR call.  If not | 
|---|
| 1453 | implemented, Tcl will fall back on a recursive \fBfile mkdir\fR, \fBfile copy\fR | 
|---|
| 1454 | mechanism.  Therefore it need only be implemented if the filesystem can | 
|---|
| 1455 | perform that action more efficiently. | 
|---|
| 1456 | .PP | 
|---|
| 1457 | .CS | 
|---|
| 1458 | typedef int Tcl_FSCopyDirectoryProc( | 
|---|
| 1459 |         Tcl_Obj *\fIsrcPathPtr\fR, | 
|---|
| 1460 |         Tcl_Obj *\fIdestPathPtr\fR, | 
|---|
| 1461 |         Tcl_Obj **\fIerrorPtr\fR); | 
|---|
| 1462 | .CE | 
|---|
| 1463 | .PP | 
|---|
| 1464 | The return value is a standard Tcl result indicating whether an error | 
|---|
| 1465 | occurred in the copying process.  If an error does occur, the name of | 
|---|
| 1466 | the file or directory which caused the error should be placed in | 
|---|
| 1467 | \fIerrorPtr\fR. Note that, \fIdestPathPtr\fR is the name of the | 
|---|
| 1468 | directory-name which should become the mirror-image of | 
|---|
| 1469 | \fIsrcPathPtr\fR. It is not the name of a directory into which | 
|---|
| 1470 | \fIsrcPathPtr\fR should be copied (i.e. the function is much simpler | 
|---|
| 1471 | than the Tcl level \fBfile copy\fR subcommand).  Finally, if the | 
|---|
| 1472 | filesystem determines it cannot support the directory copy action, | 
|---|
| 1473 | calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR | 
|---|
| 1474 | result will tell Tcl to use its standard fallback mechanisms. | 
|---|
| 1475 | .SS LOADFILEPROC | 
|---|
| 1476 | .PP | 
|---|
| 1477 | Function to process a \fBTcl_FSLoadFile\fR call.  If not implemented, Tcl | 
|---|
| 1478 | will fall back on a copy to native-temp followed by a \fBTcl_FSLoadFile\fR on | 
|---|
| 1479 | that temporary copy.  Therefore it need only be implemented if the | 
|---|
| 1480 | filesystem can load code directly, or it can be implemented simply to | 
|---|
| 1481 | return \fBTCL_ERROR\fR to disable load functionality in this filesystem | 
|---|
| 1482 | entirely. | 
|---|
| 1483 | .PP | 
|---|
| 1484 | .CS | 
|---|
| 1485 | typedef int Tcl_FSLoadFileProc( | 
|---|
| 1486 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 1487 |         Tcl_Obj *\fIpathPtr\fR, | 
|---|
| 1488 |         Tcl_LoadHandle *\fIhandlePtr\fR, | 
|---|
| 1489 |         Tcl_FSUnloadFileProc *\fIunloadProcPtr\fR); | 
|---|
| 1490 | .CE | 
|---|
| 1491 | .PP | 
|---|
| 1492 | Returns a standard Tcl completion code.  If an error occurs, an error | 
|---|
| 1493 | message is left in the \fIinterp\fR's result.  The function dynamically loads a | 
|---|
| 1494 | binary code file into memory.  On a successful load, the \fIhandlePtr\fR | 
|---|
| 1495 | should be filled with a token for the dynamically loaded file, and the | 
|---|
| 1496 | \fIunloadProcPtr\fR should be filled in with the address of a procedure. | 
|---|
| 1497 | The unload procedure will be called with the given \fBTcl_LoadHandle\fR as its | 
|---|
| 1498 | only parameter when Tcl needs to unload the file.  For example, for the | 
|---|
| 1499 | native filesystem, the \fBTcl_LoadHandle\fR returned is currently a token | 
|---|
| 1500 | which can be used in the private \fBTclpFindSymbol\fR to access functions | 
|---|
| 1501 | in the new code.  Each filesystem is free to define the | 
|---|
| 1502 | \fBTcl_LoadHandle\fR as it requires.  Finally, if the | 
|---|
| 1503 | filesystem determines it cannot support the file load action, | 
|---|
| 1504 | calling \fBTcl_SetErrno(EXDEV)\fR and returning a non-\fBTCL_OK\fR | 
|---|
| 1505 | result will tell Tcl to use its standard fallback mechanisms. | 
|---|
| 1506 | .SS UNLOADFILEPROC | 
|---|
| 1507 | .PP | 
|---|
| 1508 | Function to unload a previously successfully loaded file.  If load was | 
|---|
| 1509 | implemented, then this should also be implemented, if there is any | 
|---|
| 1510 | cleanup action required. | 
|---|
| 1511 | .PP | 
|---|
| 1512 | .CS | 
|---|
| 1513 | typedef void Tcl_FSUnloadFileProc( | 
|---|
| 1514 |         Tcl_LoadHandle \fIloadHandle\fR); | 
|---|
| 1515 | .CE | 
|---|
| 1516 | .SS GETCWDPROC      | 
|---|
| 1517 | .PP | 
|---|
| 1518 | Function to process a \fBTcl_FSGetCwd\fR call.  Most filesystems need not | 
|---|
| 1519 | implement this.  It will usually only be called once, if \fBgetcwd\fR is | 
|---|
| 1520 | called before \fBchdir\fR.  May be NULL. | 
|---|
| 1521 | .PP | 
|---|
| 1522 | .CS | 
|---|
| 1523 | typedef Tcl_Obj* Tcl_FSGetCwdProc( | 
|---|
| 1524 |         Tcl_Interp *\fIinterp\fR); | 
|---|
| 1525 | .CE | 
|---|
| 1526 | .PP | 
|---|
| 1527 | If the filesystem supports a native notion of a current working | 
|---|
| 1528 | directory (which might perhaps change independent of Tcl), this | 
|---|
| 1529 | function should return that cwd as the result, or NULL if the current | 
|---|
| 1530 | directory could not be determined (e.g. the user does not have | 
|---|
| 1531 | appropriate permissions on the cwd directory).  If NULL is returned, an | 
|---|
| 1532 | error message is left in the \fIinterp\fR's result. | 
|---|
| 1533 | .SS CHDIRPROC | 
|---|
| 1534 | .PP | 
|---|
| 1535 | Function to process a \fBTcl_FSChdir\fR call.  If filesystems do not | 
|---|
| 1536 | implement this, it will be emulated by a series of directory access | 
|---|
| 1537 | checks.  Otherwise, virtual filesystems which do implement it need only | 
|---|
| 1538 | respond with a positive return result if the \fIpathPtr\fR is a valid, | 
|---|
| 1539 | accessible directory in their filesystem.  They need not remember the | 
|---|
| 1540 | result, since that will be automatically remembered for use by | 
|---|
| 1541 | \fBTcl_FSGetCwd\fR. | 
|---|
| 1542 | Real filesystems should carry out the correct action (i.e. call the | 
|---|
| 1543 | correct system \fBchdir\fR API). | 
|---|
| 1544 | .PP | 
|---|
| 1545 | .CS | 
|---|
| 1546 | typedef int Tcl_FSChdirProc( | 
|---|
| 1547 |         Tcl_Obj *\fIpathPtr\fR); | 
|---|
| 1548 | .CE | 
|---|
| 1549 | .PP | 
|---|
| 1550 | The \fBTcl_FSChdirProc\fR changes the applications current working | 
|---|
| 1551 | directory to the value specified in \fIpathPtr\fR. The function returns | 
|---|
| 1552 | -1 on error or 0 on success. | 
|---|
| 1553 | .SH "SEE ALSO" | 
|---|
| 1554 | cd(n), file(n), load(n), open(n), pwd(n), unload(n) | 
|---|
| 1555 | .SH KEYWORDS | 
|---|
| 1556 | stat, access, filesystem, vfs, virtual | 
|---|