Tcl_FSJoinPath(3tcl)
Filesystem(3) Tcl Library Procedures Filesystem(3)
_________________________________________________________________
NAME
Tcl_FSRegister, Tcl_FSUnregister, Tcl_FSData,
Tcl_FSMountsChanged, Tcl_FSGetFileSystemForPath,
Tcl_FSGetPathType, Tcl_FSCopyFile, Tcl_FSCopyDirectory,
Tcl_FSCreateDirectory, Tcl_FSDeleteFile,
Tcl_FSRemoveDirectory, Tcl_FSRenameFile, Tcl_FSListVolumes,
Tcl_FSEvalFile, Tcl_FSEvalFileEx, Tcl_FSLoadFile,
Tcl_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
SYNOPSIS
#include <tcl.h>
int
Tcl_FSRegister(clientData, fsPtr)
int
Tcl_FSUnregister(fsPtr)
ClientData
Tcl_FSData(fsPtr)
void
Tcl_FSMountsChanged(fsPtr)
Tcl_Filesystem*
Tcl_FSGetFileSystemForPath(pathPtr)
Tcl_PathType
Tcl_FSGetPathType(pathPtr)
int
Tcl_FSCopyFile(srcPathPtr, destPathPtr)
int
Tcl_FSCopyDirectory(srcPathPtr, destPathPtr, errorPtr)
int
Tcl_FSCreateDirectory(pathPtr)
int
Tcl Last change: 8.4 1
Filesystem(3) Tcl Library Procedures Filesystem(3)
Tcl_FSDeleteFile(pathPtr)
int
Tcl_FSRemoveDirectory(pathPtr, int recursive, errorPtr)
int
Tcl_FSRenameFile(srcPathPtr, destPathPtr)
Tcl_Obj*
Tcl_FSListVolumes(void)
int |
Tcl_FSEvalFileEx(interp, pathPtr, encodingName) |
int
Tcl_FSEvalFile(interp, pathPtr)
int
Tcl_FSLoadFile(interp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr,
handlePtr, unloadProcPtr)
int
Tcl_FSMatchInDirectory(interp, resultPtr, pathPtr, pattern, types)
Tcl_Obj*
Tcl_FSLink(linkNamePtr, toPtr, linkAction)
int
Tcl_FSLstat(pathPtr, statPtr)
int
Tcl_FSUtime(pathPtr, tval)
int
Tcl_FSFileAttrsGet(interp, int index, pathPtr, objPtrRef)
int
Tcl_FSFileAttrsSet(interp, int index, pathPtr, Tcl_Obj *objPtr)
const char**
Tcl_FSFileAttrStrings(pathPtr, objPtrRef)
int
Tcl_FSStat(pathPtr, statPtr)
int
Tcl_FSAccess(pathPtr, mode)
Tcl_Channel
Tcl_FSOpenFileChannel(interp, pathPtr, modeString, permissions)
Tcl_Obj*
Tcl Last change: 8.4 2
Filesystem(3) Tcl Library Procedures Filesystem(3)
Tcl_FSGetCwd(interp)
int
Tcl_FSChdir(pathPtr)
Tcl_Obj*
Tcl_FSPathSeparator(pathPtr)
Tcl_Obj*
Tcl_FSJoinPath(listObj, elements)
Tcl_Obj*
Tcl_FSSplitPath(pathPtr, lenPtr)
int
Tcl_FSEqualPaths(firstPtr, secondPtr)
Tcl_Obj*
Tcl_FSGetNormalizedPath(interp, pathPtr)
Tcl_Obj*
Tcl_FSJoinToPath(basePtr, objc, objv)
int
Tcl_FSConvertToPathType(interp, pathPtr)
ClientData
Tcl_FSGetInternalRep(pathPtr, fsPtr)
Tcl_Obj *
Tcl_FSGetTranslatedPath(interp, pathPtr)
const char *
Tcl_FSGetTranslatedStringPath(interp, pathPtr)
Tcl_Obj*
Tcl_FSNewNativePath(fsPtr, clientData)
const char *
Tcl_FSGetNativePath(pathPtr)
Tcl_Obj*
Tcl_FSFileSystemInfo(pathPtr)
Tcl_StatBuf*
Tcl_AllocStatBuf()
ARGUMENTS
Tcl_Filesystem *fsPtr (in) Points to
a struc-
ture con-
taining
Tcl Last change: 8.4 3
Filesystem(3) Tcl Library Procedures Filesystem(3)
the
addresses
of pro-
cedures
that can
be called
to per-
form the
various
filesys-
tem
opera-
tions.
Tcl_Obj *pathPtr (in) The path
represented
by this
object is
used for
the
operation
in ques-
tion. If
the
object
does not
already
have an
internal
path
represen-
tation,
it will
be con-
verted to
have one.
Tcl_Obj *srcPathPtr (in) As for
pathPtr,
but used
for the
source
file for
a copy or
rename
opera-
tion.
Tcl_Obj *destPathPtr (in) As for
pathPtr,
but used
for the
Tcl Last change: 8.4 4
Filesystem(3) Tcl Library Procedures Filesystem(3)
destina-
tion
filename
for a
copy or
rename
opera-
tion.
const char *encodingName (in) The
encoding
of the
data
stored in
the file
identi-
fied by
pathPtr
and to be
evaluated.
const char *pattern (in) Only
files or
direc-
tories
matching
this pat-
tern will
be
returned.
Tcl_GlobTypeData *types (in) Only
files or
direc-
tories
matching
the type
descrip-
tions
contained
in this
structure
will be
returned.
This
parameter
may be
NULL.
Tcl_Interp *interp (in) Interpreter
to use
either
Tcl Last change: 8.4 5
Filesystem(3) Tcl Library Procedures Filesystem(3)
for
results,
evalua-
tion, or
reporting
error
messages.
ClientData clientData (in) The
native
descrip-
tion of
the path
object to
create.
Tcl_Obj *firstPtr (in) The first
of two
path
objects
to com-
pare.
The
object
may be
converted
to path
type.
Tcl_Obj *secondPtr (in) The
second of
two path
objects
to com-
pare.
The
object
may be
converted
to path
type.
Tcl_Obj *listObj (in) The list
of path
elements
to
operate
on with a
join
opera-
tion.
Tcl Last change: 8.4 6
Filesystem(3) Tcl Library Procedures Filesystem(3)
int elements (in) If non-
negative,
the
number of
elements
in the
listObj
which
should be
joined
together.
If nega-
tive,
then all
elements
are
joined.
Tcl_Obj **errorPtr (out) In the
case of
an error,
filled
with an
object
contain-
ing the
name of
the file
which
caused an
error in
the vari-
ous
copy/rename
opera-
tions.
Tcl_Obj **objPtrRef (out) Filled
with an
object
contain-
ing the
result of
the
opera-
tion.
Tcl_Obj *resultPtr (out) Pre-
allocated
object in
which to
store
Tcl Last change: 8.4 7
Filesystem(3) Tcl Library Procedures Filesystem(3)
(using
Tcl_ListObjAppendElement)
the list
of files
or direc-
tories
which are
success-
fully
matched.
int mode (in) Mask con-
sisting
of one or
more of
R_OK,
W_OK,
X_OK and
F_OK.
R_OK,
W_OK and
X_OK
request
checking
whether
the file
exists
and has
read,
write and
execute
permis-
sions,
respec-
tively.
F_OK just
requests
checking
for the
existence
of the
file.
Tcl_StatBuf *statPtr (out) The
structure
that con-
tains the
result of
a stat or
lstat
opera-
tion.
Tcl Last change: 8.4 8
Filesystem(3) Tcl Library Procedures Filesystem(3)
const char *sym1 (in) Name of a
procedure
to look
up in the
file's
symbol
table
const char *sym2 (in) Name of a
procedure
to look
up in the
file's
symbol
table
Tcl_PackageInitProc **proc1Ptr (out) Filled
with the
init
function
for this
code.
Tcl_PackageInitProc **proc2Ptr (out) Filled
with the
safe-init
function
for this
code.
ClientData *clientDataPtr (out) Filled
with the
client-
Data
value to
pass to
this
code's
unload
function
when it
is
called.
Tcl_LoadHandle *handlePtr (out) Filled
with an
abstract
token
represent-
ing the
loaded
file.
Tcl Last change: 8.4 9
Filesystem(3) Tcl Library Procedures Filesystem(3)
Tcl_FSUnloadFileProc **unloadProcPtr (out) Filled
with the
function
to use to
unload
this
piece of
code.
utimbuf *tval (in) The
access
and
modifica-
tion
times in
this
structure
are read
and used
to set
those
values
for a
given
file.
const char *modeString (in) Specifies
how the
file is
to be
accessed.
May have
any of
the
values
allowed
for the
mode
argument
to the
Tcl open
command.
int permissions (in) POSIX-
style
permis-
sion
flags
such as
0644. If
a new
file is
Tcl Last change: 8.4 10
Filesystem(3) Tcl Library Procedures Filesystem(3)
created,
these
permis-
sions
will be
set on
the
created
file.
int *lenPtr (out) If non-
NULL,
filled
with the
number of
elements
in the
split
path.
Tcl_Obj *basePtr (in) The base
path on
to which
to join
the given
elements.
May be
NULL.
int objc (in) The
number of
elements
in objv.
Tcl_Obj *const objv[] (in) The ele-
ments to
join to
the given
base
path.
Tcl_Obj *linkNamePtr (in) The name
of the
link to
be
created
or read.
Tcl_Obj *toPtr (in) What the
link
called
linkNamePtr
Tcl Last change: 8.4 11
Filesystem(3) Tcl Library Procedures Filesystem(3)
should be
linked
to, or
NULL if
the sym-
bolic
link
specified
by link-
NamePtr
is to be
read.
int linkAction (in) OR-ed
combina-
tion of
flags
indicat-
ing what
kind of
link
should be
created
(will be
ignored
if toPtr
is NULL).
Valid
bits to
set are
TCL_CREATE_SYMBOLIC_LINK
and
TCL_CREATE_HARD_LINK.
When both
flags are
set and
the
underly-
ing
filesys-
tem can
do
either,
symbolic
links are
pre-
ferred.
_________________________________________________________________
DESCRIPTION
Tcl Last change: 8.4 12
Filesystem(3) Tcl Library Procedures Filesystem(3)
There are several reasons for calling the Tcl_FS API func-
tions (e.g. Tcl_FSAccess and Tcl_FSStat) rather than calling
system level functions like access and stat directly.
First, they will work cross-platform, so an extension which
calls them should work unmodified on Unix and Windows.
Second, the Windows implementation of some of these func-
tions fixes some bugs in the system level calls. Third,
these function calls deal with any "Utf to platform-native"
path conversions which may be required (and may cache the
results of such conversions for greater efficiency on subse-
quent calls). Fourth, and perhaps most importantly, all of
these functions are "virtual filesystem aware". Any virtual
filesystem (VFS for short) which has been registered
(through Tcl_FSRegister) may reroute file access to alterna-
tive media or access methods. This means that all of these
functions (and therefore the corresponding file, glob, pwd,
cd, open, etc. Tcl commands) may be operate on "files"
which are not native files in the native filesystem. This
also means that any Tcl extension which accesses the
filesystem (FS for short) through this API is automatically
"virtual filesystem aware". Of course, if an extension
accesses the native filesystem directly (through platform-
specific APIs, for example), then Tcl cannot intercept such
calls.
If appropriate VFSes have been registered, the "files" may,
to give two examples, be remote (e.g. situated on a remote
ftp server) or archived (e.g. lying inside a .zip archive).
Such registered filesystems provide a lookup table of func-
tions to implement all or some of the functionality listed
here. Finally, the Tcl_FSStat and Tcl_FSLstat calls
abstract away from what the "struct stat" buffer is actually
declared to be, allowing the same code to be used both on
systems with and systems without support for files larger
than 2GB in size.
The Tcl_FS API is objectified and may cache internal
representations and other path-related strings (e.g. the
current working directory). One side-effect of this is that
one must not pass in objects with a reference count of zero
to any of these functions. If such calls were handled, they
might result in memory leaks (under some circumstances, the
filesystem code may wish to retain a reference to the passed
in object, and so one must not assume that after any of
these calls return, the object still has a reference count
of zero - it may have been incremented) or in a direct seg-
mentation fault (or other memory access error) due to the
object being freed part way through the complex object mani-
pulation required to ensure that the path is fully normal-
ized and absolute for filesystem determination. The practi-
cal lesson to learn from this is that
Tcl_Obj *path = Tcl_NewStringObj(...);
Tcl Last change: 8.4 13
Filesystem(3) Tcl Library Procedures Filesystem(3)
Tcl_FSWhatever(path);
Tcl_DecrRefCount(path);
is wrong, and may cause memory errors. The path must have
its reference count incremented before passing it in, or
decrementing it. For this reason, objects with a reference
count of zero are considered not to be valid filesystem
paths and calling any Tcl_FS API function with such an
object will result in no action being taken.
FS API FUNCTIONS
Tcl_FSCopyFile attempts to copy the file given by srcPathPtr
to the path name given by destPathPtr. If the two paths
given lie in the same filesystem (according to
Tcl_FSGetFileSystemForPath) then that filesystem's "copy
file" function is called (if it is non-NULL). Otherwise the
function returns -1 and sets the errno global C variable to
the "EXDEV" POSIX error code (which signifies a "cross-
domain link").
Tcl_FSCopyDirectory attempts to copy the directory given by
srcPathPtr to the path name given by destPathPtr. If the
two paths given lie in the same filesystem (according to
Tcl_FSGetFileSystemForPath) then that filesystem's "copy
file" function is called (if it is non-NULL). Otherwise the
function returns -1 and sets the errno global C variable to
the "EXDEV" POSIX error code (which signifies a "cross-
domain link").
Tcl_FSCreateDirectory attempts to create the directory given
by pathPtr by calling the owning filesystem's "create direc-
tory" function.
Tcl_FSDeleteFile attempts to delete the file given by
pathPtr by calling the owning filesystem's "delete file"
function.
Tcl_FSRemoveDirectory attempts to remove the directory given
by pathPtr by calling the owning filesystem's "remove direc-
tory" function.
Tcl_FSRenameFile attempts to rename the file or directory
given by srcPathPtr to the path name given by destPathPtr.
If the two paths given lie in the same filesystem (according
to Tcl_FSGetFileSystemForPath) then that filesystem's
"rename file" function is called (if it is non-NULL). Oth-
erwise the function returns -1 and sets the errno global C
variable to the "EXDEV" POSIX error code (which signifies a
"cross-domain link").
Tcl_FSListVolumes calls each filesystem which has a non-NULL
"list volumes" function and asks them to return their list
of root volumes. It accumulates the return values in a list
Tcl Last change: 8.4 14
Filesystem(3) Tcl Library Procedures Filesystem(3)
which is returned to the caller (with a reference count of
0).
Tcl_FSEvalFileEx reads the file given by pathPtr using the |
encoding identified by encodingName and evaluates its con- |
tents as a Tcl script. It returns the same information as |
Tcl_EvalObjEx. If encodingName is NULL, the system encoding |
is used for reading the file contents. If the file could |
not be read then a Tcl error is returned to describe why the |
file could not be read. The eofchar for files is "\32" (^Z) |
for all platforms. If you require a "^Z" in code for string |
comparison, you can use "\032" or "\u001a", which will be |
safely substituted by the Tcl interpreter into "^Z". |
Tcl_FSEvalFile is a simpler version of Tcl_FSEvalFileEx that |
always uses the system encoding when reading the file.
Tcl_FSLoadFile dynamically loads a binary code file into
memory and returns the addresses of two procedures within
that file, if they are defined. The appropriate function
for the filesystem to which pathPtr belongs will be called.
If that filesystem does not implement this function (most
virtual filesystems will not, because of OS limitations in
dynamically loading binary code), Tcl will attempt to copy
the file to a temporary directory and load that temporary
file.
Returns a standard Tcl completion code. If an error occurs,
an error message is left in the interp's result.
Tcl_FSMatchInDirectory is used by the globbing code to
search a directory for all files which match a given pat-
tern. The appropriate function for the filesystem to which
pathPtr belongs will be called.
The return value is a standard Tcl result indicating whether
an error occurred in globbing. Error messages are placed in
interp (unless interp is NULL, which is allowed), but good
results are placed in the resultPtr given.
Note that the glob code implements recursive patterns inter-
nally, so this function will only ever be passed simple pat-
terns, which can be matched using the logic of string match.
To handle recursion, Tcl will call this function frequently
asking only for directories to be returned. A special case
of being called with a NULL pattern indicates that the path
needs to be checked only for the correct type.
Tcl_FSLink replaces the library version of readlink, and
extends it to support the creation of links. The appropri-
ate function for the filesystem to which linkNamePtr belongs
will be called.
Tcl Last change: 8.4 15
Filesystem(3) Tcl Library Procedures Filesystem(3)
If the toPtr is NULL, a "read link" action is performed.
The result is a Tcl_Obj specifying the contents of the sym-
bolic link given by linkNamePtr, or NULL if the link could
not be read. The result is owned by the caller, which
should call Tcl_DecrRefCount when the result is no longer
needed. If the toPtr is not NULL, Tcl should create a link
of one of the types passed in in the linkAction flag. This
flag is an ORed combination of TCL_CREATE_SYMBOLIC_LINK and
TCL_CREATE_HARD_LINK. Where a choice exists (i.e. more than
one flag is passed in), the Tcl convention is to prefer sym-
bolic links. When a link is successfully created, the
return value should be toPtr (which is therefore already
owned by the caller). If unsuccessful, NULL is returned.
Tcl_FSLstat fills the stat structure statPtr with informa-
tion about the specified file. You do not need any access
rights to the file to get this information but you need
search rights to all directories named in the path leading
to the file. The stat structure includes info regarding
device, inode (always 0 on Windows), privilege mode, nlink
(always 1 on Windows), user id (always 0 on Windows), group
id (always 0 on Windows), rdev (same as device on Windows),
size, last access time, last modification time, and last
metadata change time.
If path exists, Tcl_FSLstat returns 0 and the stat structure
is filled with data. Otherwise, -1 is returned, and no stat
info is given.
Tcl_FSUtime replaces the library version of utime.
This returns 0 on success and -1 on error (as per the utime
documentation). If successful, the function will update the
"atime" and "mtime" values of the file given.
Tcl_FSFileAttrsGet implements read access for the hookable
file attributes subcommand. The appropriate function for
the filesystem to which pathPtr belongs will be called.
If the result is TCL_OK, then an object was placed in
objPtrRef, which will only be temporarily valid (unless
Tcl_IncrRefCount is called).
Tcl_FSFileAttrsSet implements write access for the hookable
file attributes subcommand. The appropriate function for
the filesystem to which pathPtr belongs will be called.
Tcl_FSFileAttrStrings implements part of the hookable file
attributes subcommand. The appropriate function for the
filesystem to which pathPtr belongs will be called.
Tcl Last change: 8.4 16
Filesystem(3) Tcl Library Procedures Filesystem(3)
The called procedure may either return an array of strings,
or may instead return NULL and place a Tcl list into the
given objPtrRef. Tcl will take that list and first incre-
ment its reference count before using it. On completion of
that use, Tcl will decrement its reference count. Hence if
the list should be disposed of by Tcl when done, it should
have a reference count of zero, and if the list should not
be disposed of, the filesystem should ensure it retains a
reference count to the object.
Tcl_FSAccess checks whether the process would be allowed to
read, write or test for existence of the file (or other
filesystem object) whose name is pathname. If pathname is
a symbolic link on Unix, then permissions of the file
referred by this symbolic link are tested.
On success (all requested permissions granted), zero is
returned. On error (at least one bit in mode asked for a
permission that is denied, or some other error occurred), -1
is returned.
Tcl_FSStat fills the stat structure statPtr with information
about the specified file. You do not need any access rights
to the file to get this information but you need search
rights to all directories named in the path leading to the
file. The stat structure includes info regarding device,
inode (always 0 on Windows), privilege mode, nlink (always 1
on Windows), user id (always 0 on Windows), group id (always
0 on Windows), rdev (same as device on Windows), size, last
access time, last modification time, and last metadata
change time.
If path exists, Tcl_FSStat returns 0 and the stat structure
is filled with data. Otherwise, -1 is returned, and no stat
info is given.
Tcl_FSOpenFileChannel opens a file specified by pathPtr and
returns a channel handle that can be used to perform input
and output on the file. This API is modeled after the fopen
procedure of the Unix standard I/O library. The syntax and
meaning of all arguments is similar to those given in the
Tcl open command when opening a file. If an error occurs
while opening the channel, Tcl_FSOpenFileChannel returns
NULL and records a POSIX error code that can be retrieved
with Tcl_GetErrno. In addition, if interp is non-NULL,
Tcl_FSOpenFileChannel leaves an error message in interp's
result after any error.
The newly created channel is not registered in the supplied
interpreter; to register it, use Tcl_RegisterChannel. If
one of the standard channels, stdin, stdout or stderr was
previously closed, the act of creating the new channel also
Tcl Last change: 8.4 17
Filesystem(3) Tcl Library Procedures Filesystem(3)
assigns it as a replacement for the standard channel.
Tcl_FSGetCwd replaces the library version of getcwd.
It returns the Tcl library's current working directory.
This may be different to the native platform's working
directory, which happens when the current working directory
is not in the native filesystem.
The result is a pointer to a Tcl_Obj specifying the current
directory, or NULL if the current directory could not be
determined. If NULL is returned, an error message is left
in the interp's result.
The result already has its reference count incremented for
the caller. When it is no longer needed, that reference
count should be decremented. This is needed for thread-
safety purposes, to allow multiple threads to access this
and related functions, while ensuring the results are always
valid.
Tcl_FSChdir replaces the library version of chdir. The path
is normalized and then passed to the filesystem which claims
it. If that filesystem does not implement this function,
Tcl will fallback to a combination of stat and access to
check whether the directory exists and has appropriate per-
missions.
For results, see chdir documentation. If successful, we
keep a record of the successful path in cwdPathPtr for sub-
sequent calls to Tcl_FSGetCwd.
Tcl_FSPathSeparator returns the separator character to be
used for most specific element of the path specified by
pathPtr (i.e. the last part of the path).
The separator is returned as a Tcl_Obj containing a string
of length 1. If the path is invalid, NULL is returned.
Tcl_FSJoinPath takes the given Tcl_Obj, which must be a
valid list (which is allowed to have a reference count of
zero), and returns the path object given by considering the
first elements elements as valid path segments (each path
segment may be a complete path, a partial path or just a
single possible directory or file name). If any path seg-
ment is actually an absolute path, then all prior path seg-
ments are discarded. If elements is less than 0, we use the
entire list.
It is possible that the returned object is actually an ele-
ment of the given list, so the caller should be careful to
increment the reference count of the result before freeing
Tcl Last change: 8.4 18
Filesystem(3) Tcl Library Procedures Filesystem(3)
the list.
The returned object, typically with a reference count of
zero (but it could be shared under some conditions), con-
tains the joined path. The caller must add a reference
count to the object before using it. In particular, the
returned object could be an element of the given list, so
freeing the list might free the object prematurely if no
reference count has been taken. If the number of elements
is zero, then the returned object will be an empty-string
Tcl_Obj.
Tcl_FSSplitPath takes the given Tcl_Obj, which should be a
valid path, and returns a Tcl list object containing each
segment of that path as an element. It returns a list
object with a reference count of zero. If the passed in
lenPtr is non-NULL, the variable it points to will be
updated to contain the number of elements in the returned
list.
Tcl_FSEqualPaths tests whether the two paths given represent
the same filesystem object
It returns 1 if the paths are equal, and 0 if they are dif-
ferent. If either path is NULL, 0 is always returned.
Tcl_FSGetNormalizedPath this important function attempts to
extract from the given Tcl_Obj a unique normalized path
representation, whose string value can be used as a unique
identifier for the file.
It returns the normalized path object, owned by Tcl, or NULL
if the path was invalid or could otherwise not be success-
fully converted. Extraction of absolute, normalized paths
is very efficient (because the filesystem operates on these
representations internally), although the result when the
filesystem contains numerous symbolic links may not be the
most user-friendly version of a path. The return value is
owned by Tcl and has a lifetime equivalent to that of the
pathPtr passed in (unless that is a relative path, in which
case the normalized path object may be freed any time the
cwd changes) - the caller can of course increment the
refCount if it wishes to maintain a copy for longer.
Tcl_FSJoinToPath takes the given object, which should usu-
ally be a valid path or NULL, and joins onto it the array of
paths segments given.
Returns object, typically with refCount of zero (but it
could be shared under some conditions), containing the
joined path. The caller must add a refCount to the object
before using it. If any of the objects passed into this
Tcl Last change: 8.4 19
Filesystem(3) Tcl Library Procedures Filesystem(3)
function (pathPtr or path elements) have a refCount of zero,
they will be freed when this function returns.
Tcl_FSConvertToPathType tries to convert the given Tcl_Obj
to a valid Tcl path type, taking account of the fact that
the cwd may have changed even if this object is already sup-
posedly of the correct type. The filename may begin with
"~" (to indicate current user's home directory) or "~<user>"
(to indicate any user's home directory).
If the conversion succeeds (i.e. the object is a valid path
in one of the current filesystems), then TCL_OK is returned.
Otherwise TCL_ERROR is returned, and an error message may be
left in the interpreter.
Tcl_FSGetInternalRep extracts the internal representation of
a given path object, in the given filesystem. If the path
object belongs to a different filesystem, we return NULL. If
the internal representation is currently NULL, we attempt to
generate it, by calling the filesystem's
Tcl_FSCreateInternalRepProc.
Returns NULL or a valid internal path representation. This
internal representation is cached, so that repeated calls to
this function will not require additional conversions.
Tcl_FSGetTranslatedPath attempts to extract the translated
path from the given Tcl_Obj.
If the translation succeeds (i.e. the object is a valid
path), then it is returned. Otherwise NULL will be
returned, and an error message may be left in the inter-
preter. A "translated" path is one which contains no "~" or
"~user" sequences (these have been expanded to their current
representation in the filesystem). The object returned is
owned by the caller, which must store it or call
Tcl_DecrRefCount to ensure memory is freed. This function
is of little practical use, and Tcl_FSGetNormalizedPath or
Tcl_GetNativePath are usually better functions to use for
most purposes.
Tcl_FSGetTranslatedStringPath does the same as
Tcl_FSGetTranslatedPath, but returns a character string or
NULL. The string returned is dynamically allocated and
owned by the caller, which must store it or call ckfree to
ensure it is freed. Again, Tcl_FSGetNormalizedPath or
Tcl_GetNativePath are usually better functions to use for
most purposes.
Tcl_FSNewNativePath performs something like the reverse of
the usual obj->path->nativerep conversions. If some code
retrieves a path in native form (from, e.g. readlink or a
Tcl Last change: 8.4 20
Filesystem(3) Tcl Library Procedures Filesystem(3)
native dialog), and that path is to be used at the Tcl
level, then calling this function is an efficient way of
creating the appropriate path object type.
The resulting object is a pure "path" object, which will
only receive a UTF-8 string representation if that is
required by some Tcl code.
Tcl_FSGetNativePath is for use by the Win/Unix native
filesystems, so that they can easily retrieve the native
(char* or TCHAR*) representation of a path. This function
is a convenience wrapper around Tcl_FSGetInternalRep, and
assumes the native representation is string-based. It may
be desirable in the future to have non-string-based native
representations (for example, on MacOSX, a representation
using a fileSpec of FSRef structure would probably be more
efficient). On Windows a full Unicode representation would
allow for paths of unlimited length. Currently the
representation is simply a character string which may con-
tain either the relative path or a complete, absolute nor-
malized path in the native encoding (complex conditions dic-
tate which of these will be provided, so neither can be
relied upon, unless the path is known to be absolute). If
you need a native path which must be absolute, then you
should ask for the native version of a normalized path. If
for some reason a non-absolute, non-normalized version of
the path is needed, that must be constructed separately
(e.g. using Tcl_FSGetTranslatedPath).
The native representation is cached so that repeated calls
to this function will not require additional conversions.
The return value is owned by Tcl and has a lifetime
equivalent to that of the pathPtr passed in (unless that is
a relative path, in which case the native representation may
be freed any time the cwd changes).
Tcl_FSFileSystemInfo returns a list of two elements. The
first element is the name of the filesystem (e.g. "native",
"vfs", "zip", or "prowrap", perhaps), and the second is the
particular type of the given path within that filesystem
(which is filesystem dependent). The second element may be
empty if the filesystem does not provide a further categori-
zation of files.
A valid list object is returned, unless the path object is
not recognized, when NULL will be returned.
Tcl_FSGetFileSystemForPath returns the a pointer to the
Tcl_Filesystem which accepts this path as valid.
If no filesystem will accept the path, NULL is returned.
Tcl Last change: 8.4 21
Filesystem(3) Tcl Library Procedures Filesystem(3)
Tcl_FSGetPathType determines whether the given path is rela-
tive to the current directory, relative to the current
volume, or absolute.
It returns one of TCL_PATH_ABSOLUTE, TCL_PATH_RELATIVE, or
TCL_PATH_VOLUME_RELATIVE
Tcl_AllocStatBuf allocates a Tcl_StatBuf on the system heap
(which may be deallocated by being passed to ckfree.) This
allows extensions to invoke Tcl_FSStat and Tcl_FSLStat
without being dependent on the size of the buffer. That in
turn depends on the flags used to build Tcl.
THE VIRTUAL FILESYSTEM API
A filesystem provides a Tcl_Filesystem structure that con-
tains pointers to functions that implement the various
operations on a filesystem; these operations are invoked as
needed by the generic layer, which generally occurs through
the functions listed above.
The Tcl_Filesystem structures are manipulated using the fol-
lowing methods.
Tcl_FSRegister takes a pointer to a filesystem structure and
an optional piece of data to associated with that filesys-
tem. On calling this function, Tcl will attach the filesys-
tem to the list of known filesystems, and it will become
fully functional immediately. Tcl does not check if the
same filesystem is registered multiple times (and in general
that is not a good thing to do). TCL_OK will be returned.
Tcl_FSUnregister removes the given filesystem structure from
the list of known filesystems, if it is known, and returns
TCL_OK. If the filesystem is not currently registered,
TCL_ERROR is returned.
Tcl_FSData will return the ClientData associated with the
given filesystem, if that filesystem is registered. Other-
wise it will return NULL.
Tcl_FSMountsChanged is used to inform the Tcl's core that
the set of mount points for the given (already registered)
filesystem have changed, and that cached file representa-
tions may therefore no longer be correct.
THE TCL_FILESYSTEM STRUCTURE
The Tcl_Filesystem structure contains the following fields:
typedef struct Tcl_Filesystem {
const char *typeName;
int structureLength;
Tcl_FSVersion version;
Tcl_FSPathInFilesystemProc *pathInFilesystemProc;
Tcl Last change: 8.4 22
Filesystem(3) Tcl Library Procedures Filesystem(3)
Tcl_FSDupInternalRepProc *dupInternalRepProc;
Tcl_FSFreeInternalRepProc *freeInternalRepProc;
Tcl_FSInternalToNormalizedProc *internalToNormalizedProc;
Tcl_FSCreateInternalRepProc *createInternalRepProc;
Tcl_FSNormalizePathProc *normalizePathProc;
Tcl_FSFilesystemPathTypeProc *filesystemPathTypeProc;
Tcl_FSFilesystemSeparatorProc *filesystemSeparatorProc;
Tcl_FSStatProc *statProc;
Tcl_FSAccessProc *accessProc;
Tcl_FSOpenFileChannelProc *openFileChannelProc;
Tcl_FSMatchInDirectoryProc *matchInDirectoryProc;
Tcl_FSUtimeProc *utimeProc;
Tcl_FSLinkProc *linkProc;
Tcl_FSListVolumesProc *listVolumesProc;
Tcl_FSFileAttrStringsProc *fileAttrStringsProc;
Tcl_FSFileAttrsGetProc *fileAttrsGetProc;
Tcl_FSFileAttrsSetProc *fileAttrsSetProc;
Tcl_FSCreateDirectoryProc *createDirectoryProc;
Tcl_FSRemoveDirectoryProc *removeDirectoryProc;
Tcl_FSDeleteFileProc *deleteFileProc;
Tcl_FSCopyFileProc *copyFileProc;
Tcl_FSRenameFileProc *renameFileProc;
Tcl_FSCopyDirectoryProc *copyDirectoryProc;
Tcl_FSLstatProc *lstatProc;
Tcl_FSLoadFileProc *loadFileProc;
Tcl_FSGetCwdProc *getCwdProc;
Tcl_FSChdirProc *chdirProc;
} Tcl_Filesystem;
Except for the first three fields in this structure which
contain simple data elements, all entries contain addresses
of functions called by the generic filesystem layer to per-
form the complete range of filesystem related actions.
The many functions in this structure are broken down into
three categories: infrastructure functions (almost all of
which must be implemented), operational functions (which
must be implemented if a complete filesystem is provided),
and efficiency functions (which need only be implemented if
they can be done so efficiently, or if they have side-
effects which are required by the filesystem; Tcl has less
efficient emulations it can fall back on). It is important
to note that, in the current version of Tcl, most of these
fallbacks are only used to handle commands initiated in Tcl,
not in C. What this means is, that if a file rename command
is issued in Tcl, and the relevant filesystem(s) do not
implement their Tcl_FSRenameFileProc, Tcl's core will
instead fallback on a combination of other filesystem func-
tions (it will use Tcl_FSCopyFileProc followed by
Tcl_FSDeleteFileProc, and if Tcl_FSCopyFileProc is not
implemented there is a further fallback). However, if a
Tcl_FSRenameFileProc command is issued at the C level, no
Tcl Last change: 8.4 23
Filesystem(3) Tcl Library Procedures Filesystem(3)
such fallbacks occur. This is true except for the last four
entries in the filesystem table (lstat, load, getcwd and
chdir) for which fallbacks do in fact occur at the C level.
Any functions which take path names in Tcl_Obj form take
those names in UTF-8 form. The filesystem infrastructure
API is designed to support efficient, cached conversion of
these UTF-8 paths to other native representations.
EXAMPLE FILESYSTEM DEFINITION
Here is the filesystem lookup table used by the "vfs" exten-
sion which allows filesystem actions to be implemented in
Tcl.
static Tcl_Filesystem vfsFilesystem = {
"tclvfs",
sizeof(Tcl_Filesystem),
TCL_FILESYSTEM_VERSION_1,
&VfsPathInFilesystem,
&VfsDupInternalRep,
&VfsFreeInternalRep,
/* No internal to normalized, since we don't create
* any pure 'internal' Tcl_Obj path representations */
NULL,
/* No create native rep function, since we don't use
* it and don't choose to support uses of
* Tcl_FSNewNativePath */
NULL,
/* Normalize path isn't needed - we assume paths only
* have one representation */
NULL,
&VfsFilesystemPathType,
&VfsFilesystemSeparator,
&VfsStat,
&VfsAccess,
&VfsOpenFileChannel,
&VfsMatchInDirectory,
&VfsUtime,
/* We choose not to support symbolic links inside our
* VFS's */
NULL,
&VfsListVolumes,
&VfsFileAttrStrings,
&VfsFileAttrsGet,
&VfsFileAttrsSet,
&VfsCreateDirectory,
&VfsRemoveDirectory,
&VfsDeleteFile,
/* No copy file; use the core fallback mechanism */
NULL,
/* No rename file; use the core fallback mechanism */
NULL,
/* No copy directory; use the core fallback mechanism */
Tcl Last change: 8.4 24
Filesystem(3) Tcl Library Procedures Filesystem(3)
NULL,
/* Core will use stat for lstat */
NULL,
/* No load; use the core fallback mechanism */
NULL,
/* We don't need a getcwd or chdir; the core's own
* internal value is suitable */
NULL,
NULL
};
FILESYSTEM INFRASTRUCTURE
These fields contain basic information about the filesystem
structure and addresses of functions which are used to asso-
ciate a particular filesystem with a file path, and deal
with the internal handling of path representations, for
example copying and freeing such representations.
TYPENAME
The typeName field contains a null-terminated string that
identifies the type of the filesystem implemented, e.g.
"native", "zip" or "vfs".
STRUCTURE LENGTH
The structureLength field is generally implemented as
sizeof(Tcl_Filesystem), and is there to allow easier binary
backwards compatibility if the size of the structure changes
in a future Tcl release.
VERSION
The version field should be set to TCL_FILESYSTEM_VERSION_1.
PATHINFILESYSTEMPROC
The pathInFilesystemProc field contains the address of a
function which is called to determine whether a given path
object belongs to this filesystem or not. Tcl will only
call the rest of the filesystem functions with a path for
which this function has returned TCL_OK. If the path does
not belong, -1 should be returned (the behaviour of Tcl for
any other return value is not defined). If TCL_OK is
returned, then the optional clientDataPtr output parameter
can be used to return an internal (filesystem specific)
representation of the path, which will be cached inside the
path object, and may be retrieved efficiently by the other
filesystem functions. Tcl will simultaneously cache the
fact that this path belongs to this filesystem. Such caches
are invalidated when filesystem structures are added or
removed from Tcl's internal list of known filesystems.
typedef int Tcl_FSPathInFilesystemProc(
Tcl_Obj *pathPtr,
ClientData *clientDataPtr);
Tcl Last change: 8.4 25
Filesystem(3) Tcl Library Procedures Filesystem(3)
DUPINTERNALREPPROC
This function makes a copy of a path's internal representa-
tion, and is called when Tcl needs to duplicate a path
object. If NULL, Tcl will simply not copy the internal
representation, which may then need to be regenerated later.
typedef ClientData Tcl_FSDupInternalRepProc(
ClientData clientData);
FREEINTERNALREPPROC
Free the internal representation. This must be implemented
if internal representations need freeing (i.e. if some
memory is allocated when an internal representation is gen-
erated), but may otherwise be NULL.
typedef void Tcl_FSFreeInternalRepProc(
ClientData clientData);
INTERNALTONORMALIZEDPROC
Function to convert internal representation to a normalized
path. Only required if the filesystem creates pure path
objects with no string/path representation. The return
value is a Tcl object whose string representation is the
normalized path.
typedef Tcl_Obj* Tcl_FSInternalToNormalizedProc(
ClientData clientData);
CREATEINTERNALREPPROC
Function to take a path object, and calculate an internal
representation for it, and store that native representation
in the object. May be NULL if paths have no internal
representation, or if the Tcl_FSPathInFilesystemProc for
this filesystem always immediately creates an internal
representation for paths it accepts.
typedef ClientData Tcl_FSCreateInternalRepProc(
Tcl_Obj *pathPtr);
NORMALIZEPATHPROC
Function to normalize a path. Should be implemented for all
filesystems which can have multiple string representations
for the same path object. In Tcl, every "path" must have a
single unique "normalized" string representation. Depending
on the filesystem, there may be more than one unnormalized
string representation which refers to that path (e.g. a
relative path, a path with different character case if the
filesystem is case insensitive, a path contain a reference
to a home directory such as "~", a path containing symbolic
links, etc). If the very last component in the path is a
symbolic link, it should not be converted into the object it
points to (but its case or other aspects should be made
Tcl Last change: 8.4 26
Filesystem(3) Tcl Library Procedures Filesystem(3)
unique). All other path components should be converted from
symbolic links. This one exception is required to agree
with Tcl's semantics with file delete, file rename, file
copy operating on symbolic links. This function may be
called with nextCheckpoint either at the beginning of the
path (i.e. zero), at the end of the path, or at any inter-
mediate file separator in the path. It will never point to
any other arbitrary position in the path. In the last of the
three valid cases, the implementation can assume that the
path up to and including the file separator is known and
normalized.
typedef int Tcl_FSNormalizePathProc(
Tcl_Interp *interp,
Tcl_Obj *pathPtr,
int nextCheckpoint);
FILESYSTEM OPERATIONS
The fields in this section of the structure contain
addresses of functions which are called to carry out the
basic filesystem operations. A filesystem which expects to
be used with the complete standard Tcl command set must
implement all of these. If some of them are not imple-
mented, then certain Tcl commands may fail when operating on
paths within that filesystem. However, in some instances
this may be desirable (for example, a read-only filesystem
should not implement the last four functions, and a filesys-
tem which does not support symbolic links need not implement
the readlink function, etc. The Tcl core expects filesys-
tems to behave in this way).
FILESYSTEMPATHTYPEPROC
Function to determine the type of a path in this filesystem.
May be NULL, in which case no type information will be
available to users of the filesystem. The "type" is used
only for informational purposes, and should be returned as
the string representation of the Tcl_Obj which is returned.
A typical return value might be "networked", "zip" or "ftp".
The Tcl_Obj result is owned by the filesystem and so Tcl
will increment the refCount of that object if it wishes to
retain a reference to it.
typedef Tcl_Obj* Tcl_FSFilesystemPathTypeProc(
Tcl_Obj *pathPtr);
FILESYSTEMSEPARATORPROC
Function to return the separator character(s) for this
filesystem. This need only be implemented if the filesystem
wishes to use a different separator than the standard string
"/". Amongst other uses, it is returned by the file separa-
tor command. The return value should be an object with
refCount of zero.
Tcl Last change: 8.4 27
Filesystem(3) Tcl Library Procedures Filesystem(3)
typedef Tcl_Obj* Tcl_FSFilesystemSeparatorProc(
Tcl_Obj *pathPtr);
STATPROC
Function to process a Tcl_FSStat call. Must be implemented
for any reasonable filesystem, since many Tcl level commands
depend crucially upon it (e.g. file atime, file isdirectory,
file size, glob).
typedef int Tcl_FSStatProc(
Tcl_Obj *pathPtr,
Tcl_StatBuf *statPtr);
The Tcl_FSStatProc fills the stat structure statPtr with
information about the specified file. You do not need any
access rights to the file to get this information but you
need search rights to all directories named in the path
leading to the file. The stat structure includes info
regarding device, inode (always 0 on Windows), privilege
mode, nlink (always 1 on Windows), user id (always 0 on Win-
dows), group id (always 0 on Windows), rdev (same as device
on Windows), size, last access time, last modification time,
and last metadata change time.
If the file represented by pathPtr exists, the
Tcl_FSStatProc returns 0 and the stat structure is filled
with data. Otherwise, -1 is returned, and no stat info is
given.
ACCESSPROC
Function to process a Tcl_FSAccess call. Must be imple-
mented for any reasonable filesystem, since many Tcl level
commands depend crucially upon it (e.g. file exists, file
readable).
typedef int Tcl_FSAccessProc(
Tcl_Obj *pathPtr,
int mode);
The Tcl_FSAccessProc checks whether the process would be
allowed to read, write or test for existence of the file (or
other filesystem object) whose name is in pathPtr. If the
pathname refers to a symbolic link, then the permissions of
the file referred by this symbolic link should be tested.
On success (all requested permissions granted), zero is
returned. On error (at least one bit in mode asked for a
permission that is denied, or some other error occurred),
-1 is returned.
OPENFILECHANNELPROC
Tcl Last change: 8.4 28
Filesystem(3) Tcl Library Procedures Filesystem(3)
Function to process a Tcl_FSOpenFileChannel call. Must be
implemented for any reasonable filesystem, since any opera-
tions which require open or accessing a file's contents will
use it (e.g. open, encoding, and many Tk commands).
typedef Tcl_Channel Tcl_FSOpenFileChannelProc(
Tcl_Interp *interp,
Tcl_Obj *pathPtr,
int mode,
int permissions);
The Tcl_FSOpenFileChannelProc opens a file specified by
pathPtr and returns a channel handle that can be used to
perform input and output on the file. This API is modeled
after the fopen procedure of the Unix standard I/O library.
The syntax and meaning of all arguments is similar to those
given in the Tcl open command when opening a file, where the
mode argument is a combination of the POSIX flags O_RDONLY,
O_WRONLY, etc. If an error occurs while opening the chan-
nel, the Tcl_FSOpenFileChannelProc returns NULL and records
a POSIX error code that can be retrieved with Tcl_GetErrno.
In addition, if interp is non-NULL, the
Tcl_FSOpenFileChannelProc leaves an error message in
interp's result after any error.
The newly created channel must not registered in the sup-
plied interpreter; that task is up to the caller of
Tcl_FSOpenFileChannel (if necessary). If one of the standard
channels, stdin, stdout or stderr was previously closed, the
act of creating the new channel also assigns it as a
replacement for the standard channel.
MATCHINDIRECTORYPROC
Function to process a Tcl_FSMatchInDirectory call. If not
implemented, then glob and recursive copy functionality will
be lacking in the filesystem (and this may impact commands
like encoding names which use glob functionality inter-
nally).
typedef int Tcl_FSMatchInDirectoryProc(
Tcl_Interp* interp,
Tcl_Obj *resultPtr,
Tcl_Obj *pathPtr,
const char *pattern,
Tcl_GlobTypeData *types);
The function should return all files or directories (or
other filesystem objects) which match the given pattern and
accord with the types specification given. There are two
ways in which this function may be called. If pattern is
NULL, then pathPtr is a full path specification of a single
file or directory which should be checked for existence and
Tcl Last change: 8.4 29
Filesystem(3) Tcl Library Procedures Filesystem(3)
correct type. Otherwise, pathPtr is a directory, the con-
tents of which the function should search for files or
directories which have the correct type. In either case,
pathPtr can be assumed to be both non-NULL and non-empty.
It is not currently documented whether pathPtr will have a
file separator at its end of not, so code should be flexible
to both possibilities.
The return value is a standard Tcl result indicating whether
an error occurred in the matching process. Error messages
are placed in interp, unless interp in NULL in which case no
error message need be generated; on a TCL_OK result, results
should be added to the resultPtr object given (which can be
assumed to be a valid unshared Tcl list). The matches added
to resultPtr should include any path prefix given in pathPtr
(this usually means they will be absolute path specifica-
tions). Note that if no matches are found, that simply
leads to an empty result; errors are only signaled for
actual file or filesystem problems which may occur during
the matching process.
The Tcl_GlobTypeData structure passed in the types parameter
contains the following fields:
typedef struct Tcl_GlobTypeData {
/* Corresponds to bcdpfls as in 'find -t' */
int type;
/* Corresponds to file permissions */
int perm;
/* Acceptable mac type */
Tcl_Obj *macType;
/* Acceptable mac creator */
Tcl_Obj *macCreator;
} Tcl_GlobTypeData;
There are two specific cases which it is important to handle
correctly, both when types is non-NULL. The two cases are
when types->types & TCL_GLOB_TYPE_DIR or types->types &
TCL_GLOB_TYPE_MOUNT are true (and in particular when the
other flags are false). In the first of these cases, the
function must list the contained directories. Tcl uses this
to implement recursive globbing, so it is critical that
filesystems implement directory matching correctly. In the
second of these cases, with TCL_GLOB_TYPE_MOUNT, the
filesystem must list the mount points which lie within the
given pathPtr (and in this case, pathPtr need not lie within
the same filesystem - different to all other cases in which
this function is called). Support for this is critical if
Tcl is to have seamless transitions between from one
filesystem to another.
UTIMEPROC
Tcl Last change: 8.4 30
Filesystem(3) Tcl Library Procedures Filesystem(3)
Function to process a Tcl_FSUtime call. Required to allow
setting (not reading) of times with file mtime, file atime
and the open-r/open-w/fcopy implementation of file copy.
typedef int Tcl_FSUtimeProc(
Tcl_Obj *pathPtr,
struct utimbuf *tval);
The access and modification times of the file specified by
pathPtr should be changed to the values given in the tval
structure.
The return value should be 0 on success and -1 on an error,
as with the system utime.
LINKPROC
Function to process a Tcl_FSLink call. Should be imple-
mented only if the filesystem supports links, and may other-
wise be NULL.
typedef Tcl_Obj* Tcl_FSLinkProc(
Tcl_Obj *linkNamePtr,
Tcl_Obj *toPtr,
int linkAction);
If toPtr is NULL, the function is being asked to read the
contents of a link. The result is a Tcl_Obj specifying the
contents of the link given by linkNamePtr, or NULL if the
link could not be read. The result is owned by the caller
(and should therefore have its ref count incremented before
being returned). Any callers should call Tcl_DecrRefCount
on this result when it is no longer needed. If toPtr is not
NULL, the function should attempt to create a link. The
result in this case should be toPtr if the link was success-
ful and NULL otherwise. In this case the result is not
owned by the caller (i.e. no ref count manipulation on
either end is needed). See the documentation for Tcl_FSLink
for the correct interpretation of the linkAction flags.
LISTVOLUMESPROC
Function to list any filesystem volumes added by this
filesystem. Should be implemented only if the filesystem
adds volumes at the head of the filesystem, so that they can
be returned by file volumes.
typedef Tcl_Obj* Tcl_FSListVolumesProc(void);
The result should be a list of volumes added by this
filesystem, or NULL (or an empty list) if no volumes are
provided. The result object is considered to be owned by
the filesystem (not by Tcl's core), but should be given a
refCount for Tcl. Tcl will use the contents of the list and
Tcl Last change: 8.4 31
Filesystem(3) Tcl Library Procedures Filesystem(3)
then decrement that refCount. This allows filesystems to
choose whether they actually want to retain a "master list"
of volumes or not (if not, they generate the list on the fly
and pass it to Tcl with a refCount of 1 and then forget
about the list, if yes, then they simply increment the
refCount of their master list and pass it to Tcl which will
copy the contents and then decrement the count back to where
it was).
Therefore, Tcl considers return values from this proc to be
read-only.
FILEATTRSTRINGSPROC
Function to list all attribute strings which are valid for
this filesystem. If not implemented the filesystem will not
support the file attributes command. This allows arbitrary
additional information to be attached to files in the
filesystem. If it is not implemented, there is no need to
implement the get and set methods.
typedef const char** Tcl_FSFileAttrStringsProc(
Tcl_Obj *pathPtr,
Tcl_Obj** objPtrRef);
The called function may either return an array of strings,
or may instead return NULL and place a Tcl list into the
given objPtrRef. Tcl will take that list and first incre-
ment its reference count before using it. On completion of
that use, Tcl will decrement its reference count. Hence if
the list should be disposed of by Tcl when done, it should
have a reference count of zero, and if the list should not
be disposed of, the filesystem should ensure it returns an
object with a reference count of at least one.
FILEATTRSGETPROC
Function to process a Tcl_FSFileAttrsGet call, used by file
attributes.
typedef int Tcl_FSFileAttrsGetProc(
Tcl_Interp *interp,
int index,
Tcl_Obj *pathPtr,
Tcl_Obj **objPtrRef);
Returns a standard Tcl return code. The attribute value
retrieved, which corresponds to the index'th element in the
list returned by the Tcl_FSFileAttrStringsProc, is a Tcl_Obj
placed in objPtrRef (if TCL_OK was returned) and is likely
to have a reference count of zero. Either way we must
either store it somewhere (e.g. the Tcl result), or
Incr/Decr its reference count to ensure it is properly
freed.
Tcl Last change: 8.4 32
Filesystem(3) Tcl Library Procedures Filesystem(3)
FILEATTRSSETPROC
Function to process a Tcl_FSFileAttrsSet call, used by file
attributes. If the filesystem is read-only, there is no
need to implement this.
typedef int Tcl_FSFileAttrsSetProc(
Tcl_Interp *interp,
int index,
Tcl_Obj *pathPtr,
Tcl_Obj *objPtr);
The attribute value of the index'th element in the list
returned by the Tcl_FSFileAttrStringsProc should be set to
the objPtr given.
CREATEDIRECTORYPROC
Function to process a Tcl_FSCreateDirectory call. Should be
implemented unless the FS is read-only.
typedef int Tcl_FSCreateDirectoryProc(
Tcl_Obj *pathPtr);
The return value is a standard Tcl result indicating whether
an error occurred in the process. If successful, a new
directory should have been added to the filesystem in the
location specified by pathPtr.
REMOVEDIRECTORYPROC
Function to process a Tcl_FSRemoveDirectory call. Should be
implemented unless the FS is read-only.
typedef int Tcl_FSRemoveDirectoryProc(
Tcl_Obj *pathPtr,
int recursive,
Tcl_Obj **errorPtr);
The return value is a standard Tcl result indicating whether
an error occurred in the process. If successful, the direc-
tory specified by pathPtr should have been removed from the
filesystem. If the recursive flag is given, then a non-
empty directory should be deleted without error. If this
flag is not given, then and the directory is non-empty a
POSIX "EEXIST" error should be signaled. If an error does
occur, the name of the file or directory which caused the
error should be placed in errorPtr.
DELETEFILEPROC
Function to process a Tcl_FSDeleteFile call. Should be
implemented unless the FS is read-only.
typedef int Tcl_FSDeleteFileProc(
Tcl_Obj *pathPtr);
Tcl Last change: 8.4 33
Filesystem(3) Tcl Library Procedures Filesystem(3)
The return value is a standard Tcl result indicating whether
an error occurred in the process. If successful, the file
specified by pathPtr should have been removed from the
filesystem. Note that, if the filesystem supports symbolic
links, Tcl will always call this function and not
Tcl_FSRemoveDirectoryProc when needed to delete them (even
if they are symbolic links to directories).
FILESYSTEM EFFICIENCY
These functions need not be implemented for a particular
filesystem because the core has a fallback implementation
available. See each individual description for the conse-
quences of leaving the field NULL.
LSTATPROC
Function to process a Tcl_FSLstat call. If not implemented,
Tcl will attempt to use the statProc defined above instead.
Therefore it need only be implemented if a filesystem can
differentiate between stat and lstat calls.
typedef int Tcl_FSLstatProc(
Tcl_Obj *pathPtr,
Tcl_StatBuf *statPtr);
The behavior of this function is very similar to that of the
Tcl_FSStatProc defined above, except that if it is applied
to a symbolic link, it returns information about the link,
not about the target file.
COPYFILEPROC
Function to process a Tcl_FSCopyFile call. If not imple-
mented Tcl will fall back on open-r, open-w and fcopy as a
copying mechanism. Therefore it need only be implemented if
the filesystem can perform that action more efficiently.
typedef int Tcl_FSCopyFileProc(
Tcl_Obj *srcPathPtr,
Tcl_Obj *destPathPtr);
The return value is a standard Tcl result indicating whether
an error occurred in the copying process. Note that, dest-
PathPtr is the name of the file which should become the copy
of srcPathPtr. It is never the name of a directory into
which srcPathPtr could be copied (i.e. the function is much
simpler than the Tcl level file copy subcommand). Note
that, if the filesystem supports symbolic links, Tcl will
always call this function and not copyDirectoryProc when
needed to copy them (even if they are symbolic links to
directories). Finally, if the filesystem determines it can-
not support the file copy action, calling
Tcl_SetErrno(EXDEV) and returning a non-TCL_OK result will
tell Tcl to use its standard fallback mechanisms.
Tcl Last change: 8.4 34
Filesystem(3) Tcl Library Procedures Filesystem(3)
RENAMEFILEPROC
Function to process a Tcl_FSRenameFile call. If not imple-
mented, Tcl will fall back on a copy and delete mechanism.
Therefore it need only be implemented if the filesystem can
perform that action more efficiently.
typedef int Tcl_FSRenameFileProc(
Tcl_Obj *srcPathPtr,
Tcl_Obj *destPathPtr);
The return value is a standard Tcl result indicating whether
an error occurred in the renaming process. If the filesys-
tem determines it cannot support the file rename action,
calling Tcl_SetErrno(EXDEV) and returning a non-TCL_OK
result will tell Tcl to use its standard fallback mechan-
isms.
COPYDIRECTORYPROC
Function to process a Tcl_FSCopyDirectory call. If not
implemented, Tcl will fall back on a recursive file mkdir,
file copy mechanism. Therefore it need only be implemented
if the filesystem can perform that action more efficiently.
typedef int Tcl_FSCopyDirectoryProc(
Tcl_Obj *srcPathPtr,
Tcl_Obj *destPathPtr,
Tcl_Obj **errorPtr);
The return value is a standard Tcl result indicating whether
an error occurred in the copying process. If an error does
occur, the name of the file or directory which caused the
error should be placed in errorPtr. Note that, destPathPtr
is the name of the directory-name which should become the
mirror-image of srcPathPtr. It is not the name of a direc-
tory into which srcPathPtr should be copied (i.e. the func-
tion is much simpler than the Tcl level file copy subcom-
mand). Finally, if the filesystem determines it cannot sup-
port the directory copy action, calling Tcl_SetErrno(EXDEV)
and returning a non-TCL_OK result will tell Tcl to use its
standard fallback mechanisms.
LOADFILEPROC
Function to process a Tcl_FSLoadFile call. If not imple-
mented, Tcl will fall back on a copy to native-temp followed
by a Tcl_FSLoadFile on that temporary copy. Therefore it
need only be implemented if the filesystem can load code
directly, or it can be implemented simply to return
TCL_ERROR to disable load functionality in this filesystem
entirely.
typedef int Tcl_FSLoadFileProc(
Tcl_Interp *interp,
Tcl Last change: 8.4 35
Filesystem(3) Tcl Library Procedures Filesystem(3)
Tcl_Obj *pathPtr,
Tcl_LoadHandle *handlePtr,
Tcl_FSUnloadFileProc *unloadProcPtr);
Returns a standard Tcl completion code. If an error occurs,
an error message is left in the interp's result. The func-
tion dynamically loads a binary code file into memory. On a
successful load, the handlePtr should be filled with a token
for the dynamically loaded file, and the unloadProcPtr
should be filled in with the address of a procedure. The
unload procedure will be called with the given
Tcl_LoadHandle as its only parameter when Tcl needs to
unload the file. For example, for the native filesystem,
the Tcl_LoadHandle returned is currently a token which can
be used in the private TclpFindSymbol to access functions in
the new code. Each filesystem is free to define the
Tcl_LoadHandle as it requires. Finally, if the filesystem
determines it cannot support the file load action, calling
Tcl_SetErrno(EXDEV) and returning a non-TCL_OK result will
tell Tcl to use its standard fallback mechanisms.
UNLOADFILEPROC
Function to unload a previously successfully loaded file.
If load was implemented, then this should also be imple-
mented, if there is any cleanup action required.
typedef void Tcl_FSUnloadFileProc(
Tcl_LoadHandle loadHandle);
GETCWDPROC
Function to process a Tcl_FSGetCwd call. Most filesystems
need not implement this. It will usually only be called
once, if getcwd is called before chdir. May be NULL.
typedef Tcl_Obj* Tcl_FSGetCwdProc(
Tcl_Interp *interp);
If the filesystem supports a native notion of a current
working directory (which might perhaps change independent of
Tcl), this function should return that cwd as the result, or
NULL if the current directory could not be determined (e.g.
the user does not have appropriate permissions on the cwd
directory). If NULL is returned, an error message is left
in the interp's result.
CHDIRPROC
Function to process a Tcl_FSChdir call. If filesystems do
not implement this, it will be emulated by a series of
directory access checks. Otherwise, virtual filesystems
which do implement it need only respond with a positive
return result if the pathPtr is a valid, accessible direc-
tory in their filesystem. They need not remember the
Tcl Last change: 8.4 36
Filesystem(3) Tcl Library Procedures Filesystem(3)
result, since that will be automatically remembered for use
by Tcl_FSGetCwd. Real filesystems should carry out the
correct action (i.e. call the correct system chdir API).
typedef int Tcl_FSChdirProc(
Tcl_Obj *pathPtr);
The Tcl_FSChdirProc changes the applications current working
directory to the value specified in pathPtr. The function
returns -1 on error or 0 on success.
SEE ALSO
cd(n), file(n), load(n), open(n), pwd(n), unload(n)
KEYWORDS
stat, access, filesystem, vfs, virtual
Tcl Last change: 8.4 37
Man(1) output converted with
man2html