diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2018-12-25 17:45:11 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2018-12-25 17:45:11 (GMT) |
commit | 5f5fd2864a3193a8d5da12fcb92ba7379084c286 (patch) | |
tree | bcdca927ed2a7b05c647b9a6bfdfd4a7ca5c730e /tcl8.6/doc/interp.n | |
parent | 535baffcecf6e738102fc12cda0109bc963e150f (diff) | |
download | blt-5f5fd2864a3193a8d5da12fcb92ba7379084c286.zip blt-5f5fd2864a3193a8d5da12fcb92ba7379084c286.tar.gz blt-5f5fd2864a3193a8d5da12fcb92ba7379084c286.tar.bz2 |
update tcl/tk
Diffstat (limited to 'tcl8.6/doc/interp.n')
-rw-r--r-- | tcl8.6/doc/interp.n | 910 |
1 files changed, 0 insertions, 910 deletions
diff --git a/tcl8.6/doc/interp.n b/tcl8.6/doc/interp.n deleted file mode 100644 index 92113a6..0000000 --- a/tcl8.6/doc/interp.n +++ /dev/null @@ -1,910 +0,0 @@ -'\" -'\" Copyright (c) 1995-1996 Sun Microsystems, Inc. -'\" Copyright (c) 2004 Donal K. Fellows -'\" Copyright (c) 2006-2008 Joe Mistachkin. -'\" -'\" See the file "license.terms" for information on usage and redistribution -'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. -'\" -.TH interp n 8.6 Tcl "Tcl Built-In Commands" -.so man.macros -.BS -'\" Note: do not modify the .SH NAME line immediately below! -.SH NAME -interp \- Create and manipulate Tcl interpreters -.SH SYNOPSIS -\fBinterp \fIsubcommand \fR?\fIarg arg ...\fR? -.BE -.SH DESCRIPTION -.PP -This command makes it possible to create one or more new Tcl -interpreters that co-exist with the creating interpreter in the -same application. The creating interpreter is called the \fImaster\fR -and the new interpreter is called a \fIslave\fR. -A master can create any number of slaves, and each slave can -itself create additional slaves for which it is master, resulting -in a hierarchy of interpreters. -.PP -Each interpreter is independent from the others: it has its own name -space for commands, procedures, and global variables. -A master interpreter may create connections between its slaves and -itself using a mechanism called an \fIalias\fR. An \fIalias\fR is -a command in a slave interpreter which, when invoked, causes a -command to be invoked in its master interpreter or in another slave -interpreter. The only other connections between interpreters are -through environment variables (the \fBenv\fR variable), which are -normally shared among all interpreters in the application, -and by resource limit exceeded callbacks. Note that the -name space for files (such as the names returned by the \fBopen\fR command) -is no longer shared between interpreters. Explicit commands are provided to -share files and to transfer references to open files from one interpreter -to another. -.PP -The \fBinterp\fR command also provides support for \fIsafe\fR -interpreters. A safe interpreter is a slave whose functions have -been greatly restricted, so that it is safe to execute untrusted -scripts without fear of them damaging other interpreters or the -application's environment. For example, all IO channel creation -commands and subprocess creation commands are made inaccessible to safe -interpreters. -See \fBSAFE INTERPRETERS\fR below for more information on -what features are present in a safe interpreter. -The dangerous functionality is not removed from the safe interpreter; -instead, it is \fIhidden\fR, so that only trusted interpreters can obtain -access to it. For a detailed explanation of hidden commands, see -\fBHIDDEN COMMANDS\fR, below. -The alias mechanism can be used for protected communication (analogous to a -kernel call) between a slave interpreter and its master. -See \fBALIAS INVOCATION\fR, below, for more details -on how the alias mechanism works. -.PP -A qualified interpreter name is a proper Tcl lists containing a subset of its -ancestors in the interpreter hierarchy, terminated by the string naming the -interpreter in its immediate master. Interpreter names are relative to the -interpreter in which they are used. For example, if -.QW \fBa\fR -is a slave of the current interpreter and it has a slave -.QW \fBa1\fR , -which in turn has a slave -.QW \fBa11\fR , -the qualified name of -.QW \fBa11\fR -in -.QW \fBa\fR -is the list -.QW "\fBa1 a11\fR" . -.PP -The \fBinterp\fR command, described below, accepts qualified interpreter -names as arguments; the interpreter in which the command is being evaluated -can always be referred to as \fB{}\fR (the empty list or string). Note that -it is impossible to refer to a master (ancestor) interpreter by name in a -slave interpreter except through aliases. Also, there is no global name by -which one can refer to the first interpreter created in an application. -Both restrictions are motivated by safety concerns. -.SH "THE INTERP COMMAND" -.PP -The \fBinterp\fR command is used to create, delete, and manipulate -slave interpreters, and to share or transfer -channels between interpreters. It can have any of several forms, depending -on the \fIsubcommand\fR argument: -.TP -\fBinterp\fR \fBalias\fR \fIsrcPath\fR \fIsrcToken\fR -. -Returns a Tcl list whose elements are the \fItargetCmd\fR and -\fIarg\fRs associated with the alias represented by \fIsrcToken\fR -(this is the value returned when the alias was -created; it is possible that the name of the source command in the -slave is different from \fIsrcToken\fR). -.TP -\fBinterp\fR \fBalias\fR \fIsrcPath\fR \fIsrcToken\fR \fB{}\fR -. -Deletes the alias for \fIsrcToken\fR in the slave interpreter identified by -\fIsrcPath\fR. -\fIsrcToken\fR refers to the value returned when the alias -was created; if the source command has been renamed, the renamed -command will be deleted. -.TP -\fBinterp\fR \fBalias\fR \fIsrcPath\fR \fIsrcCmd\fR \fItargetPath\fR \fItargetCmd \fR?\fIarg arg ...\fR? -. -This command creates an alias between one slave and another (see the -\fBalias\fR slave command below for creating aliases between a slave -and its master). In this command, either of the slave interpreters -may be anywhere in the hierarchy of interpreters under the interpreter -invoking the command. -\fISrcPath\fR and \fIsrcCmd\fR identify the source of the alias. -\fISrcPath\fR is a Tcl list whose elements select a particular -interpreter. For example, -.QW "\fBa b\fR" -identifies an interpreter -.QW \fBb\fR , -which is a slave of interpreter -.QW \fBa\fR , -which is a slave of the invoking interpreter. An empty list specifies -the interpreter invoking the command. \fIsrcCmd\fR gives the name of -a new command, which will be created in the source interpreter. -\fITargetPath\fR and \fItargetCmd\fR specify a target interpreter -and command, and the \fIarg\fR arguments, if any, specify additional -arguments to \fItargetCmd\fR which are prepended to any arguments specified -in the invocation of \fIsrcCmd\fR. -\fITargetCmd\fR may be undefined at the time of this call, or it may -already exist; it is not created by this command. -The alias arranges for the given target command to be invoked -in the target interpreter whenever the given source command is -invoked in the source interpreter. See \fBALIAS INVOCATION\fR below for -more details. -The command returns a token that uniquely identifies the command created -\fIsrcCmd\fR, even if the command is renamed afterwards. The token may but -does not have to be equal to \fIsrcCmd\fR. -.TP -\fBinterp\fR \fBaliases \fR?\fIpath\fR? -. -This command returns a Tcl list of the tokens of all the source commands for -aliases defined in the interpreter identified by \fIpath\fR. The tokens -correspond to the values returned when -the aliases were created (which may not be the same -as the current names of the commands). -.TP -\fBinterp bgerror \fIpath\fR ?\fIcmdPrefix\fR? -. -This command either gets or sets the current background exception handler -for the interpreter identified by \fIpath\fR. If \fIcmdPrefix\fR is -absent, the current background exception handler is returned, and if it is -present, it is a list of words (of minimum length one) that describes -what to set the interpreter's background exception handler to. See the -\fBBACKGROUND EXCEPTION HANDLING\fR section for more details. -.TP -\fBinterp\fR \fBcancel \fR?\fB\-unwind\fR? ?\fB\-\|\-\fR? ?\fIpath\fR? ?\fIresult\fR? -.VS 8.6 -Cancels the script being evaluated in the interpreter identified by -\fIpath\fR. Without the \fB\-unwind\fR switch the evaluation stack for -the interpreter is unwound until an enclosing catch command is found or -there are no further invocations of the interpreter left on the call -stack. With the \fB\-unwind\fR switch the evaluation stack for the -interpreter is unwound without regard to any intervening catch command -until there are no further invocations of the interpreter left on the -call stack. The \fB\-\|\-\fR switch can be used to mark the end of -switches; it may be needed if \fIpath\fR is an unusual value such -as \fB\-safe\fR. If \fIresult\fR is present, it will be used as the -error message string; otherwise, a default error message string will be -used. -.VE 8.6 -.TP -\fBinterp\fR \fBcreate \fR?\fB\-safe\fR? ?\fB\-\|\-\fR? ?\fIpath\fR? -. -Creates a slave interpreter identified by \fIpath\fR and a new command, -called a \fIslave command\fR. The name of the slave command is the last -component of \fIpath\fR. The new slave interpreter and the slave command -are created in the interpreter identified by the path obtained by removing -the last component from \fIpath\fR. For example, if \fIpath\fR is \fBa b -c\fR then a new slave interpreter and slave command named \fBc\fR are -created in the interpreter identified by the path \fBa b\fR. -The slave command may be used to manipulate the new interpreter as -described below. If \fIpath\fR is omitted, Tcl creates a unique name of the -form \fBinterp\fIx\fR, where \fIx\fR is an integer, and uses it for the -interpreter and the slave command. If the \fB\-safe\fR switch is specified -(or if the master interpreter is a safe interpreter), the new slave -interpreter will be created as a safe interpreter with limited -functionality; otherwise the slave will include the full set of Tcl -built-in commands and variables. The \fB\-\|\-\fR switch can be used to -mark the end of switches; it may be needed if \fIpath\fR is an unusual -value such as \fB\-safe\fR. The result of the command is the name of the -new interpreter. The name of a slave interpreter must be unique among all -the slaves for its master; an error occurs if a slave interpreter by the -given name already exists in this master. -The initial recursion limit of the slave interpreter is set to the -current recursion limit of its parent interpreter. -.TP -\fBinterp\fR \fBdebug \fIpath\fR ?\fB\-frame\fR ?\fIbool\fR?? -. -Controls whether frame-level stack information is captured in the -slave interpreter identified by \fIpath\fR. If no arguments are -given, option and current setting are returned. If \fB\-frame\fR -is given, the debug setting is set to the given boolean if provided -and the current setting is returned. -This only effects the output of \fBinfo frame\fR, in that exact -frame-level information for command invocation at the bytecode level -is only captured with this setting on. -.RS -.PP -For example, with code like -.PP -.CS -\fBproc\fR mycontrol {... script} { - ... - \fBuplevel\fR 1 $script - ... -} - -\fBproc\fR dosomething {...} { - ... - mycontrol { - somecode - } -} -.CE -.PP -the standard setting will provide a relative line number for the -command \fBsomecode\fR and the relevant frame will be of type -\fBeval\fR. With frame-debug active on the other hand the tracking -extends so far that the system will be able to determine the file and -absolute line number of this command, and return a frame of type -\fBsource\fR. This more exact information is paid for with slower -execution of all commands. -.PP -Note that once it is on, this flag cannot be switched back off: such -attempts are silently ignored. This is needed to maintain the -consistency of the underlying interpreter's state. -.RE -.TP -\fBinterp\fR \fBdelete \fR?\fIpath ...?\fR -. -Deletes zero or more interpreters given by the optional \fIpath\fR -arguments, and for each interpreter, it also deletes its slaves. The -command also deletes the slave command for each interpreter deleted. -For each \fIpath\fR argument, if no interpreter by that name -exists, the command raises an error. -.TP -\fBinterp\fR \fBeval\fR \fIpath arg \fR?\fIarg ...\fR? -. -This command concatenates all of the \fIarg\fR arguments in the same -fashion as the \fBconcat\fR command, then evaluates the resulting string as -a Tcl script in the slave interpreter identified by \fIpath\fR. The result -of this evaluation (including all \fBreturn\fR options, -such as \fB\-errorinfo\fR and \fB\-errorcode\fR information, if an -error occurs) is returned to the invoking interpreter. -Note that the script will be executed in the current context stack frame of the -\fIpath\fR interpreter; this is so that the implementations (in a master -interpreter) of aliases in a slave interpreter can execute scripts in -the slave that find out information about the slave's current state -and stack frame. -.TP -\fBinterp exists \fIpath\fR -. -Returns \fB1\fR if a slave interpreter by the specified \fIpath\fR -exists in this master, \fB0\fR otherwise. If \fIpath\fR is omitted, the -invoking interpreter is used. -.TP -\fBinterp expose \fIpath\fR \fIhiddenName\fR ?\fIexposedCmdName\fR? -. -Makes the hidden command \fIhiddenName\fR exposed, eventually bringing -it back under a new \fIexposedCmdName\fR name (this name is currently -accepted only if it is a valid global name space name without any ::), -in the interpreter -denoted by \fIpath\fR. -If an exposed command with the targeted name already exists, this command -fails. -Hidden commands are explained in more detail in \fBHIDDEN COMMANDS\fR, below. -.TP -\fBinterp\fR \fBhide\fR \fIpath\fR \fIexposedCmdName\fR ?\fIhiddenCmdName\fR? -. -Makes the exposed command \fIexposedCmdName\fR hidden, renaming -it to the hidden command \fIhiddenCmdName\fR, or keeping the same name if -\fIhiddenCmdName\fR is not given, in the interpreter denoted -by \fIpath\fR. -If a hidden command with the targeted name already exists, this command -fails. -Currently both \fIexposedCmdName\fR and \fIhiddenCmdName\fR can -not contain namespace qualifiers, or an error is raised. -Commands to be hidden by \fBinterp hide\fR are looked up in the global -namespace even if the current namespace is not the global one. This -prevents slaves from fooling a master interpreter into hiding the wrong -command, by making the current namespace be different from the global one. -Hidden commands are explained in more detail in \fBHIDDEN COMMANDS\fR, below. -.TP -\fBinterp\fR \fBhidden\fR \fIpath\fR -. -Returns a list of the names of all hidden commands in the interpreter -identified by \fIpath\fR. -.TP -\fBinterp\fR \fBinvokehidden\fR \fIpath\fR ?\fI\-option ...\fR? \fIhiddenCmdName\fR ?\fIarg ...\fR? -. -Invokes the hidden command \fIhiddenCmdName\fR with the arguments supplied -in the interpreter denoted by \fIpath\fR. No substitutions or evaluation -are applied to the arguments. Three \fI\-option\fRs are supported, all -of which start with \fB\-\fR: \fB\-namespace\fR (which takes a single -argument afterwards, \fInsName\fR), \fB\-global\fR, and \fB\-\|\-\fR. -If the \fB\-namespace\fR flag is present, the hidden command is invoked in -the namespace called \fInsName\fR in the target interpreter. -If the \fB\-global\fR flag is present, the hidden command is invoked at the -global level in the target interpreter; otherwise it is invoked at the -current call frame and can access local variables in that and outer call -frames. -The \fB\-\|\-\fR flag allows the \fIhiddenCmdName\fR argument to start with a -.QW \- -character, and is otherwise unnecessary. -If both the \fB\-namespace\fR and \fB\-global\fR flags are present, the -\fB\-namespace\fR flag is ignored. -Note that the hidden command will be executed (by default) in the -current context stack frame of the \fIpath\fR interpreter. -Hidden commands are explained in more detail in \fBHIDDEN COMMANDS\fR, below. -.TP -\fBinterp issafe\fR ?\fIpath\fR? -. -Returns \fB1\fR if the interpreter identified by the specified \fIpath\fR -is safe, \fB0\fR otherwise. -.TP -\fBinterp\fR \fBlimit\fR \fIpath\fR \fIlimitType\fR ?\fI\-option\fR? ?\fIvalue\fR \fI...\fR? -. -Sets up, manipulates and queries the configuration of the resource -limit \fIlimitType\fR for the interpreter denoted by \fIpath\fR. If -no \fI\-option\fR is specified, return the current configuration of the -limit. If \fI\-option\fR is the sole argument, return the value of that -option. Otherwise, a list of \fI\-option\fR/\fIvalue\fR argument pairs -must supplied. See \fBRESOURCE LIMITS\fR below for a more detailed -explanation of what limits and options are supported. -.TP -\fBinterp marktrusted\fR \fIpath\fR -. -Marks the interpreter identified by \fIpath\fR as trusted. Does -not expose the hidden commands. This command can only be invoked from a -trusted interpreter. -The command has no effect if the interpreter identified by \fIpath\fR is -already trusted. -.TP -\fBinterp\fR \fBrecursionlimit\fR \fIpath\fR ?\fInewlimit\fR? -. -Returns the maximum allowable nesting depth for the interpreter -specified by \fIpath\fR. If \fInewlimit\fR is specified, -the interpreter recursion limit will be set so that nesting -of more than \fInewlimit\fR calls to \fBTcl_Eval\fR -and related procedures in that interpreter will return an error. -The \fInewlimit\fR value is also returned. -The \fInewlimit\fR value must be a positive integer between 1 and the -maximum value of a non-long integer on the platform. -.RS -.PP -The command sets the maximum size of the Tcl call stack only. It cannot -by itself prevent stack overflows on the C stack being used by the -application. If your machine has a limit on the size of the C stack, you -may get stack overflows before reaching the limit set by the command. If -this happens, see if there is a mechanism in your system for increasing -the maximum size of the C stack. -.RE -.TP -\fBinterp\fR \fBshare\fR \fIsrcPath channelId destPath\fR -. -Causes the IO channel identified by \fIchannelId\fR to become shared -between the interpreter identified by \fIsrcPath\fR and the interpreter -identified by \fIdestPath\fR. Both interpreters have the same permissions -on the IO channel. -Both interpreters must close it to close the underlying IO channel; IO -channels accessible in an interpreter are automatically closed when an -interpreter is destroyed. -.TP -\fBinterp\fR \fBslaves\fR ?\fIpath\fR? -. -Returns a Tcl list of the names of all the slave interpreters associated -with the interpreter identified by \fIpath\fR. If \fIpath\fR is omitted, -the invoking interpreter is used. -.TP -\fBinterp\fR \fBtarget\fR \fIpath alias\fR -. -Returns a Tcl list describing the target interpreter for an alias. The -alias is specified with an interpreter path and source command name, just -as in \fBinterp alias\fR above. The name of the target interpreter is -returned as an interpreter path, relative to the invoking interpreter. -If the target interpreter for the alias is the invoking interpreter then an -empty list is returned. If the target interpreter for the alias is not the -invoking interpreter or one of its descendants then an error is generated. -The target command does not have to be defined at the time of this invocation. -.TP -\fBinterp\fR \fBtransfer\fR \fIsrcPath channelId destPath\fR -. -Causes the IO channel identified by \fIchannelId\fR to become available in -the interpreter identified by \fIdestPath\fR and unavailable in the -interpreter identified by \fIsrcPath\fR. -.SH "SLAVE COMMAND" -.PP -For each slave interpreter created with the \fBinterp\fR command, a -new Tcl command is created in the master interpreter with the same -name as the new interpreter. This command may be used to invoke -various operations on the interpreter. It has the following -general form: -.PP -.CS -\fIslave command \fR?\fIarg arg ...\fR? -.CE -.PP -\fISlave\fR is the name of the interpreter, and \fIcommand\fR -and the \fIarg\fRs determine the exact behavior of the command. -The valid forms of this command are: -.TP -\fIslave \fBaliases\fR -. -Returns a Tcl list whose elements are the tokens of all the -aliases in \fIslave\fR. The tokens correspond to the values returned when -the aliases were created (which may not be the same -as the current names of the commands). -.TP -\fIslave \fBalias \fIsrcToken\fR -. -Returns a Tcl list whose elements are the \fItargetCmd\fR and -\fIarg\fRs associated with the alias represented by \fIsrcToken\fR -(this is the value returned when the alias was -created; it is possible that the actual source command in the -slave is different from \fIsrcToken\fR). -.TP -\fIslave \fBalias \fIsrcToken \fB{}\fR -. -Deletes the alias for \fIsrcToken\fR in the slave interpreter. -\fIsrcToken\fR refers to the value returned when the alias -was created; if the source command has been renamed, the renamed -command will be deleted. -.TP -\fIslave \fBalias \fIsrcCmd targetCmd \fR?\fIarg ..\fR? -. -Creates an alias such that whenever \fIsrcCmd\fR is invoked -in \fIslave\fR, \fItargetCmd\fR is invoked in the master. -The \fIarg\fR arguments will be passed to \fItargetCmd\fR as additional -arguments, prepended before any arguments passed in the invocation of -\fIsrcCmd\fR. -See \fBALIAS INVOCATION\fR below for details. -The command returns a token that uniquely identifies the command created -\fIsrcCmd\fR, even if the command is renamed afterwards. The token may but -does not have to be equal to \fIsrcCmd\fR. -.TP -\fIslave \fBbgerror\fR ?\fIcmdPrefix\fR? -. -This command either gets or sets the current background exception handler -for the \fIslave\fR interpreter. If \fIcmdPrefix\fR is -absent, the current background exception handler is returned, and if it is -present, it is a list of words (of minimum length one) that describes -what to set the interpreter's background exception handler to. See the -\fBBACKGROUND EXCEPTION HANDLING\fR section for more details. -.TP -\fIslave \fBeval \fIarg \fR?\fIarg ..\fR? -. -This command concatenates all of the \fIarg\fR arguments in -the same fashion as the \fBconcat\fR command, then evaluates -the resulting string as a Tcl script in \fIslave\fR. -The result of this evaluation (including all \fBreturn\fR options, -such as \fB\-errorinfo\fR and \fB\-errorcode\fR information, if an -error occurs) is returned to the invoking interpreter. -Note that the script will be executed in the current context stack frame -of \fIslave\fR; this is so that the implementations (in a master -interpreter) of aliases in a slave interpreter can execute scripts in -the slave that find out information about the slave's current state -and stack frame. -.TP -\fIslave \fBexpose \fIhiddenName \fR?\fIexposedCmdName\fR? -. -This command exposes the hidden command \fIhiddenName\fR, eventually bringing -it back under a new \fIexposedCmdName\fR name (this name is currently -accepted only if it is a valid global name space name without any ::), -in \fIslave\fR. -If an exposed command with the targeted name already exists, this command -fails. -For more details on hidden commands, see \fBHIDDEN COMMANDS\fR, below. -.TP -\fIslave \fBhide \fIexposedCmdName\fR ?\fIhiddenCmdName\fR? -. -This command hides the exposed command \fIexposedCmdName\fR, renaming it to -the hidden command \fIhiddenCmdName\fR, or keeping the same name if the -argument is not given, in the \fIslave\fR interpreter. -If a hidden command with the targeted name already exists, this command -fails. -Currently both \fIexposedCmdName\fR and \fIhiddenCmdName\fR can -not contain namespace qualifiers, or an error is raised. -Commands to be hidden are looked up in the global -namespace even if the current namespace is not the global one. This -prevents slaves from fooling a master interpreter into hiding the wrong -command, by making the current namespace be different from the global one. -For more details on hidden commands, see \fBHIDDEN COMMANDS\fR, below. -.TP -\fIslave \fBhidden\fR -. -Returns a list of the names of all hidden commands in \fIslave\fR. -.TP -\fIslave \fBinvokehidden\fR ?\fI\-option ...\fR? \fIhiddenName \fR?\fIarg ..\fR? -. -This command invokes the hidden command \fIhiddenName\fR with the -supplied arguments, in \fIslave\fR. No substitutions or evaluations are -applied to the arguments. Three \fI\-option\fRs are supported, all -of which start with \fB\-\fR: \fB\-namespace\fR (which takes a single -argument afterwards, \fInsName\fR), \fB\-global\fR, and \fB\-\|\-\fR. -If the \fB\-namespace\fR flag is given, the hidden command is invoked in -the specified namespace in the slave. -If the \fB\-global\fR flag is given, the command is invoked at the global -level in the slave; otherwise it is invoked at the current call frame and -can access local variables in that or outer call frames. -The \fB\-\|\-\fR flag allows the \fIhiddenCmdName\fR argument to start with a -.QW \- -character, and is otherwise unnecessary. -If both the \fB\-namespace\fR and \fB\-global\fR flags are given, the -\fB\-namespace\fR flag is ignored. -Note that the hidden command will be executed (by default) in the -current context stack frame of \fIslave\fR. -For more details on hidden commands, -see \fBHIDDEN COMMANDS\fR, below. -.TP -\fIslave \fBissafe\fR -. -Returns \fB1\fR if the slave interpreter is safe, \fB0\fR otherwise. -.TP -\fIslave \fBlimit\fR \fIlimitType\fR ?\fI\-option\fR? ?\fIvalue\fR \fI...\fR? -. -Sets up, manipulates and queries the configuration of the resource -limit \fIlimitType\fR for the slave interpreter. If no \fI\-option\fR -is specified, return the current configuration of the limit. If -\fI\-option\fR is the sole argument, return the value of that option. -Otherwise, a list of \fI\-option\fR/\fIvalue\fR argument pairs must -supplied. See \fBRESOURCE LIMITS\fR below for a more detailed explanation of -what limits and options are supported. -.TP -\fIslave \fBmarktrusted\fR -. -Marks the slave interpreter as trusted. Can only be invoked by a -trusted interpreter. This command does not expose any hidden -commands in the slave interpreter. The command has no effect if the slave -is already trusted. -.TP -\fIslave\fR \fBrecursionlimit\fR ?\fInewlimit\fR? -. -Returns the maximum allowable nesting depth for the \fIslave\fR interpreter. -If \fInewlimit\fR is specified, the recursion limit in \fIslave\fR will be -set so that nesting of more than \fInewlimit\fR calls to \fBTcl_Eval()\fR -and related procedures in \fIslave\fR will return an error. -The \fInewlimit\fR value is also returned. -The \fInewlimit\fR value must be a positive integer between 1 and the -maximum value of a non-long integer on the platform. -.RS -.PP -The command sets the maximum size of the Tcl call stack only. It cannot -by itself prevent stack overflows on the C stack being used by the -application. If your machine has a limit on the size of the C stack, you -may get stack overflows before reaching the limit set by the command. If -this happens, see if there is a mechanism in your system for increasing -the maximum size of the C stack. -.RE -.SH "SAFE INTERPRETERS" -.PP -A safe interpreter is one with restricted functionality, so that -is safe to execute an arbitrary script from your worst enemy without -fear of that script damaging the enclosing application or the rest -of your computing environment. In order to make an interpreter -safe, certain commands and variables are removed from the interpreter. -For example, commands to create files on disk are removed, and the -\fBexec\fR command is removed, since it could be used to cause damage -through subprocesses. -Limited access to these facilities can be provided, by creating -aliases to the master interpreter which check their arguments carefully -and provide restricted access to a safe subset of facilities. -For example, file creation might be allowed in a particular subdirectory -and subprocess invocation might be allowed for a carefully selected and -fixed set of programs. -.PP -A safe interpreter is created by specifying the \fB\-safe\fR switch -to the \fBinterp create\fR command. Furthermore, any slave created -by a safe interpreter will also be safe. -.PP -A safe interpreter is created with exactly the following set of -built-in commands: -.DS -.ta 1.2i 2.4i 3.6i -\fBafter\fR \fBappend\fR \fBapply\fR \fBarray\fR -\fBbinary\fR \fBbreak\fR \fBcatch\fR \fBchan\fR -\fBclock\fR \fBclose\fR \fBconcat\fR \fBcontinue\fR -\fBdict\fR \fBeof\fR \fBerror\fR \fBeval\fR -\fBexpr\fR \fBfblocked\fR \fBfcopy\fR \fBfileevent\fR -\fBflush\fR \fBfor\fR \fBforeach\fR \fBformat\fR -\fBgets\fR \fBglobal\fR \fBif\fR \fBincr\fR -\fBinfo\fR \fBinterp\fR \fBjoin\fR \fBlappend\fR -\fBlassign\fR \fBlindex\fR \fBlinsert\fR \fBlist\fR -\fBllength\fR \fBlrange\fR \fBlrepeat\fR \fBlreplace\fR -\fBlsearch\fR \fBlset\fR \fBlsort\fR \fBnamespace\fR -\fBpackage\fR \fBpid\fR \fBproc\fR \fBputs\fR -\fBread\fR \fBregexp\fR \fBregsub\fR \fBrename\fR -\fBreturn\fR \fBscan\fR \fBseek\fR \fBset\fR -\fBsplit\fR \fBstring\fR \fBsubst\fR \fBswitch\fR -\fBtell\fR \fBtime\fR \fBtrace\fR \fBunset\fR -\fBupdate\fR \fBuplevel\fR \fBupvar\fR \fBvariable\fR -\fBvwait\fR \fBwhile\fR -.DE -The following commands are hidden by \fBinterp create\fR when it -creates a safe interpreter: -.DS -.ta 1.2i 2.4i 3.6i -\fBcd\fR \fBencoding\fR \fBexec\fR \fBexit\fR -\fBfconfigure\fR \fBfile\fR \fBglob\fR \fBload\fR -\fBopen\fR \fBpwd\fR \fBsocket\fR \fBsource\fR -\fBunload\fR -.DE -These commands can be recreated later as Tcl procedures or aliases, or -re-exposed by \fBinterp expose\fR. -.PP -The following commands from Tcl's library of support procedures are -not present in a safe interpreter: -.DS -.ta 1.6i 3.2i -\fBauto_exec_ok\fR \fBauto_import\fR \fBauto_load\fR -\fBauto_load_index\fR \fBauto_qualify\fR \fBunknown\fR -.DE -Note in particular that safe interpreters have no default \fBunknown\fR -command, so Tcl's default autoloading facilities are not available. -Autoload access to Tcl's commands that are normally autoloaded: -.DS -.ta 2.1i -\fBauto_mkindex\fR \fBauto_mkindex_old\fR -\fBauto_reset\fR \fBhistory\fR -\fBparray\fR \fBpkg_mkIndex\fR -\fB::pkg::create\fR \fB::safe::interpAddToAccessPath\fR -\fB::safe::interpCreate\fR \fB::safe::interpConfigure\fR -\fB::safe::interpDelete\fR \fB::safe::interpFindInAccessPath\fR -\fB::safe::interpInit\fR \fB::safe::setLogCmd\fR -\fBtcl_endOfWord\fR \fBtcl_findLibrary\fR -\fBtcl_startOfNextWord\fR \fBtcl_startOfPreviousWord\fR -\fBtcl_wordBreakAfter\fR \fBtcl_wordBreakBefore\fR -.DE -can only be provided by explicit definition of an \fBunknown\fR command -in the safe interpreter. This will involve exposing the \fBsource\fR -command. This is most easily accomplished by creating the safe interpreter -with Tcl's \fBSafe\-Tcl\fR mechanism. \fBSafe\-Tcl\fR provides safe -versions of \fBsource\fR, \fBload\fR, and other Tcl commands needed -to support autoloading of commands and the loading of packages. -.PP -In addition, the \fBenv\fR variable is not present in a safe interpreter, -so it cannot share environment variables with other interpreters. The -\fBenv\fR variable poses a security risk, because users can store -sensitive information in an environment variable. For example, the PGP -manual recommends storing the PGP private key protection password in -the environment variable \fIPGPPASS\fR. Making this variable available -to untrusted code executing in a safe interpreter would incur a -security risk. -.PP -If extensions are loaded into a safe interpreter, they may also restrict -their own functionality to eliminate unsafe commands. For a discussion of -management of extensions for safety see the manual entries for -\fBSafe\-Tcl\fR and the \fBload\fR Tcl command. -.PP -A safe interpreter may not alter the recursion limit of any interpreter, -including itself. -.SH "ALIAS INVOCATION" -.PP -The alias mechanism has been carefully designed so that it can -be used safely when an untrusted script is executing -in a safe slave and the target of the alias is a trusted -master. The most important thing in guaranteeing safety is to -ensure that information passed from the slave to the master is -never evaluated or substituted in the master; if this were to -occur, it would enable an evil script in the slave to invoke -arbitrary functions in the master, which would compromise security. -.PP -When the source for an alias is invoked in the slave interpreter, the -usual Tcl substitutions are performed when parsing that command. -These substitutions are carried out in the source interpreter just -as they would be for any other command invoked in that interpreter. -The command procedure for the source command takes its arguments -and merges them with the \fItargetCmd\fR and \fIarg\fRs for the -alias to create a new array of arguments. If the words -of \fIsrcCmd\fR were -.QW "\fIsrcCmd arg1 arg2 ... argN\fR" , -the new set of words will be -.QW "\fItargetCmd arg arg ... arg arg1 arg2 ... argN\fR" , -where \fItargetCmd\fR and \fIarg\fRs are the values supplied when the -alias was created. \fITargetCmd\fR is then used to locate a command -procedure in the target interpreter, and that command procedure -is invoked with the new set of arguments. An error occurs if -there is no command named \fItargetCmd\fR in the target interpreter. -No additional substitutions are performed on the words: the -target command procedure is invoked directly, without -going through the normal Tcl evaluation mechanism. -Substitutions are thus performed on each word exactly once: -\fItargetCmd\fR and \fIargs\fR were substituted when parsing the command -that created the alias, and \fIarg1 - argN\fR are substituted when -the alias's source command is parsed in the source interpreter. -.PP -When writing the \fItargetCmd\fRs for aliases in safe interpreters, -it is very important that the arguments to that command never be -evaluated or substituted, since this would provide an escape -mechanism whereby the slave interpreter could execute arbitrary -code in the master. This in turn would compromise the security -of the system. -.SH "HIDDEN COMMANDS" -.PP -Safe interpreters greatly restrict the functionality available to Tcl -programs executing within them. -Allowing the untrusted Tcl program to have direct access to this -functionality is unsafe, because it can be used for a variety of -attacks on the environment. -However, there are times when there is a legitimate need to use the -dangerous functionality in the context of the safe interpreter. For -example, sometimes a program must be \fBsource\fRd into the interpreter. -Another example is Tk, where windows are bound to the hierarchy of windows -for a specific interpreter; some potentially dangerous functions, e.g. -window management, must be performed on these windows within the -interpreter context. -.PP -The \fBinterp\fR command provides a solution to this problem in the form of -\fIhidden commands\fR. Instead of removing the dangerous commands entirely -from a safe interpreter, these commands are hidden so they become -unavailable to Tcl scripts executing in the interpreter. However, such -hidden commands can be invoked by any trusted ancestor of the safe -interpreter, in the context of the safe interpreter, using \fBinterp -invoke\fR. Hidden commands and exposed commands reside in separate name -spaces. It is possible to define a hidden command and an exposed command by -the same name within one interpreter. -.PP -Hidden commands in a slave interpreter can be invoked in the body of -procedures called in the master during alias invocation. For example, an -alias for \fBsource\fR could be created in a slave interpreter. When it is -invoked in the slave interpreter, a procedure is called in the master -interpreter to check that the operation is allowable (e.g. it asks to -source a file that the slave interpreter is allowed to access). The -procedure then it invokes the hidden \fBsource\fR command in the slave -interpreter to actually source in the contents of the file. Note that two -commands named \fBsource\fR exist in the slave interpreter: the alias, and -the hidden command. -.PP -Because a master interpreter may invoke a hidden command as part of -handling an alias invocation, great care must be taken to avoid evaluating -any arguments passed in through the alias invocation. -Otherwise, malicious slave interpreters could cause a trusted master -interpreter to execute dangerous commands on their behalf. See the section -on \fBALIAS INVOCATION\fR for a more complete discussion of this topic. -To help avoid this problem, no substitutions or evaluations are -applied to arguments of \fBinterp invokehidden\fR. -.PP -Safe interpreters are not allowed to invoke hidden commands in themselves -or in their descendants. This prevents safe slaves from gaining access to -hidden functionality in themselves or their descendants. -.PP -The set of hidden commands in an interpreter can be manipulated by a trusted -interpreter using \fBinterp expose\fR and \fBinterp hide\fR. The \fBinterp -expose\fR command moves a hidden command to the -set of exposed commands in the interpreter identified by \fIpath\fR, -potentially renaming the command in the process. If an exposed command by -the targeted name already exists, the operation fails. Similarly, -\fBinterp hide\fR moves an exposed command to the set of hidden commands in -that interpreter. Safe interpreters are not allowed to move commands -between the set of hidden and exposed commands, in either themselves or -their descendants. -.PP -Currently, the names of hidden commands cannot contain namespace -qualifiers, and you must first rename a command in a namespace to the -global namespace before you can hide it. -Commands to be hidden by \fBinterp hide\fR are looked up in the global -namespace even if the current namespace is not the global one. This -prevents slaves from fooling a master interpreter into hiding the wrong -command, by making the current namespace be different from the global one. -.SH "RESOURCE LIMITS" -.PP -Every interpreter has two kinds of resource limits that may be imposed by any -master interpreter upon its slaves. Command limits (of type \fBcommand\fR) -restrict the total number of Tcl commands that may be executed by an -interpreter (as can be inspected via the \fBinfo cmdcount\fR command), and -time limits (of type \fBtime\fR) place a limit by which execution within the -interpreter must complete. Note that time limits are expressed as -\fIabsolute\fR times (as in \fBclock seconds\fR) and not relative times (as in -\fBafter\fR) because they may be modified after creation. -.PP -When a limit is exceeded for an interpreter, first any handler callbacks -defined by master interpreters are called. If those callbacks increase or -remove the limit, execution within the (previously) limited interpreter -continues. If the limit is still in force, an error is generated at that point -and normal processing of errors within the interpreter (by the \fBcatch\fR -command) is disabled, so the error propagates outwards (building a stack-trace -as it goes) to the point where the limited interpreter was invoked (e.g. by -\fBinterp eval\fR) where it becomes the responsibility of the calling code to -catch and handle. -.SS "LIMIT OPTIONS" -.PP -Every limit has a number of options associated with it, some of which are -common across all kinds of limits, and others of which are particular to the -kind of limit. -.TP -\fB\-command\fR -. -This option (common for all limit types) specifies (if non-empty) a Tcl script -to be executed in the global namespace of the interpreter reading and writing -the option when the particular limit in the limited interpreter is exceeded. -The callback may modify the limit on the interpreter if it wishes the limited -interpreter to continue executing. If the callback generates an exception, it -is reported through the background exception mechanism (see -\fBBACKGROUND EXCEPTION HANDLING\fR). -Note that the callbacks defined by one interpreter are -completely isolated from the callbacks defined by another, and that the order -in which those callbacks are called is undefined. -.TP -\fB\-granularity\fR -. -This option (common for all limit types) specifies how frequently (out of the -points when the Tcl interpreter is in a consistent state where limit checking -is possible) that the limit is actually checked. This allows the tuning of how -frequently a limit is checked, and hence how often the limit-checking overhead -(which may be substantial in the case of time limits) is incurred. -.TP -\fB\-milliseconds\fR -. -This option specifies the number of milliseconds after the moment defined in -the \fB\-seconds\fR option that the time limit will fire. It should only ever -be specified in conjunction with the \fB\-seconds\fR option (whether it was -set previously or is being set this invocation.) -.TP -\fB\-seconds\fR -. -This option specifies the number of seconds after the epoch (see \fBclock -seconds\fR) that the time limit for the interpreter will be triggered. The -limit will be triggered at the start of the second unless specified at a -sub-second level using the \fB\-milliseconds\fR option. This option may be the -empty string, which indicates that a time limit is not set for the -interpreter. -.TP -\fB\-value\fR -. -This option specifies the number of commands that the interpreter may execute -before triggering the command limit. This option may be the empty string, -which indicates that a command limit is not set for the interpreter. -.PP -Where an interpreter with a resource limit set on it creates a slave -interpreter, that slave interpreter will have resource limits imposed on it -that are at least as restrictive as the limits on the creating master -interpreter. If the master interpreter of the limited master wishes to relax -these conditions, it should hide the \fBinterp\fR command in the child and -then use aliases and the \fBinterp invokehidden\fR subcommand to provide such -access as it chooses to the \fBinterp\fR command to the limited master as -necessary. -.SH "BACKGROUND EXCEPTION HANDLING" -.PP -When an exception happens in a situation where it cannot be reported directly up -the stack (e.g. when processing events in an \fBupdate\fR or \fBvwait\fR call) -the exception is instead reported through the background exception handling mechanism. -Every interpreter has a background exception handler registered; the default exception -handler arranges for the \fBbgerror\fR command in the interpreter's global -namespace to be called, but other exception handlers may be installed and process -background exceptions in substantially different ways. -.PP -A background exception handler consists of a non-empty list of words to which will -be appended two further words at invocation time. The first word will be the -interpreter result at time of the exception, typically an error message, -and the second will be the dictionary of return options at the time of -the exception. These are the same values that \fBcatch\fR can capture -when it controls script evaluation in a non-background situation. -The resulting list will then be executed -in the interpreter's global namespace without further substitutions being -performed. -.SH CREDITS -The safe interpreter mechanism is based on the Safe-Tcl prototype implemented -by Nathaniel Borenstein and Marshall Rose. -.SH EXAMPLES -.PP -Creating and using an alias for a command in the current interpreter: -.PP -.CS -\fBinterp alias\fR {} getIndex {} lsearch {alpha beta gamma delta} -set idx [getIndex delta] -.CE -.PP -Executing an arbitrary command in a safe interpreter where every -invocation of \fBlappend\fR is logged: -.PP -.CS -set i [\fBinterp create\fR -safe] -\fBinterp hide\fR $i lappend -\fBinterp alias\fR $i lappend {} loggedLappend $i -proc loggedLappend {i args} { - puts "logged invocation of lappend $args" - \fBinterp invokehidden\fR $i lappend {*}$args -} -\fBinterp eval\fR $i $someUntrustedScript -.CE -.PP -Setting a resource limit on an interpreter so that an infinite loop -terminates. -.PP -.CS -set i [\fBinterp create\fR] -\fBinterp limit\fR $i command -value 1000 -\fBinterp eval\fR $i { - set x 0 - while {1} { - puts "Counting up... [incr x]" - } -} -.CE -.SH "SEE ALSO" -bgerror(n), load(n), safe(n), Tcl_CreateSlave(3), Tcl_Eval(3), Tcl_BackgroundException(3) -.SH KEYWORDS -alias, master interpreter, safe interpreter, slave interpreter -'\"Local Variables: -'\"mode: nroff -'\"End: |