FileSystem.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:58k
源码类别:

通讯编程

开发平台:

Visual C++

  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.32.2.4 2005/06/20 16:57:43 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_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_FSRegisterfR(fIclientData, fsPtrfR)
  20. .sp
  21. int
  22. fBTcl_FSUnregisterfR(fIfsPtrfR)
  23. .sp
  24. ClientData
  25. fBTcl_FSDatafR(fIfsPtrfR)
  26. .sp
  27. void
  28. fBTcl_FSMountsChangedfR(fIfsPtrfR)
  29. .sp
  30. Tcl_Filesystem*
  31. fBTcl_FSGetFileSystemForPathfR(fIpathObjPtrfR)
  32. .sp
  33. Tcl_PathType
  34. fBTcl_FSGetPathTypefR(fIpathObjPtrfR)
  35. .sp
  36. int
  37. fBTcl_FSCopyFilefR(fIsrcPathPtr, destPathPtrfR)
  38. .sp
  39. int
  40. fBTcl_FSCopyDirectoryfR(fIsrcPathPtr, destPathPtr, errorPtrfR)
  41. .sp
  42. int
  43. fBTcl_FSCreateDirectoryfR(fIpathPtrfR)
  44. .sp
  45. int
  46. fBTcl_FSDeleteFilefR(fIpathPtrfR)
  47. .sp
  48. int
  49. fBTcl_FSRemoveDirectoryfR(fIpathPtr, int recursive, errorPtrfR)
  50. .sp
  51. int
  52. fBTcl_FSRenameFilefR(fIsrcPathPtr, destPathPtrfR)
  53. .sp
  54. Tcl_Obj*
  55. fBTcl_FSListVolumesfR(fIvoidfR)
  56. .sp
  57. int
  58. fBTcl_FSEvalFilefR(fIinterp, pathPtrfR)
  59. .sp
  60. int
  61. fBTcl_FSLoadFilefR(fIinterp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr,
  62.                handlePtr, unloadProcPtrfR)
  63. .sp
  64. int
  65. fBTcl_FSMatchInDirectoryfR(fIinterp, result, pathPtr, pattern, typesfR)
  66. .sp
  67. Tcl_Obj*
  68. fBTcl_FSLinkfR(fIlinkNamePtr, toPtr, linkActionfR)
  69. .sp
  70. int
  71. fBTcl_FSLstatfR(fIpathPtr, statPtrfR)
  72. .sp
  73. int
  74. fBTcl_FSUtimefR(fIpathPtr, tvalfR)
  75. .sp
  76. int
  77. fBTcl_FSFileAttrsGetfR(fIinterp, int index, pathPtr, objPtrReffR)
  78. .sp
  79. int
  80. fBTcl_FSFileAttrsSetfR(fIinterp, int index, pathPtr, Tcl_Obj *objPtrfR)
  81. .sp
  82. CONST char**      
  83. fBTcl_FSFileAttrStringsfR(fIpathPtr, objPtrReffR)
  84. .sp
  85. int
  86. fBTcl_FSStatfR(fIpathPtr, statPtrfR)
  87. .sp
  88. int
  89. fBTcl_FSAccessfR(fIpathPtr, modefR)
  90. .sp
  91. Tcl_Channel 
  92. fBTcl_FSOpenFileChannelfR(fIinterp, pathPtr, modeString, permissionsfR)
  93. .sp
  94. Tcl_Obj*
  95. fBTcl_FSGetCwdfR(fIinterpfR)
  96. .sp
  97. int
  98. fBTcl_FSChdirfR(fIpathPtrfR)
  99. .sp
  100. Tcl_Obj*
  101. fBTcl_FSPathSeparatorfR(fIpathPtrfR)
  102. .sp
  103. Tcl_Obj*
  104. fBTcl_FSJoinPathfR(fIlistObj, elementsfR)
  105. .sp
  106. Tcl_Obj*
  107. fBTcl_FSSplitPathfR(fIpathPtr, lenPtrfR)
  108. .sp
  109. int
  110. fBTcl_FSEqualPathsfR(fIfirstPtr, secondPtrfR)
  111. .sp
  112. Tcl_Obj*
  113. fBTcl_FSGetNormalizedPathfR(fIinterp, pathPtrfR)
  114. .sp
  115. Tcl_Obj*
  116. fBTcl_FSJoinToPathfR(fIbasePtr, objc, objvfR)
  117. .sp
  118. int
  119. fBTcl_FSConvertToPathTypefR(fIinterp, pathPtrfR)
  120. .sp
  121. ClientData 
  122. fBTcl_FSGetInternalRepfR(fIpathPtr, fsPtrfR)
  123. .sp
  124. Tcl_Obj* 
  125. fBTcl_FSGetTranslatedPathfR(fIinterp, pathPtrfR)
  126. .sp
  127. CONST char* 
  128. fBTcl_FSGetTranslatedStringPathfR(fIinterp, pathPtrfR)
  129. .sp
  130. Tcl_Obj*
  131. fBTcl_FSNewNativePathfR(fIfsPtr, clientDatafR)
  132. .sp
  133. CONST char* 
  134. fBTcl_FSGetNativePathfR(fIpathPtrfR)
  135. .sp
  136. Tcl_Obj*
  137. fBTcl_FSFileSystemInfofR(fIpathPtrfR)
  138. .sp
  139. Tcl_StatBuf*
  140. fBTcl_AllocStatBuffR()
  141. .SH ARGUMENTS
  142. .AS Tcl_Filesystem *fsPtr in
  143. .AP Tcl_Filesystem *fsPtr in
  144. Points to a structure containing the addresses of procedures that
  145. can be called to perform the various filesystem operations.
  146. .AP Tcl_Obj *pathPtr in
  147. The path represented by this object is used for the operation in
  148. question.  If the object does not already have an internal fBpathfR
  149. representation, it will be converted to have one.
  150. .AP Tcl_Obj *srcPathPtr in
  151. As for fBpathPtrfR, but used for the source file for a copy or
  152. rename operation.
  153. .AP Tcl_Obj *destPathPtr in
  154. As for fBpathPtrfR, but used for the destination filename for a copy or
  155. rename operation.
  156. .AP "CONST char" *pattern in
  157. Only files or directories matching this pattern will be returned by
  158. fBTcl_FSMatchInDirectoryfR.
  159. .AP GlobTypeData *types in
  160. Only files or directories matching the type descriptions contained in
  161. this structure will be returned by fBTcl_FSMatchInDirectoryfR.  It
  162. is very important that the 'directory' flag is properly handled.
  163. This parameter may be NULL.
  164. .AP Tcl_Interp *interp in
  165. Interpreter to use either for results, evaluation, or reporting error 
  166. messages.
  167. .AP ClientData clientData in
  168. The native description of the path object to create.
  169. .AP Tcl_Obj *firstPtr in
  170. The first of two path objects to compare.  The object may be converted
  171. to fBpathfR type.
  172. .AP Tcl_Obj *secondPtr in
  173. The second of two path objects to compare.  The object may be converted
  174. to fBpathfR type.
  175. .AP Tcl_Obj *listObj in
  176. The list of path elements to operate on with a fBjoinfR operation.
  177. .AP int elements in
  178. If non-negative, the number of elements in the listObj which should
  179. be joined together.  If negative, then all elements are joined.
  180. .AP Tcl_Obj **errorPtr out
  181. In the case of an error, filled with an object containing the name of
  182. the file which caused an error in the various copy/rename operations.
  183. .AP Tcl_Obj **objPtrRef out
  184. Filled with an object containing the result of the operation.
  185. .AP Tcl_Obj *result out
  186. Pre-allocated object in which to store (by lappending) the list of
  187. files or directories which are successfully matched in
  188. fBTcl_FSMatchInDirectoryfR.
  189. .AP int mode in
  190. Mask consisting of one or more of R_OK, W_OK, X_OK and F_OK.  R_OK,
  191. W_OK and X_OK request checking whether the file exists and  has  read,
  192. write and  execute  permissions, respectively.  F_OK just requests
  193. checking for the existence of the file.
  194. .AP Tcl_StatBuf *statPtr out
  195. The structure that contains the result of a stat or lstat operation.
  196. .AP "CONST char" *sym1 in
  197. Name of a procedure to look up in the file's symbol table
  198. .AP "CONST char" *sym2 in
  199. Name of a procedure to look up in the file's symbol table
  200. .AP Tcl_PackageInitProc **proc1Ptr out
  201. Filled with the init function for this code.
  202. .AP Tcl_PackageInitProc **proc2Ptr out
  203. Filled with the safe-init function for this code.
  204. .AP Tcl_LoadHandle *handlePtr out
  205. Filled with an abstract token representing the loaded file.
  206. .AP ClientData *clientDataPtr out
  207. Filled with the clientData value to pass to this code's unload
  208. function when it is called.
  209. .AP TclfsUnloadFileProc_ **unloadProcPtr out
  210. Filled with the function to use to unload this piece of code.
  211. .AP utimbuf *tval in
  212. The access and modification times in this structure are read and 
  213. used to set those values for a given file.
  214. .AP "CONST char" *modeString in
  215. Specifies how the file is to be accessed.  May have any of the values
  216. allowed for the fImodefR argument to the Tcl fBopenfR command.
  217. .AP int permissions in
  218. POSIX-style permission flags such as 0644.  If a new file is created, these
  219. permissions will be set on the created file.
  220. .AP int *lenPtr out
  221. If non-NULL, filled with the number of elements in the split path.
  222. .AP Tcl_Obj *basePtr in
  223. The base path on to which to join the given elements.  May be NULL.
  224. .AP int objc in
  225. The number of elements in fIobjvfR.
  226. .AP "Tcl_Obj *CONST" objv[] in
  227. The elements to join to the given base path.
  228. .BE
  229. .SH DESCRIPTION
  230. .PP
  231. There are several reasons for calling the fBTcl_FS...fR functions
  232. rather than calling system level functions like fBaccessfR and
  233. fBstatfR directly.  First, they will work cross-platform, so an
  234. extension which calls them should work unmodified on Unix, MacOS and
  235. Windows.  Second, the Windows implementation of some of these functions
  236. fixes some bugs in the system level calls.  Third, these function calls
  237. deal with any 'Utf to platform-native' path conversions which may be
  238. required (and may cache the results of such conversions for greater
  239. efficiency on subsequent calls).  Fourth, and perhaps most importantly,
  240. all of these functions are 'virtual filesystem aware'.  Any virtual
  241. filesystem which has been registered (through
  242. fBTcl_FSRegisterfR) may reroute file access to alternative
  243. media or access methods.  This means that all of these functions (and
  244. therefore the corresponding fBfilefR, fBglobfR, fBpwdfR, fBcdfR,
  245. fBopenfR, etc.  Tcl commands) may be operate on 'files' which are not
  246. native files in the native filesystem.  This also means that any Tcl
  247. extension which accesses the filesystem through this API is
  248. automatically 'virtual filesystem aware'.  Of course, if an extension
  249. accesses the native filesystem directly (through platform-specific
  250. APIs, for example), then Tcl cannot intercept such calls.  
  251. .PP
  252. If appropriate vfs's have been registered, the 'files' may, to give two
  253. examples, be remote (e.g. situated on a remote ftp server) or archived
  254. (e.g. lying inside a .zip archive).  Such registered filesystems provide
  255. a lookup table of functions to implement all or some of the functionality
  256. listed here.  Finally, the fBTcl_FSStatfR and fBTcl_FSLstatfR calls
  257. abstract away from what the 'struct stat' buffer buffer is actually
  258. declared to be, allowing the same code to be used both on systems with
  259. and systems without support for files larger than 2GB in size.
  260. .PP
  261. The fBTcl_FS...fR are objectified and may cache internal
  262. representations and other path-related strings (e.g. the current working
  263. directory).  One side-effect of this is that one must not pass in objects
  264. with a refCount of zero to any of these functions.  If such calls were 
  265. handled, they might result
  266. in memory leaks (under some circumstances, the filesystem code may wish
  267. to retain a reference to the passed in object, and so one must not assume
  268. that after any of these calls return, the object still has a refCount of
  269. zero - it may have been incremented), or in a direct segfault
  270. due to the object being freed part way through the complex object
  271. manipulation required to ensure that the path is fully normalized and
  272. absolute for filesystem determination.  The practical lesson to learn
  273. from this is that fBTcl_Obj *path = Tcl_NewStringObj(...)  ;
  274. Tcl_FS...(path) ; Tcl_DecrRefCount(path)fR is wrong, and may segfault.
  275. The 'path' must have its refCount incremented before passing it in, or
  276. decrementing it.  For this reason, objects with a refCount of zero are
  277. considered not to be valid filesystem paths and calling any Tcl_FS API
  278. with such an object will result in no action being taken.
  279. .PP
  280. fBTcl_FSCopyFilefR attempts to copy the file given by srcPathPtr to the
  281. path name given by destPathPtr.  If the two paths given lie in the same
  282. filesystem (according to fBTcl_FSGetFileSystemForPathfR) then that
  283. filesystem's 'copy file' function is called (if it is non-NULL).
  284. Otherwise the function returns -1 and sets Tcl's errno to the 'EXDEV'
  285. posix error code (which signifies a 'cross-domain link').
  286. .PP
  287. fBTcl_FSCopyDirectoryfR attempts to copy the directory given by srcPathPtr to the
  288. path name given by destPathPtr.  If the two paths given lie in the same
  289. filesystem (according to fBTcl_FSGetFileSystemForPathfR) then that
  290. filesystem's 'copy file' function is called (if it is non-NULL).
  291. Otherwise the function returns -1 and sets Tcl's errno to the 'EXDEV'
  292. posix error code (which signifies a 'cross-domain link').
  293. .PP
  294. fBTcl_FSCreateDirectoryfR attempts to create the directory given by
  295. pathPtr by calling the owning filesystem's 'create directory'
  296. function.
  297. .PP
  298. fBTcl_FSDeleteFilefR attempts to delete the file given by
  299. pathPtr by calling the owning filesystem's 'delete file'
  300. function.
  301. .PP
  302. fBTcl_FSRemoveDirectoryfR attempts to remove the directory given by
  303. pathPtr by calling the owning filesystem's 'remove directory'
  304. function.
  305. .PP
  306. fBTcl_FSRenameFilefR attempts to rename the file or directory given by
  307. srcPathPtr to the path name given by destPathPtr.  If the two paths
  308. given lie in the same filesystem (according to
  309. fBTcl_FSGetFileSystemForPathfR) then that filesystem's 'rename file'
  310. function is called (if it is non-NULL).  Otherwise the function returns -1
  311. and sets Tcl's errno to the 'EXDEV' posix error code (which signifies
  312. a ``cross-domain link'').
  313. .PP
  314. fBTcl_FSListVolumesfR calls each filesystem which has a non-NULL 'list
  315. volumes' function and asks them to return their list of root volumes.  It
  316. accumulates the return values in a list which is returned to the
  317. caller (with a refCount of 0).
  318. .PP
  319. fBTcl_FSEvalFilefR reads the file given by fIpathPtrfR and evaluates
  320. its contents as a Tcl script.  It returns the same information as
  321. fBTcl_EvalObjExfR.
  322. If the file couldn't be read then a Tcl error is returned to describe
  323. why the file couldn't be read.
  324. The eofchar for files is '\32' (^Z) for all platforms.
  325. If you require a ``^Z'' in code for string comparison, you can use
  326. ``\032'' or ``\u001a'', which will be safely substituted by the Tcl
  327. interpreter into ``^Z''.
  328. .PP
  329. fBTcl_FSLoadFilefR dynamically loads a binary code file into memory and
  330. returns the addresses of two procedures within that file, if they are
  331. defined.  The appropriate function for the filesystem to which pathPtr
  332. belongs will be called.  If that filesystem does not implement this
  333. function (most virtual filesystems will not, because of OS limitations
  334. in dynamically loading binary code), Tcl will attempt to copy the file
  335. to a temporary directory and load that temporary file.
  336. .PP
  337. Returns a standard Tcl completion code.  If an error occurs, an error
  338. message is left in the interp's result.
  339. .PP
  340. fBTcl_FSMatchInDirectoryfR is used by the globbing code to search a
  341. directory for all files which match a given pattern.  The appropriate
  342. function for the filesystem to which pathPtr belongs will be called.
  343. .PP
  344. The return value is a standard Tcl result indicating whether an error
  345. occurred in globbing.  Error messages are placed in interp, but good
  346. results are placed in the resultPtr given.
  347.  
  348. Note that the 'glob' code implements recursive patterns internally, so
  349. this function will only ever be passed simple patterns, which can be
  350. matched using the logic of 'string match'.  To handle recursion, Tcl
  351. will call this function frequently asking only for directories to be
  352. returned.
  353. .PP
  354. fBTcl_FSLinkfR replaces the library version of readlink(), and
  355. extends it to support the creation of links.  The appropriate function 
  356. for the filesystem to which linkNamePtr belongs will be called.
  357. .PP
  358. If the fItoPtrfR is NULL, a readlink action is performed.  The result
  359. is a Tcl_Obj specifying the contents of the symbolic link given by
  360. fIlinkNamePtrfR, or NULL if the link could not be read.  The result is owned
  361. by the caller, which should call Tcl_DecrRefCount when the result is no
  362. longer needed.  If the fItoPtrfR is not NULL, Tcl should create a link
  363. of one of the types passed in in the fIlinkActionfR flag.  This flag is
  364. an or'd combination of TCL_CREATE_SYMBOLIC_LINK and TCL_CREATE_HARD_LINK.
  365. Where a choice exists (i.e. more than one flag is passed in), the Tcl
  366. convention is to prefer symbolic links.  When a link is successfully
  367. created, the return value should be fItoPtrfR (which is therefore
  368. already owned by the caller).  If unsuccessful, NULL should be
  369. returned.
  370. .PP
  371. fBTcl_FSLstatfR fills the stat structure fIstatPtrfR with information
  372. about the specified file.  You do not need any access rights to the
  373. file to get this information but you need search rights to all
  374. directories named in the path leading to the file.  The stat structure
  375. includes info regarding device, inode (always 0 on Windows),
  376. privilege mode, nlink (always 1 on Windows), user id (always 0 on
  377. Windows), group id (always 0 on Windows), rdev (same as device on
  378. Windows), size, last access time, last modification time, and creation
  379. time.
  380. .PP
  381. If fIpathfR exists, fBTcl_FSLstatfR returns 0 and the stat structure
  382. is filled with data.  Otherwise, -1 is returned, and no stat info is
  383. given.
  384. .PP
  385. fBTcl_FSUtimefR replaces the library version of utime.  
  386. .PP
  387. For results see 'utime' documentation.  If successful, the function
  388. will update the 'atime' and 'mtime' values of the file given.
  389. .PP
  390. fBTcl_FSFileAttrsGetfR implements read access for the hookable 'file
  391. attributes' subcommand.  The appropriate function for the filesystem to
  392. which pathPtr belongs will be called.
  393. .PP
  394. If the result is TCL_OK, then an object was placed in objPtrRef, which
  395. will only be temporarily valid (unless Tcl_IncrRefCount is called).
  396. .PP
  397. fBTcl_FSFileAttrsSetfR implements write access for the hookable 'file
  398. attributes' subcommand.  The appropriate function for the filesystem to
  399. which pathPtr belongs will be called.
  400. .PP
  401. fBTcl_FSFileAttrStringsfR implements part of the hookable 'file attributes'
  402. subcommand.  The appropriate function for the filesystem to which
  403. pathPtr belongs will be called.
  404. .PP 
  405. The called procedure may either return an array of strings, or may
  406. instead return NULL and place a Tcl list into the given objPtrRef.  Tcl
  407. will take that list and first increment its refCount before using it.
  408. On completion of that use, Tcl will decrement its refCount.  Hence if
  409. the list should be disposed of by Tcl when done, it should have a
  410. refCount of zero, and if the list should not be disposed of, the
  411. filesystem should ensure it retains a refCount on the object.
  412. .PP
  413. fBTcl_FSAccessfR checks whether the process would be allowed to read,
  414. write or test for existence of the file (or other file system object)
  415. whose name is pathname.   If pathname is a symbolic link on Unix,
  416. then permissions of the file referred by this symbolic link are
  417. tested.
  418. .PP
  419. On success (all requested permissions granted), zero is returned.  On
  420. error (at least one bit in mode asked for a permission that is denied,
  421. or some other  error occurred), -1 is returned.
  422. .PP
  423. fBTcl_FSStatfR fills the stat structure fIstatPtrfR with information
  424. about the specified file.  You do not need any access rights to the
  425. file to get this information but you need search rights to all
  426. directories named in the path leading to the file.  The stat structure
  427. includes info regarding device, inode (always 0 on Windows),
  428. privilege mode, nlink (always 1 on Windows), user id (always 0 on
  429. Windows), group id (always 0 on Windows), rdev (same as device on
  430. Windows), size, last access time, last modification time, and creation
  431. time.
  432. .PP
  433. If fIpathfR exists, fBTcl_FSStatfR returns 0 and the stat structure
  434. is filled with data.  Otherwise, -1 is returned, and no stat info is
  435. given.
  436. .PP
  437. fBTcl_FSOpenFileChannelfR opens a file specified by fIpathPtrfR and
  438. returns a channel handle that can be used to perform input and output on
  439. the file. This API is modeled after the fBfopenfR procedure of
  440. the Unix standard I/O library.
  441. The syntax and meaning of all arguments is similar to those
  442. given in the Tcl fBopenfR command when opening a file.
  443. If an error occurs while opening the channel, fBTcl_FSOpenFileChannelfR
  444. returns NULL and records a POSIX error code that can be
  445. retrieved with fBTcl_GetErrnofR.
  446. In addition, if fIinterpfR is non-NULL, fBTcl_FSOpenFileChannelfR
  447. leaves an error message in fIinterpfR's result after any error.
  448. .PP
  449. The newly created channel is not registered in the supplied interpreter; to
  450. register it, use fBTcl_RegisterChannelfR, described below.
  451. If one of the standard channels, fBstdin, stdoutfR or fBstderrfR was
  452. previously closed, the act of creating the new channel also assigns it as a
  453. replacement for the standard channel.
  454. .PP
  455. fBTcl_FSGetCwdfR replaces the library version of getcwd().
  456. .PP
  457. It returns the Tcl library's current working directory.  This may be
  458. different to the native platform's working directory, in the case for 
  459. which the cwd is not in the native filesystem.
  460. .PP
  461. The result is a pointer to a Tcl_Obj specifying the current directory,
  462. or NULL if the current directory could not be determined.  If NULL is
  463. returned, an error message is left in the interp's result.
  464. The result already has its refCount incremented for the caller.  When
  465. it is no longer needed, that refCount should be decremented.  This is
  466. needed for thread-safety purposes, to allow multiple threads to access
  467. this and related functions, while ensuring the results are always
  468. valid.
  469. .PP
  470. fBTcl_FSChdirfR replaces the library version of chdir().  The path is
  471. normalized and then passed to the filesystem which claims it.  If that
  472. filesystem does not implement this function, Tcl will fallback to a 
  473. combination of stat and access to check whether the directory exists
  474. and has appropriate permissions.
  475. .PP 
  476. For results, see chdir() documentation.  If successful, we keep a
  477. record of the successful path in cwdPathPtr for subsequent calls to
  478. getcwd.
  479. .PP
  480. fBTcl_FSPathSeparatorfR returns the separator character to be used for 
  481. most specific element of the path specified by pathPtr (i.e. the last 
  482. part of the path).
  483. .PP
  484. The separator is returned as a Tcl_Obj containing a string of length
  485. 1.  If the path is invalid, NULL is returned.
  486. .PP
  487. fBTcl_FSJoinPathfR takes the given Tcl_Obj, which should be a valid list,
  488. and returns the path object given by considering the first 'elements'
  489. elements as valid path segments.  If elements < 0, we use the entire
  490. list.
  491. .PP
  492. Returns object with refCount of zero, containing the joined path.
  493. .PP
  494. fBTcl_FSSplitPathfR takes the given Tcl_Obj, which should be a valid path,
  495. and returns a Tcl List object containing each segment of that path as
  496. an element.
  497. .PP
  498. Returns list object with refCount of zero.  If the passed in lenPtr is
  499. non-NULL, we use it to return the number of elements in the returned
  500. list.
  501. .PP
  502. fBTcl_FSEqualPathsfR tests whether the two paths given represent the same
  503. filesystem object
  504. .PP
  505. It returns 1 if the paths are equal, and 0 if they are different.  If 
  506. either path is NULL, 0 is always returned.
  507. .PP
  508. fBTcl_FSGetNormalizedPathfR this important function attempts to extract
  509. from the given Tcl_Obj a unique normalized path representation, whose
  510. string value can be used as a unique identifier for the file.
  511. .PP
  512. It returns the normalized path object, with refCount of zero, or NULL 
  513. if the path was invalid or could otherwise not be successfully
  514. converted.  Extraction of absolute, normalized paths is very
  515. efficient (because the filesystem operates on these representations
  516. internally), although the result when the filesystem contains
  517. numerous symbolic links may not be the most user-friendly
  518. version of a path.
  519. .PP
  520. fBTcl_FSJoinToPathfR takes the given object, which should usually be a
  521. valid path or NULL, and joins onto it the array of paths segments
  522. given.
  523. .PP
  524. Returns object with refCount of zero, containing the joined path.
  525. .PP
  526. fBTcl_FSConvertToPathTypefR tries to convert the given Tcl_Obj to a valid
  527. Tcl path type, taking account of the fact that the cwd may have changed
  528. even if this object is already supposedly of the correct type.
  529. The filename may begin with "~" (to indicate current user's home
  530. directory) or "~<user>" (to indicate any user's home directory).
  531. .PP
  532. If the conversion succeeds (i.e. the object is a valid path in one of 
  533. the current filesystems), then TCL_OK is returned.  Otherwise
  534. TCL_ERROR is returned, and an error message may
  535. be left in the interpreter.
  536. .PP
  537. fBTcl_FSGetInternalRepfR extracts the internal representation of a given
  538. path object, in the given filesystem.  If the path object belongs to a
  539. different filesystem, we return NULL. If the internal representation is
  540. currently NULL, we attempt to generate it, by calling the filesystem's
  541. fBTcl_FSCreateInternalRepProcfR.
  542. .PP
  543. Returns NULL or a valid internal path representation.  This internal
  544. representation is cached, so that repeated calls to this function will
  545. not require additional conversions.
  546. .PP
  547. fBTcl_FSGetTranslatedPathfR attempts to extract the translated path
  548. from the given Tcl_Obj.  
  549. .PP
  550. If the translation succeeds (i.e. the object is a valid path), then it is
  551. returned.  Otherwise NULL will be returned, and an error message may be
  552. left in the interpreter.  A "translated" path is one which contains no
  553. "~" or "~user" sequences (these have been expanded to their current
  554. representation in the filesystem).  The object returned is owned by the
  555. caller, which must store it or call Tcl_DecrRefCount to ensure memory is
  556. freed.  This function is of little practical use, and
  557. fBTcl_FSGetNormalizedPathfR or fBTcl_GetNativePathfR are usually
  558. better functions to use for most purposes.
  559. .PP
  560. fBTcl_FSGetTranslatedStringPathfR does the same as
  561. fBTcl_FSGetTranslatedPathfR, but returns a character string or NULL.
  562. The string returned is dynamically allocated and owned by the caller,
  563. which must store it or call ckfree to ensure it is freed.  Again,
  564. fBTcl_FSGetNormalizedPathfR or fBTcl_GetNativePathfR are usually
  565. better functions to use for most purposes.
  566. .PP
  567. fBTcl_FSNewNativePathfR performs something like that reverse of the
  568. usual obj->path->nativerep conversions.  If some code retrieves a path
  569. in native form (from, e.g. readlink or a native dialog), and that path
  570. is to be used at the Tcl level, then calling this function is an
  571. efficient way of creating the appropriate path object type.
  572. .PP
  573. The resulting object is a pure 'path' object, which will only receive 
  574. a Utf-8 string representation if that is required by some Tcl code.
  575. .PP
  576. fBTcl_FSGetNativePathfR is for use by the Win/Unix/MacOS native
  577. filesystems, so that they can easily retrieve the native (char* or
  578. TCHAR*) representation of a path.  This function is a convenience
  579. wrapper around fBTcl_FSGetInternalRepfR, and assumes the native
  580. representation is string-based.  It may be desirable in the future
  581. to have non-string-based native representations (for example, on
  582. MacOS, a representation using a fileSpec of FSRef structure would
  583. probably be more efficient).  On Windows a full Unicode
  584. representation would allow for paths of unlimited length.  Currently
  585. the representation is simply a character string containing the
  586. complete, absolute path in the native encoding.
  587. .PP
  588. The native representation is cached so that repeated calls to this
  589. function will not require additional conversions.
  590. .PP
  591. fBTcl_FSFileSystemInfofR returns a list of two elements.  The first
  592. element is the name of the filesystem (e.g. "native" or "vfs" or "zip"
  593. or "prowrap", perhaps), and the second is the particular type of the
  594. given path within that filesystem (which is filesystem dependent).  The
  595. second element may be empty if the filesystem does not provide a
  596. further categorization of files.
  597. .PP
  598. A valid list object is returned, unless the path object is not
  599. recognized, when NULL will be returned.
  600. .PP
  601. fBTcl_FSGetFileSystemForPathfR returns the a pointer to the
  602. fBTcl_FilesystemfR which accepts this path as valid.
  603. .PP
  604. If no filesystem will accept the path, NULL is returned.
  605. .PP
  606. fBTcl_FSGetPathTypefR determines whether the given path is relative 
  607. to the current directory, relative to the current volume, or
  608. absolute.
  609. .PP
  610. It returns one of TCL_PATH_ABSOLUTE, TCL_PATH_RELATIVE, or
  611. TCL_PATH_VOLUME_RELATIVE
  612. .PP
  613. fBTcl_AllocStatBuffR allocates a fITcl_StatBuffR on the system
  614. heap (which may be deallocated by being passed to fBckfreefR.)  This
  615. allows extensions to invoke fBTcl_FSStatfR and fBTcl_FSLStatfR
  616. without being dependent on the size of the buffer.  That in turn
  617. depends on the flags used to build Tcl.
  618. .PP
  619. .SH TCL_FILESYSTEM
  620. .PP
  621. A filesystem provides a fBTcl_FilesystemfR structure that contains
  622. pointers to functions that implement the various operations on a
  623. filesystem; these operations are invoked as needed by the generic
  624. layer, which generally occurs through the functions listed above.  
  625. .PP
  626. The fBTcl_FilesystemfR structures are manipulated using the following
  627. methods.
  628. .PP
  629. fBTcl_FSRegisterfR takes a pointer to a filesystem structure and an
  630. optional piece of data to associated with that filesystem.  On calling
  631. this function, Tcl will attach the filesystem to the list of known
  632. filesystems, and it will become fully functional immediately.  Tcl does
  633. not check if the same filesystem is registered multiple times (and in
  634. general that is not a good thing to do).  TCL_OK will be returned.
  635. .PP
  636. fBTcl_FSUnregisterfR removes the given filesystem structure from
  637. the list of known filesystems, if it is known, and returns TCL_OK.  If
  638. the filesystem is not currently registered, TCL_ERROR is returned.
  639. .PP
  640. fBTcl_FSDatafR will return the ClientData associated with the given 
  641. filesystem, if that filesystem is registered.  Otherwise it will
  642. return NULL.
  643. .PP
  644. fBTcl_FSMountsChangedfR is used to inform the Tcl's core that
  645. the set of mount points for the given (already registered) filesystem
  646. have changed, and that cached file representations may therefore no
  647. longer be correct.
  648. .PP
  649. The fBTcl_FilesystemfR structure contains the following fields:
  650. .CS
  651. typedef struct Tcl_Filesystem {
  652.     CONST char *fItypeNamefR;  
  653.     int fIstructureLengthfR;   
  654.     Tcl_FSVersion fIversionfR;  
  655.     Tcl_FSPathInFilesystemProc *fIpathInFilesystemProcfR;
  656.     Tcl_FSDupInternalRepProc *fIdupInternalRepProcfR;
  657.     Tcl_FSFreeInternalRepProc *fIfreeInternalRepProcfR;
  658.     Tcl_FSInternalToNormalizedProc *fIinternalToNormalizedProcfR;
  659.     Tcl_FSCreateInternalRepProc *fIcreateInternalRepProcfR;
  660.     Tcl_FSNormalizePathProc *fInormalizePathProcfR;       
  661.     Tcl_FSFilesystemPathTypeProc *fIfilesystemPathTypeProcfR;
  662.     Tcl_FSFilesystemSeparatorProc *fIfilesystemSeparatorProcfR;
  663.     Tcl_FSStatProc *fIstatProcfR; 
  664.     Tcl_FSAccessProc *fIaccessProcfR;     
  665.     Tcl_FSOpenFileChannelProc *fIopenFileChannelProcfR; 
  666.     Tcl_FSMatchInDirectoryProc *fImatchInDirectoryProcfR;  
  667.     Tcl_FSUtimeProc *fIutimeProcfR;       
  668.     Tcl_FSLinkProc *fIlinkProcfR; 
  669.     Tcl_FSListVolumesProc *fIlistVolumesProcfR;     
  670.     Tcl_FSFileAttrStringsProc *fIfileAttrStringsProcfR;
  671.     Tcl_FSFileAttrsGetProc *fIfileAttrsGetProcfR;
  672.     Tcl_FSFileAttrsSetProc *fIfileAttrsSetProcfR;
  673.     Tcl_FSCreateDirectoryProc *fIcreateDirectoryProcfR;     
  674.     Tcl_FSRemoveDirectoryProc *fIremoveDirectoryProcfR;     
  675.     Tcl_FSDeleteFileProc *fIdeleteFileProcfR;     
  676.     Tcl_FSCopyFileProc *fIcopyFileProcfR; 
  677.     Tcl_FSRenameFileProc *fIrenameFileProcfR;     
  678.     Tcl_FSCopyDirectoryProc *fIcopyDirectoryProcfR;     
  679.     Tcl_FSLstatProc *fIlstatProcfR;     
  680.     Tcl_FSLoadFileProc *fIloadFileProcfR; 
  681.     Tcl_FSGetCwdProc *fIgetCwdProcfR;     
  682.     Tcl_FSChdirProc *fIchdirProcfR;     
  683. } Tcl_Filesystem;
  684. .CE
  685. .PP
  686. Except for the first three fields in this structure which contain
  687. simple data elements, all entries contain addresses of functions called
  688. by the generic filesystem layer to perform the complete range of
  689. filesystem related actions.
  690. .PP
  691. The many functions in this structure are broken down into three
  692. categories: infrastructure functions (almost all of which must be
  693. implemented), operational functions (which must be implemented if a
  694. complete filesystem is provided), and efficiency functions (which need
  695. only be implemented if they can be done so efficiently, or if they have
  696. side-effects which are required by the filesystem; Tcl has less
  697. efficient emulations it can fall back on).  It is important to note
  698. that, in the current version of Tcl, most of these fallbacks are only
  699. used to handle commands initiated in Tcl, not in C. What this means is,
  700. that if a 'file rename' command is issued in Tcl, and the relevant
  701. filesystem(s) do not implement their fITcl_FSRenameFileProcfR, Tcl's
  702. core will instead fallback on a combination of other filesystem
  703. functions (it will use fITcl_FSCopyFileProcfR followed by
  704. fITcl_FSDeleteFileProcfR, and if fITcl_FSCopyFileProcfR is not
  705. implemented there is a further fallback).  However, if a
  706. fITcl_FSRenameFilefR command is issued at the C level, no such
  707. fallbacks occur.  This is true except for the last four entries in the
  708. filesystem table (lstat, load, getcwd and chdir)
  709. for which fallbacks do in fact occur at the C level.
  710. .PP
  711. As an example, here is the filesystem lookup table used by the
  712. "vfs" extension which allows filesystem actions to be implemented
  713. in Tcl.
  714. .CS
  715. static Tcl_Filesystem vfsFilesystem = {
  716.     "tclvfs",
  717.     sizeof(Tcl_Filesystem),
  718.     TCL_FILESYSTEM_VERSION_1,
  719.     &VfsPathInFilesystem,
  720.     &VfsDupInternalRep,
  721.     &VfsFreeInternalRep,
  722.     /* No internal to normalized, since we don't create any
  723.      * pure 'internal' Tcl_Obj path representations */
  724.     NULL,
  725.     /* No create native rep function, since we don't use it
  726.      * and don't choose to support uses of 'Tcl_FSNewNativePath' */
  727.     NULL,
  728.     /* Normalize path isn't needed - we assume paths only have
  729.      * one representation */
  730.     NULL,
  731.     &VfsFilesystemPathType,
  732.     &VfsFilesystemSeparator,
  733.     &VfsStat,
  734.     &VfsAccess,
  735.     &VfsOpenFileChannel,
  736.     &VfsMatchInDirectory,
  737.     &VfsUtime,
  738.     /* We choose not to support symbolic links inside our vfs's */
  739.     NULL,
  740.     &VfsListVolumes,
  741.     &VfsFileAttrStrings,
  742.     &VfsFileAttrsGet,
  743.     &VfsFileAttrsSet,
  744.     &VfsCreateDirectory,
  745.     &VfsRemoveDirectory, 
  746.     &VfsDeleteFile,
  747.     /* No copy file - fallback will occur at Tcl level */
  748.     NULL,
  749.     /* No rename file - fallback will occur at Tcl level */
  750.     NULL,
  751.     /* No copy directory - fallback will occur at Tcl level */
  752.     NULL, 
  753.     /* Core will use stat for lstat */
  754.     NULL,
  755.     /* No load - fallback on core implementation */
  756.     NULL,
  757.     /* We don't need a getcwd or chdir - fallback on Tcl's versions */
  758.     NULL,
  759.     NULL
  760. };
  761. .CE
  762. .PP
  763. Any functions which take path names in Tcl_Obj form take
  764. those names in UTF-8 form.  The filesystem infrastructure API is
  765. designed to support efficient, cached conversion of these UTF-8 paths
  766. to other native representations.
  767. .SH TYPENAME
  768. .PP
  769. The fItypeNamefR field contains a null-terminated string that
  770. identifies the type of the filesystem implemented, e.g.
  771. fBnativefR or fBzipfR or fBvfsfR.
  772. .PP
  773. .SH "STRUCTURE LENGTH"
  774. .PP
  775. The fIstructureLengthfR field is generally implemented as
  776. fIsizeof(Tcl_Filesystem)fR, and is there to allow easier
  777. binary backwards compatibility if the size of the structure
  778. changes in a future Tcl release.
  779. .SH VERSION
  780. .PP
  781. The fIversionfR field should be set to fBTCL_FILESYSTEM_VERSION_1fR.
  782. .SH "FILESYSTEM INFRASTRUCTURE"
  783. .PP
  784. These fields contain addresses of functions which are used to associate
  785. a particular filesystem with a file path, and deal with the internal
  786. handling of path representations, for example copying and freeing such
  787. representations.
  788. .SH PATHINFILESYSTEMPROC
  789. .PP
  790. The fIpathInFilesystemProcfR field contains the address of a function
  791. which is called to determine whether a given path object belongs to this
  792. filesystem or not.  Tcl will only call the rest of the filesystem
  793. functions with a path for which this function has returned fBTCL_OKfR.
  794. If the path does not belong, -1 should be returned (the behaviour of Tcl
  795. for any other return value is not defined).  If fBTCL_OKfR is returned,
  796. then the optional fBclientDataPtrfR output parameter can be used to
  797. return an internal (filesystem specific) representation of the path,
  798. which will be cached inside the path object, and may be retrieved
  799. efficiently by the other filesystem functions.  Tcl will simultaneously
  800. cache the fact that this path belongs to this filesystem.  Such caches
  801. are invalidated when filesystem structures are added or removed from
  802. Tcl's internal list of known filesystems.
  803. .PP
  804. .CS
  805. typedef int Tcl_FSPathInFilesystemProc(
  806. Tcl_Obj *fIpathPtrfR, 
  807. ClientData *fIclientDataPtrfR);
  808. .CE
  809. .SH DUPINTERNALREPPROC
  810. .PP
  811. This function makes a copy of a path's internal representation, and is
  812. called when Tcl needs to duplicate a path object.  If NULL, Tcl will
  813. simply not copy the internal representation, which may then need to be
  814. regenerated later.
  815. .PP
  816. .CS
  817. typedef ClientData Tcl_FSDupInternalRepProc(
  818. ClientData fIclientDatafR);
  819. .CE
  820. .SH FREEINTERNALREPPROC
  821. Free the internal representation.  This must be implemented if internal
  822. representations need freeing (i.e. if some memory is allocated when an
  823. internal representation is generated), but may otherwise be NULL.
  824. .PP
  825. .CS
  826. typedef void Tcl_FSFreeInternalRepProc(
  827. ClientData fIclientDatafR);
  828. .CE
  829. .SH INTERNALTONORMALIZEDPROC
  830. .PP
  831. Function to convert internal representation to a normalized path.  Only
  832. required if the filesystem creates pure path objects with no string/path
  833. representation.  The return value is a Tcl object whose string
  834. representation is the normalized path.
  835. .PP
  836. .CS
  837. typedef Tcl_Obj* Tcl_FSInternalToNormalizedProc(
  838. ClientData fIclientDatafR);
  839. .CE
  840. .SH CREATEINTERNALREPPROC
  841. .PP
  842. Function to take a path object, and calculate an internal
  843. representation for it, and store that native representation in the
  844. object.  May be NULL if paths have no internal representation, or if
  845. the fITcl_FSPathInFilesystemProcfR for this filesystem always
  846. immediately creates an internal representation for paths it accepts.
  847. .PP
  848. .CS
  849. typedef ClientData Tcl_FSCreateInternalRepProc(
  850. Tcl_Obj *fIpathPtrfR);
  851. .CE
  852. .SH NORMALIZEPATHPROC       
  853. .PP
  854. Function to normalize a path.  Should be implemented for all
  855. filesystems which can have multiple string representations for the same
  856. path object.  In Tcl, every 'path' must have a single unique 'normalized'
  857. string representation.  Depending on the filesystem,
  858. there may be more than one unnormalized string representation which
  859. refers to that path (e.g. a relative path, a path with different
  860. character case if the filesystem is case insensitive, a path contain a
  861. reference to a home directory such as '~', a path containing symbolic
  862. links, etc).  If the very last component in the path is a symbolic
  863. link, it should not be converted into the object it points to (but
  864. its case or other aspects should be made unique).  All other path
  865. components should be converted from symbolic links.  This one
  866. exception is required to agree with Tcl's semantics with 'file
  867. delete', 'file rename', 'file copy' operating on symbolic links.
  868. This function may be called with 'nextCheckpoint' either
  869. at the beginning of the path (i.e. zero), at the end of the path, or
  870. at any intermediate file separator in the path.  It will never
  871. point to any other arbitrary position in the path. In the last of
  872. the three valid cases, the implementation can assume that the path 
  873. up to and including the file separator is known and normalized.
  874. .PP
  875. .CS
  876. typedef int Tcl_FSNormalizePathProc(
  877. Tcl_Interp *fIinterpfR, 
  878. Tcl_Obj *fIpathPtrfR, 
  879. int fInextCheckpointfR);
  880. .CE
  881. .SH "FILESYSTEM OPERATIONS"
  882. .PP
  883. The fields in this section of the structure contain addresses of
  884. functions which are called to carry out the basic filesystem
  885. operations.  A filesystem which expects to be used with the complete
  886. standard Tcl command set must implement all of these.  If some of
  887. them are not implemented, then certain Tcl commands may fail when
  888. operating on paths within that filesystem.  However, in some instances
  889. this may be desirable (for example, a read-only filesystem should not
  890. implement the last four functions, and a filesystem which does not
  891. support symbolic links need not implement the fBreadlinkfR function,
  892. etc.  The Tcl core expects filesystems to behave in this way).
  893. .SH FILESYSTEMPATHTYPEPROC
  894. .PP
  895. Function to determine the type of a path in this filesystem.  May be
  896. NULL, in which case no type information will be available to users of
  897. the filesystem.  The 'type' is used only for informational purposes,
  898. and should be returned as the string representation of the Tcl_Obj
  899. which is returned.  A typical return value might be "networked", "zip"
  900. or "ftp".  The Tcl_Obj result is owned by the filesystem and so Tcl will 
  901. increment the refCount of that object if it wishes to retain a reference 
  902. to it.
  903. .PP
  904. .CS
  905. typedef Tcl_Obj* Tcl_FSFilesystemPathTypeProc(
  906. Tcl_Obj *fIpathPtrfR);
  907. .CE
  908. .SH FILESYSTEMSEPARATORPROC
  909. .PP
  910. Function to return the separator character(s) for this filesystem.
  911. Must be implemented, otherwise the fBfile separatorfR command will not
  912. function correctly.  The usual return value will be a Tcl_Obj
  913. containing the string "/".
  914. .PP
  915. .CS
  916. typedef Tcl_Obj* Tcl_FSFilesystemSeparatorProc(
  917. Tcl_Obj *fIpathPtrfR);
  918. .CE
  919. .SH STATPROC 
  920. .PP
  921. Function to process a fBTcl_FSStat()fR call.  Must be implemented for any
  922. reasonable filesystem, since many Tcl level commands depend crucially 
  923. upon it (e.g. fBfile atimefR, fBfile isdirectoryfR, fBfile sizefR,
  924. fBglobfR).
  925. .PP
  926. .CS
  927. typedef int Tcl_FSStatProc(
  928. Tcl_Obj *fIpathPtrfR,
  929. Tcl_StatBuf *fIstatPtrfR);
  930. .CE
  931. .PP
  932. The fBTcl_FSStatProcfR fills the stat structure fIstatPtrfR with
  933. information about the specified file.  You do not need any access
  934. rights to the file to get this information but you need search rights
  935. to all directories named in the path leading to the file.  The stat
  936. structure includes info regarding device, inode (always 0 on Windows),
  937. privilege mode, nlink (always 1 on Windows), user id (always 0 on
  938. Windows), group id (always 0 on Windows), rdev (same as device on
  939. Windows), size, last access time, last modification time, and creation
  940. time.
  941. .PP
  942. If the file represented by fIpathPtrfR exists, the
  943. fBTcl_FSStatProcfR returns 0 and the stat structure is filled with
  944. data.  Otherwise, -1 is returned, and no stat info is given.
  945. .SH ACCESSPROC     
  946. .PP
  947. Function to process a fBTcl_FSAccess()fR call.  Must be implemented for
  948. any reasonable filesystem, since many Tcl level commands depend crucially 
  949. upon it (e.g. fBfile existsfR, fBfile readablefR).
  950. .PP
  951. .CS
  952. typedef int Tcl_FSAccessProc(
  953. Tcl_Obj *fIpathPtrfR,
  954. int fImodefR);
  955. .CE
  956. .PP
  957. The fBTcl_FSAccessProcfR checks whether the process would be allowed
  958. to read, write or test for existence of the file (or other file system
  959. object) whose name is pathname.  If pathname is a symbolic link, then
  960. permissions of the file referred by this symbolic link should be tested.
  961. .PP
  962. On success (all requested permissions granted), zero is returned.  On
  963. error (at least one bit in mode asked for a permission that is denied,
  964. or some other  error occurred), -1 is returned.
  965. .PP
  966. .SH OPENFILECHANNELPROC 
  967. .PP
  968. Function to process a fBTcl_FSOpenFileChannel()fR call.  Must be
  969. implemented for any reasonable filesystem, since any operations
  970. which require open or accessing a file's contents will use it 
  971. (e.g. fBopenfR, fBencodingfR, and many Tk commands).
  972. .PP
  973. .CS
  974. typedef Tcl_Channel Tcl_FSOpenFileChannelProc(
  975. Tcl_Interp *fIinterpfR,
  976. Tcl_Obj *fIpathPtrfR,
  977. int fImodefR,
  978. int fIpermissionsfR);
  979. .CE
  980. .PP
  981. The fBTcl_FSOpenFileChannelProcfR opens a file specified by
  982. fIpathPtrfR and returns a channel handle that can be used to perform
  983. input and output on the file.  This API is modeled after the fBfopenfR
  984. procedure of the Unix standard I/O library.  The syntax and meaning of
  985. all arguments is similar to those given in the Tcl fBopenfR command
  986. when opening a file, where the fImodefR argument is a combination of
  987. the POSIX flags O_RDONLY, O_WRONLY, etc.  If an error occurs while
  988. opening the channel, the fBTcl_FSOpenFileChannelProcfR returns NULL and
  989. records a POSIX error code that can be retrieved with fBTcl_GetErrnofR.
  990. In addition, if fIinterpfR is non-NULL, the
  991. fBTcl_FSOpenFileChannelProcfR leaves an error message in fIinterpfR's
  992. result after any error.
  993. .PP
  994. The newly created channel is not registered in the supplied
  995. interpreter; to register it, use fBTcl_RegisterChannelfR. If one of
  996. the standard channels, fBstdin, stdoutfR or fBstderrfR was
  997. previously closed, the act of creating the new channel also assigns it
  998. as a replacement for the standard channel.
  999. .SH MATCHINDIRECTORYPROC  
  1000. .PP
  1001. Function to process a fBTcl_FSMatchInDirectory()fR call.  If not
  1002. implemented, then glob and recursive copy functionality will be lacking
  1003. in the filesystem (and this may impact commands like 'encoding names' 
  1004. which use glob functionality internally).
  1005. .PP
  1006. .CS
  1007. typedef int Tcl_FSMatchInDirectoryProc(
  1008. Tcl_Interp* fIinterpfR, 
  1009. Tcl_Obj *fIresultfR,
  1010. Tcl_Obj *fIpathPtrfR, 
  1011. CONST char *fIpatternfR, 
  1012. Tcl_GlobTypeData * fItypesfR);
  1013. .CE
  1014. .PP
  1015. The function should return all files or directories (or other filesystem
  1016. objects) which match the given pattern and accord with the fItypesfR
  1017. specification given.  There are two ways in which this function may be
  1018. called.  If fIpatternfR is NULL, then fIpathPtrfR is a full path
  1019. specification of a single file or directory which should be checked for
  1020. existence and correct type.  Otherwise, fIpathPtrfR is a directory, the
  1021. contents of which the function should search for files or directories
  1022. which have the correct type.  In either case, fIpathPtrfR can be
  1023. assumed to be both non-NULL and non-empty.  It is not currently
  1024. documented whether fIpathPtrfR will have a file separator at its end of
  1025. not, so code should be flexible to both possibilities.
  1026. .PP
  1027. The return value is a standard Tcl result indicating whether an error
  1028. occurred in the matching process.  Error messages are placed in
  1029. fIinterpfR; on a fBTCL_OKfR result, results should be added to the
  1030. fIresultfR object given (which can be assumed to be a valid
  1031. unshared Tcl list).  The matches added
  1032. to fIresultfR should include any path prefix given in fIpathPtrfR 
  1033. (this usually means they will be absolute path specifications). 
  1034. Note that if no matches are found, that simply leads to an empty 
  1035. result; errors are only signaled for actual file or filesystem
  1036. problems which may occur during the matching process.
  1037. .PP
  1038. The fBTcl_GlobTypeDatafR structure passed in the fItypesfR 
  1039. parameter contains the following fields:
  1040. .CS
  1041. typedef struct Tcl_GlobTypeData {
  1042.       /* Corresponds to bcdpfls as in 'find -t' */
  1043.       int fItypefR;
  1044.       /* Corresponds to file permissions */
  1045.       int fIpermfR;
  1046.       /* Acceptable mac type */
  1047.       Tcl_Obj *fImacTypefR;
  1048.       /* Acceptable mac creator */
  1049.       Tcl_Obj *fImacCreatorfR;
  1050. } Tcl_GlobTypeData;
  1051. .CE
  1052. .PP
  1053. There are two specific cases which it is important to handle correctly,
  1054. both when fItypesfR is non-NULL. The two cases are when fItypes->types
  1055. & TCL_GLOB_TYPE_DIRfR or fItypes->types & TCL_GLOB_TYPE_MOUNTfR are
  1056. true (and in particular when the other flags are false).  In the first of
  1057. these cases, the function must list the contained directories.  Tcl uses
  1058. this to implement recursive globbing, so it is critical that filesystems
  1059. implement directory matching correctly.  In the second of these cases,
  1060. with fBTCL_GLOB_TYPE_MOUNTfR, the filesystem must list the mount points
  1061. which lie within the given fIpathPtrfR (and in this case, fIpathPtrfR
  1062. need not lie within the same filesystem - different to all other cases in
  1063. which this function is called).  Support for this is critical if Tcl is
  1064. to have seamless transitions between from one filesystem to another.
  1065. .SH UTIMEPROC       
  1066. .PP
  1067. Function to process a fBTcl_FSUtime()fR call.  Required to allow setting
  1068. (not reading) of times with 'file mtime', 'file atime' and the
  1069. open-r/open-w/fcopy implementation of 'file copy'.
  1070. .PP
  1071. .CS
  1072. typedef int Tcl_FSUtimeProc(
  1073. Tcl_Obj *fIpathPtrfR, 
  1074. struct utimbuf *fItvalfR);
  1075. .CE
  1076. .PP
  1077. The access and modification times of the file specified by fIpathPtrfR
  1078. should be changed to the values given in the fItvalfR structure.
  1079. .PP
  1080. The return value is a standard Tcl result indicating whether an error
  1081. occurred in the process.
  1082. .SH LINKPROC 
  1083. .PP
  1084. Function to process a fBTcl_FSLink()fR call.  Should be implemented
  1085. only if the filesystem supports links, and may otherwise be NULL.
  1086. .PP
  1087. .CS
  1088. typedef Tcl_Obj* Tcl_FSLinkProc(
  1089. Tcl_Obj *fIlinkNamePtrfR,
  1090. Tcl_Obj *fItoPtrfR,
  1091. int fIlinkActionfR);
  1092. .CE
  1093. .PP
  1094. If fItoPtrfR is NULL, the function is being asked to read the
  1095. contents of a link.  The result is a Tcl_Obj specifying the contents of
  1096. the link given by fIlinkNamePtrfR, or NULL if the link could
  1097. not be read.  The result is owned by the caller, which should call
  1098. Tcl_DecrRefCount when the result is no longer needed.  If fItoPtrfR 
  1099. is not NULL, the function should attempt to create a link.  The result
  1100. in this case should be fItoPtrfR if the link was successful and NULL
  1101. otherwise.  In this case the result is not owned by the caller. See
  1102. the documentation for fBTcl_FSLinkfR for the correct interpretation
  1103. of the fIlinkActionfR flags.
  1104. .SH LISTVOLUMESPROC     
  1105. .PP
  1106. Function to list any filesystem volumes added by this filesystem.
  1107. Should be implemented only if the filesystem adds volumes at the head
  1108. of the filesystem, so that they can be returned by 'file volumes'.
  1109. .PP
  1110. .CS
  1111. typedef Tcl_Obj* Tcl_FSListVolumesProc(void);
  1112. .CE
  1113. .PP
  1114. The result should be a list of volumes added by this filesystem, or
  1115. NULL (or an empty list) if no volumes are provided.  The result object
  1116. is considered to be owned by the filesystem (not by Tcl's core), but
  1117. should be given a refCount for Tcl.  Tcl will use the contents of the
  1118. list and then decrement that refCount.  This allows filesystems to
  1119. choose whether they actually want to retain a 'master list' of volumes
  1120. or not (if not, they generate the list on the fly and pass it to Tcl
  1121. with a refCount of 1 and then forget about the list, if yes, then
  1122. they simply increment the refCount of their master list and pass it
  1123. to Tcl which will copy the contents and then decrement the count back
  1124. to where it was).
  1125. .PP
  1126. Therefore, Tcl considers return values from this proc to be read-only.
  1127. .PP
  1128. .SH FILEATTRSTRINGSPROC
  1129. .PP
  1130. Function to list all attribute strings which are valid for this
  1131. filesystem.  If not implemented the filesystem will not support
  1132. the fBfile attributesfR command.  This allows arbitrary additional
  1133. information to be attached to files in the filesystem.  If it is
  1134. not implemented, there is no need to implement the fBgetfR and fBsetfR
  1135. methods.
  1136. .PP
  1137. .CS
  1138. typedef CONST char** Tcl_FSFileAttrStringsProc(
  1139. Tcl_Obj *fIpathPtrfR, 
  1140. Tcl_Obj** fIobjPtrReffR);
  1141. .CE
  1142. .PP
  1143. The called function may either return an array of strings, or may
  1144. instead return NULL and place a Tcl list into the given objPtrRef.  Tcl
  1145. will take that list and first increment its refCount before using it.
  1146. On completion of that use, Tcl will decrement its refCount.  Hence if
  1147. the list should be disposed of by Tcl when done, it should have a
  1148. refCount of zero, and if the list should not be disposed of, the
  1149. filesystem should ensure it retains a refCount on the object.
  1150. .SH FILEATTRSGETPROC
  1151. .PP
  1152. Function to process a fBTcl_FSFileAttrsGet()fR call, used by 'file
  1153. attributes'.
  1154. .PP
  1155. .CS
  1156. typedef int Tcl_FSFileAttrsGetProc(
  1157. Tcl_Interp *fIinterpfR,
  1158. int fIindexfR, 
  1159. Tcl_Obj *fIpathPtrfR,
  1160. Tcl_Obj **fIobjPtrReffR);
  1161. .CE
  1162. .PP
  1163. Returns a standard Tcl return code.  The attribute value retrieved,
  1164. which corresponds to the fIindexfR'th element in the list returned by
  1165. the Tcl_FSFileAttrStringsProc, is a Tcl_Obj placed in objPtrRef (if
  1166. TCL_OK was returned) and is likely to have a refCount of zero.  Either
  1167. way we must either store it somewhere (e.g. the Tcl result), or
  1168. Incr/Decr its refCount to ensure it is properly freed.
  1169. .SH FILEATTRSSETPROC
  1170. .PP
  1171. Function to process a fBTcl_FSFileAttrsSet()fR call, used by 'file
  1172. attributes'.  If the filesystem is read-only, there is no need
  1173. to implement this.
  1174. .PP
  1175. .CS
  1176. typedef int Tcl_FSFileAttrsSetProc(
  1177. Tcl_Interp *fIinterpfR,
  1178. int fIindexfR, 
  1179. Tcl_Obj *fIpathPtrfR,
  1180. Tcl_Obj *fIobjPtrfR);
  1181. .CE
  1182. .PP
  1183. The attribute value of the fIindexfR'th element in the list returned by
  1184. the Tcl_FSFileAttrStringsProc should be set to the fIobjPtrfR given.
  1185. .SH CREATEDIRECTORYPROC     
  1186. .PP
  1187. Function to process a fBTcl_FSCreateDirectory()fR call.  Should be
  1188. implemented unless the FS is read-only.
  1189. .PP
  1190. .CS
  1191. typedef int Tcl_FSCreateDirectoryProc(
  1192. Tcl_Obj *fIpathPtrfR);
  1193. .CE
  1194. .PP
  1195. The return value is a standard Tcl result indicating whether an error
  1196. occurred in the process.  If successful, a new directory should have
  1197. been added to the filesystem in the location specified by
  1198. fIpathPtrfR.
  1199. .SH REMOVEDIRECTORYPROC     
  1200. .PP
  1201. Function to process a 'Tcl_FSRemoveDirectory()' call.  Should be
  1202. implemented unless the FS is read-only.
  1203. .PP
  1204. .CS
  1205. typedef int Tcl_FSRemoveDirectoryProc(
  1206. Tcl_Obj *fIpathPtrfR,
  1207. int fIrecursivefR, 
  1208. Tcl_Obj **fIerrorPtrfR);
  1209. .CE
  1210. .PP
  1211. The return value is a standard Tcl result indicating whether an error
  1212. occurred in the process.  If successful, the directory specified by
  1213. fIpathPtrfR should have been removed from the filesystem.  If the
  1214. fIrecursivefR flag is given, then a non-empty directory should
  1215. be deleted without error.  If an error does occur, the name of
  1216. the file or directory which caused the error should be placed in
  1217. fIerrorPtrfR.
  1218. .SH DELETEFILEPROC     
  1219. .PP
  1220. Function to process a fBTcl_FSDeleteFile()fR call.  Should be implemented
  1221. unless the FS is read-only.
  1222. .PP
  1223. .CS
  1224. typedef int Tcl_FSDeleteFileProc(
  1225. Tcl_Obj *fIpathPtrfR);
  1226. .CE
  1227. .PP
  1228. The return value is a standard Tcl result indicating whether an error
  1229. occurred in the process.  If successful, the file specified by
  1230. fIpathPtrfR should have been removed from the filesystem.  Note that,
  1231. if the filesystem supports symbolic links, Tcl will always call this
  1232. function and not Tcl_FSRemoveDirectoryProc when needed to delete them
  1233. (even if they are symbolic links to directories).
  1234. .SH "FILESYSTEM EFFICIENCY"
  1235. .PP
  1236. .SH LSTATPROC     
  1237. .PP
  1238. Function to process a fBTcl_FSLstat()fR call.  If not implemented, Tcl
  1239. will attempt to use the fIstatProcfR defined above instead.  Therefore
  1240. it need only be implemented if a filesystem can differentiate between
  1241. fBstatfR and fBlstatfR calls.
  1242. .PP
  1243. .CS
  1244. typedef int Tcl_FSLstatProc(
  1245. Tcl_Obj *fIpathPtrfR, 
  1246. Tcl_StatBuf *fIstatPtrfR);
  1247. .CE
  1248. .PP
  1249. The behavior of this function is very similar to that of the 
  1250. Tcl_FSStatProc defined above, except that if it is applied
  1251. to a symbolic link, it returns information about the link, not
  1252. about the target file.
  1253. .PP
  1254. .SH COPYFILEPROC 
  1255. .PP
  1256. Function to process a fBTcl_FSCopyFile()fR call.  If not implemented Tcl
  1257. will fall back on open-r, open-w and fcopy as a copying mechanism.
  1258. Therefore it need only be implemented if the filesystem can perform
  1259. that action more efficiently.
  1260. .PP
  1261. .CS
  1262. typedef int Tcl_FSCopyFileProc(
  1263. Tcl_Obj *fIsrcPathPtrfR,
  1264. Tcl_Obj *fIdestPathPtrfR);
  1265. .CE
  1266. .PP
  1267. The return value is a standard Tcl result indicating whether an error
  1268. occurred in the copying process.  Note that, fIdestPathPtrfR is the
  1269. name of the file which should become the copy of fIsrcPathPtrfR. It
  1270. is never the name of a directory into which fIsrcPathPtrfR could be
  1271. copied (i.e. the function is much simpler than the Tcl level 'file
  1272. copy' subcommand).  Note that,
  1273. if the filesystem supports symbolic links, Tcl will always call this
  1274. function and not Tcl_FSCopyDirectoryProc when needed to copy them
  1275. (even if they are symbolic links to directories).
  1276. .SH RENAMEFILEPROC     
  1277. .PP
  1278. Function to process a fBTcl_FSRenameFile()fR call.  If not implemented,
  1279. Tcl will fall back on a copy and delete mechanism.  Therefore it need
  1280. only be implemented if the filesystem can perform that action more
  1281. efficiently.
  1282. .PP
  1283. .CS
  1284. typedef int Tcl_FSRenameFileProc(
  1285. Tcl_Obj *fIsrcPathPtrfR,
  1286. Tcl_Obj *fIdestPathPtrfR);
  1287. .CE
  1288. .PP
  1289. The return value is a standard Tcl result indicating whether an error
  1290. occurred in the renaming process.
  1291. .SH COPYDIRECTORYPROC     
  1292. .PP
  1293. Function to process a fBTcl_FSCopyDirectory()fR call.  If not
  1294. implemented, Tcl will fall back on a recursive create-dir, file copy
  1295. mechanism.  Therefore it need only be implemented if the filesystem can
  1296. perform that action more efficiently.
  1297. .PP
  1298. .CS
  1299. typedef int Tcl_FSCopyDirectoryProc(
  1300. Tcl_Obj *fIsrcPathPtrfR,
  1301. Tcl_Obj *fIdestPathPtrfR, 
  1302. Tcl_Obj **fIerrorPtrfR);
  1303. .CE
  1304. .PP
  1305. The return value is a standard Tcl result indicating whether an error
  1306. occurred in the copying process.  If an error does occur, the name of
  1307. the file or directory which caused the error should be placed in
  1308. fIerrorPtrfR. Note that, fIdestPathPtrfR is the name of the
  1309. directory-name which should become the mirror-image of
  1310. fIsrcPathPtrfR. It is not the name of a directory into which
  1311. fIsrcPathPtrfR should be copied (i.e. the function is much simpler
  1312. than the Tcl level 'file copy' subcommand).
  1313. .SH LOADFILEPROC 
  1314. .PP
  1315. Function to process a fBTcl_FSLoadFile()fR call.  If not implemented, Tcl
  1316. will fall back on a copy to native-temp followed by a Tcl_FSLoadFile on
  1317. that temporary copy.  Therefore it need only be implemented if the
  1318. filesystem can load code directly, or it can be implemented simply to
  1319. return TCL_ERROR to disable load functionality in this filesystem
  1320. entirely.
  1321. .PP
  1322. .CS
  1323. typedef int Tcl_FSLoadFileProc(
  1324. Tcl_Interp * fIinterpfR, 
  1325. Tcl_Obj *fIpathPtrfR, 
  1326. Tcl_LoadHandle * fIhandlePtrfR,
  1327. Tcl_FSUnloadFileProc * fIunloadProcPtrfR);
  1328. .CE
  1329. .PP
  1330. Returns a standard Tcl completion code.  If an error occurs, an error
  1331. message is left in the interp's result.  The function dynamically loads
  1332. a binary code file into memory.  On a successful
  1333. load, the fIhandlePtrfR should be filled with a token for 
  1334. the dynamically loaded file, and the fIunloadProcPtrfR should be
  1335. filled in with the address of a procedure.  The procedure will be
  1336. called with the given Tcl_LoadHandle as its only parameter when Tcl 
  1337. needs to unload the file.
  1338. .SH UNLOADFILEPROC     
  1339. .PP
  1340. Function to unload a previously successfully loaded file.  If load was
  1341. implemented, then this should also be implemented, if there is any
  1342. cleanup action required.
  1343. .PP
  1344. .CS
  1345. typedef void Tcl_FSUnloadFileProc(
  1346. Tcl_LoadHandle fIloadHandlefR);
  1347. .CE
  1348. .SH GETCWDPROC     
  1349. .PP
  1350. Function to process a fBTcl_FSGetCwd()fR call.  Most filesystems need not
  1351. implement this.  It will usually only be called once, if 'getcwd' is
  1352. called before 'chdir'.  May be NULL.
  1353. .PP
  1354. .CS
  1355. typedef Tcl_Obj* Tcl_FSGetCwdProc(
  1356. Tcl_Interp *fIinterpfR);
  1357. .CE
  1358. .PP
  1359. If the filesystem supports a native notion of a current working
  1360. directory (which might perhaps change independent of Tcl), this
  1361. function should return that cwd as the result, or NULL if the current
  1362. directory could not be determined (e.g. the user does not have
  1363. appropriate permissions on the cwd directory).  If NULL is returned, an
  1364. error message is left in the interp's result.
  1365. .PP
  1366. .SH CHDIRPROC     
  1367. .PP
  1368. Function to process a fBTcl_FSChdir()fR call.  If filesystems do not
  1369. implement this, it will be emulated by a series of directory access
  1370. checks.  Otherwise, virtual filesystems which do implement it need only
  1371. respond with a positive return result if the dirName is a valid,
  1372. accessible directory in their filesystem.  They need not remember the
  1373. result, since that will be automatically remembered for use by GetCwd.
  1374. Real filesystems should carry out the correct action (i.e. call the
  1375. correct system 'chdir' api).
  1376. .PP
  1377. .CS
  1378. typedef int Tcl_FSChdirProc(
  1379. Tcl_Obj *fIpathPtrfR);
  1380. .CE
  1381. .PP
  1382. The fBTcl_FSChdirProcfR changes the applications current working
  1383. directory to the value specified in fIpathPtrfR. The function returns
  1384. -1 on error or 0 on success.
  1385. .SH KEYWORDS
  1386. stat access filesystem vfs