| 1 | '\" | 
|---|
| 2 | '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. | 
|---|
| 3 | '\" Copyright (c) 1997-2000 Ajuba Solutions. | 
|---|
| 4 | '\" | 
|---|
| 5 | '\" See the file "license.terms" for information on usage and redistribution | 
|---|
| 6 | '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
| 7 | '\" | 
|---|
| 8 | '\" RCS: @(#) $Id: CrtChannel.3,v 1.40 2007/12/13 15:22:30 dgp Exp $ | 
|---|
| 9 | .so man.macros | 
|---|
| 10 | .TH Tcl_CreateChannel 3 8.4 Tcl "Tcl Library Procedures" | 
|---|
| 11 | .BS | 
|---|
| 12 | '\" Note:  do not modify the .SH NAME line immediately below! | 
|---|
| 13 | .SH NAME | 
|---|
| 14 | Tcl_CreateChannel, Tcl_GetChannelInstanceData, Tcl_GetChannelType, Tcl_GetChannelName, Tcl_GetChannelHandle, Tcl_GetChannelMode, Tcl_GetChannelBufferSize, Tcl_SetChannelBufferSize, Tcl_NotifyChannel, Tcl_BadChannelOption, Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc, Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc, Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelWideSeekProc, Tcl_ChannelTruncateProc, Tcl_ChannelSetOptionProc, Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc, Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc, Tcl_ChannelHandlerProc, Tcl_ChannelThreadActionProc, Tcl_IsChannelShared, Tcl_IsChannelRegistered, Tcl_CutChannel, Tcl_SpliceChannel, Tcl_IsChannelExisting, Tcl_ClearChannelHandlers, Tcl_GetChannelThread, Tcl_ChannelBuffered \- procedures for creating and manipulating channels | 
|---|
| 15 | .SH SYNOPSIS | 
|---|
| 16 | .nf | 
|---|
| 17 | \fB#include <tcl.h>\fR | 
|---|
| 18 | .sp | 
|---|
| 19 | Tcl_Channel | 
|---|
| 20 | \fBTcl_CreateChannel\fR(\fItypePtr, channelName, instanceData, mask\fR) | 
|---|
| 21 | .sp | 
|---|
| 22 | ClientData | 
|---|
| 23 | \fBTcl_GetChannelInstanceData\fR(\fIchannel\fR) | 
|---|
| 24 | .sp | 
|---|
| 25 | Tcl_ChannelType * | 
|---|
| 26 | \fBTcl_GetChannelType\fR(\fIchannel\fR) | 
|---|
| 27 | .sp | 
|---|
| 28 | const char * | 
|---|
| 29 | \fBTcl_GetChannelName\fR(\fIchannel\fR) | 
|---|
| 30 | .sp | 
|---|
| 31 | int | 
|---|
| 32 | \fBTcl_GetChannelHandle\fR(\fIchannel, direction, handlePtr\fR) | 
|---|
| 33 | .sp | 
|---|
| 34 | Tcl_ThreadId | 
|---|
| 35 | \fBTcl_GetChannelThread\fR(\fIchannel\fR) | 
|---|
| 36 | .sp | 
|---|
| 37 | int | 
|---|
| 38 | \fBTcl_GetChannelMode\fR(\fIchannel\fR) | 
|---|
| 39 | .sp | 
|---|
| 40 | int | 
|---|
| 41 | \fBTcl_GetChannelBufferSize\fR(\fIchannel\fR) | 
|---|
| 42 | .sp | 
|---|
| 43 | \fBTcl_SetChannelBufferSize\fR(\fIchannel, size\fR) | 
|---|
| 44 | .sp | 
|---|
| 45 | \fBTcl_NotifyChannel\fR(\fIchannel, mask\fR) | 
|---|
| 46 | .sp | 
|---|
| 47 | int | 
|---|
| 48 | \fBTcl_BadChannelOption\fR(\fIinterp, optionName, optionList\fR) | 
|---|
| 49 | .sp | 
|---|
| 50 | int | 
|---|
| 51 | \fBTcl_IsChannelShared\fR(\fIchannel\fR) | 
|---|
| 52 | .sp | 
|---|
| 53 | int | 
|---|
| 54 | \fBTcl_IsChannelRegistered\fR(\fIinterp, channel\fR) | 
|---|
| 55 | .sp | 
|---|
| 56 | int | 
|---|
| 57 | \fBTcl_IsChannelExisting\fR(\fIchannelName\fR) | 
|---|
| 58 | .sp | 
|---|
| 59 | void | 
|---|
| 60 | \fBTcl_CutChannel\fR(\fIchannel\fR) | 
|---|
| 61 | .sp | 
|---|
| 62 | void | 
|---|
| 63 | \fBTcl_SpliceChannel\fR(\fIchannel\fR) | 
|---|
| 64 | .sp | 
|---|
| 65 | void | 
|---|
| 66 | \fBTcl_ClearChannelHandlers\fR(\fIchannel\fR) | 
|---|
| 67 | .sp | 
|---|
| 68 | int | 
|---|
| 69 | \fBTcl_ChannelBuffered\fR(\fIchannel\fR) | 
|---|
| 70 | .sp | 
|---|
| 71 | const char * | 
|---|
| 72 | \fBTcl_ChannelName\fR(\fItypePtr\fR) | 
|---|
| 73 | .sp | 
|---|
| 74 | Tcl_ChannelTypeVersion | 
|---|
| 75 | \fBTcl_ChannelVersion\fR(\fItypePtr\fR) | 
|---|
| 76 | .sp | 
|---|
| 77 | Tcl_DriverBlockModeProc * | 
|---|
| 78 | \fBTcl_ChannelBlockModeProc\fR(\fItypePtr\fR) | 
|---|
| 79 | .sp | 
|---|
| 80 | Tcl_DriverCloseProc * | 
|---|
| 81 | \fBTcl_ChannelCloseProc\fR(\fItypePtr\fR) | 
|---|
| 82 | .sp | 
|---|
| 83 | Tcl_DriverClose2Proc * | 
|---|
| 84 | \fBTcl_ChannelClose2Proc\fR(\fItypePtr\fR) | 
|---|
| 85 | .sp | 
|---|
| 86 | Tcl_DriverInputProc * | 
|---|
| 87 | \fBTcl_ChannelInputProc\fR(\fItypePtr\fR) | 
|---|
| 88 | .sp | 
|---|
| 89 | Tcl_DriverOutputProc * | 
|---|
| 90 | \fBTcl_ChannelOutputProc\fR(\fItypePtr\fR) | 
|---|
| 91 | .sp | 
|---|
| 92 | Tcl_DriverSeekProc * | 
|---|
| 93 | \fBTcl_ChannelSeekProc\fR(\fItypePtr\fR) | 
|---|
| 94 | .sp | 
|---|
| 95 | Tcl_DriverWideSeekProc * | 
|---|
| 96 | \fBTcl_ChannelWideSeekProc\fR(\fItypePtr\fR) | 
|---|
| 97 | .sp | 
|---|
| 98 | Tcl_DriverThreadActionProc * | 
|---|
| 99 | \fBTcl_ChannelThreadActionProc\fR(\fItypePtr\fR) | 
|---|
| 100 | .sp | 
|---|
| 101 | .VS 8.5 | 
|---|
| 102 | Tcl_DriverTruncateProc * | 
|---|
| 103 | \fBTcl_ChannelTruncateProc\fR(\fItypePtr\fR) | 
|---|
| 104 | .VE 8.5 | 
|---|
| 105 | .sp | 
|---|
| 106 | Tcl_DriverSetOptionProc * | 
|---|
| 107 | \fBTcl_ChannelSetOptionProc\fR(\fItypePtr\fR) | 
|---|
| 108 | .sp | 
|---|
| 109 | Tcl_DriverGetOptionProc * | 
|---|
| 110 | \fBTcl_ChannelGetOptionProc\fR(\fItypePtr\fR) | 
|---|
| 111 | .sp | 
|---|
| 112 | Tcl_DriverWatchProc * | 
|---|
| 113 | \fBTcl_ChannelWatchProc\fR(\fItypePtr\fR) | 
|---|
| 114 | .sp | 
|---|
| 115 | Tcl_DriverGetHandleProc * | 
|---|
| 116 | \fBTcl_ChannelGetHandleProc\fR(\fItypePtr\fR) | 
|---|
| 117 | .sp | 
|---|
| 118 | Tcl_DriverFlushProc * | 
|---|
| 119 | \fBTcl_ChannelFlushProc\fR(\fItypePtr\fR) | 
|---|
| 120 | .sp | 
|---|
| 121 | Tcl_DriverHandlerProc * | 
|---|
| 122 | \fBTcl_ChannelHandlerProc\fR(\fItypePtr\fR) | 
|---|
| 123 | .sp | 
|---|
| 124 | .SH ARGUMENTS | 
|---|
| 125 | .AS "const Tcl_ChannelType" *channelName | 
|---|
| 126 | .AP "const Tcl_ChannelType" *typePtr in | 
|---|
| 127 | Points to a structure containing the addresses of procedures that | 
|---|
| 128 | can be called to perform I/O and other functions on the channel. | 
|---|
| 129 | .AP "const char" *channelName in | 
|---|
| 130 | The name of this channel, such as \fBfile3\fR; must not be in use | 
|---|
| 131 | by any other channel. Can be NULL, in which case the channel is | 
|---|
| 132 | created without a name. | 
|---|
| 133 | .AP ClientData instanceData in | 
|---|
| 134 | Arbitrary one-word value to be associated with this channel.  This | 
|---|
| 135 | value is passed to procedures in \fItypePtr\fR when they are invoked. | 
|---|
| 136 | .AP int mask in | 
|---|
| 137 | OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR to indicate | 
|---|
| 138 | whether a channel is readable and writable. | 
|---|
| 139 | .AP Tcl_Channel channel in | 
|---|
| 140 | The channel to operate on. | 
|---|
| 141 | .AP int direction in | 
|---|
| 142 | \fBTCL_READABLE\fR means the input handle is wanted; \fBTCL_WRITABLE\fR | 
|---|
| 143 | means the output handle is wanted. | 
|---|
| 144 | .AP ClientData *handlePtr out | 
|---|
| 145 | Points to the location where the desired OS-specific handle should be | 
|---|
| 146 | stored. | 
|---|
| 147 | .AP int size in | 
|---|
| 148 | The size, in bytes, of buffers to allocate in this channel. | 
|---|
| 149 | .AP int mask in | 
|---|
| 150 | An OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR | 
|---|
| 151 | and \fBTCL_EXCEPTION\fR that indicates events that have occurred on | 
|---|
| 152 | this channel. | 
|---|
| 153 | .AP Tcl_Interp *interp in | 
|---|
| 154 | Current interpreter. (can be NULL) | 
|---|
| 155 | .AP "const char" *optionName in | 
|---|
| 156 | Name of the invalid option. | 
|---|
| 157 | .AP "const char" *optionList in | 
|---|
| 158 | Specific options list (space separated words, without | 
|---|
| 159 | .QW \- ) | 
|---|
| 160 | to append to the standard generic options list. | 
|---|
| 161 | Can be NULL for generic options error message only. | 
|---|
| 162 |  | 
|---|
| 163 | .BE | 
|---|
| 164 |  | 
|---|
| 165 | .SH DESCRIPTION | 
|---|
| 166 | .PP | 
|---|
| 167 | Tcl uses a two-layered channel architecture. It provides a generic upper | 
|---|
| 168 | layer to enable C and Tcl programs to perform input and output using the | 
|---|
| 169 | same APIs for a variety of files, devices, sockets etc. The generic C APIs | 
|---|
| 170 | are described in the manual entry for \fBTcl_OpenFileChannel\fR. | 
|---|
| 171 | .PP | 
|---|
| 172 | The lower layer provides type-specific channel drivers for each type | 
|---|
| 173 | of device supported on each platform.  This manual entry describes the | 
|---|
| 174 | C APIs used to communicate between the generic layer and the | 
|---|
| 175 | type-specific channel drivers.  It also explains how new types of | 
|---|
| 176 | channels can be added by providing new channel drivers. | 
|---|
| 177 | .PP | 
|---|
| 178 | Channel drivers consist of a number of components: First, each channel | 
|---|
| 179 | driver provides a \fBTcl_ChannelType\fR structure containing pointers to | 
|---|
| 180 | functions implementing the various operations used by the generic layer to | 
|---|
| 181 | communicate with the channel driver. The \fBTcl_ChannelType\fR structure | 
|---|
| 182 | and the functions referenced by it are described in the section | 
|---|
| 183 | \fBTCL_CHANNELTYPE\fR, below. | 
|---|
| 184 | .PP | 
|---|
| 185 | Second, channel drivers usually provide a Tcl command to create | 
|---|
| 186 | instances of that type of channel. For example, the Tcl \fBopen\fR | 
|---|
| 187 | command creates channels that use the file and command channel | 
|---|
| 188 | drivers, and the Tcl \fBsocket\fR command creates channels that use | 
|---|
| 189 | TCP sockets for network communication. | 
|---|
| 190 | .PP | 
|---|
| 191 | Third, a channel driver optionally provides a C function to open | 
|---|
| 192 | channel instances of that type. For example, \fBTcl_OpenFileChannel\fR | 
|---|
| 193 | opens a channel that uses the file channel driver, and | 
|---|
| 194 | \fBTcl_OpenTcpClient\fR opens a channel that uses the TCP network | 
|---|
| 195 | protocol.  These creation functions typically use | 
|---|
| 196 | \fBTcl_CreateChannel\fR internally to open the channel. | 
|---|
| 197 | .PP | 
|---|
| 198 | To add a new type of channel you must implement a C API or a Tcl command | 
|---|
| 199 | that opens a channel by invoking \fBTcl_CreateChannel\fR. | 
|---|
| 200 | When your driver calls \fBTcl_CreateChannel\fR it passes in | 
|---|
| 201 | a \fBTcl_ChannelType\fR structure describing the driver's I/O | 
|---|
| 202 | procedures. | 
|---|
| 203 | The generic layer will then invoke the functions referenced in that | 
|---|
| 204 | structure to perform operations on the channel. | 
|---|
| 205 | .PP | 
|---|
| 206 | \fBTcl_CreateChannel\fR opens a new channel and associates the supplied | 
|---|
| 207 | \fItypePtr\fR and \fIinstanceData\fR with it. The channel is opened in the | 
|---|
| 208 | mode indicated by \fImask\fR. | 
|---|
| 209 | For a discussion of channel drivers, their operations and the | 
|---|
| 210 | \fBTcl_ChannelType\fR structure, see the section \fBTCL_CHANNELTYPE\fR, below. | 
|---|
| 211 | .PP | 
|---|
| 212 | \fBTcl_CreateChannel\fR interacts with the code managing the standard | 
|---|
| 213 | channels. Once a standard channel was initialized either through a | 
|---|
| 214 | call to \fBTcl_GetStdChannel\fR or a call to \fBTcl_SetStdChannel\fR | 
|---|
| 215 | closing this standard channel will cause the next call to | 
|---|
| 216 | \fBTcl_CreateChannel\fR to make the new channel the new standard | 
|---|
| 217 | channel too. See \fBTcl_StandardChannels\fR for a general treatise | 
|---|
| 218 | about standard channels and the behaviour of the Tcl library with | 
|---|
| 219 | regard to them. | 
|---|
| 220 | .PP | 
|---|
| 221 | \fBTcl_GetChannelInstanceData\fR returns the instance data associated with | 
|---|
| 222 | the channel in \fIchannel\fR. This is the same as the \fIinstanceData\fR | 
|---|
| 223 | argument in the call to \fBTcl_CreateChannel\fR that created this channel. | 
|---|
| 224 | .PP | 
|---|
| 225 | \fBTcl_GetChannelType\fR returns a pointer to the \fBTcl_ChannelType\fR | 
|---|
| 226 | structure used by the channel in the \fIchannel\fR argument. This is | 
|---|
| 227 | the same as the \fItypePtr\fR argument in the call to | 
|---|
| 228 | \fBTcl_CreateChannel\fR that created this channel. | 
|---|
| 229 | .PP | 
|---|
| 230 | \fBTcl_GetChannelName\fR returns a string containing the name associated | 
|---|
| 231 | with the channel, or NULL if the \fIchannelName\fR argument to | 
|---|
| 232 | \fBTcl_CreateChannel\fR was NULL. | 
|---|
| 233 | .PP | 
|---|
| 234 | \fBTcl_GetChannelHandle\fR places the OS-specific device handle | 
|---|
| 235 | associated with \fIchannel\fR for the given \fIdirection\fR in the | 
|---|
| 236 | location specified by \fIhandlePtr\fR and returns \fBTCL_OK\fR.  If | 
|---|
| 237 | the channel does not have a device handle for the specified direction, | 
|---|
| 238 | then \fBTCL_ERROR\fR is returned instead.  Different channel drivers | 
|---|
| 239 | will return different types of handle.  Refer to the manual entries | 
|---|
| 240 | for each driver to determine what type of handle is returned. | 
|---|
| 241 | .PP | 
|---|
| 242 | \fBTcl_GetChannelThread\fR returns the id of the thread currently managing | 
|---|
| 243 | the specified \fIchannel\fR. This allows channel drivers to send their file | 
|---|
| 244 | events to the correct event queue even for a multi-threaded core. | 
|---|
| 245 | .PP | 
|---|
| 246 | \fBTcl_GetChannelMode\fR returns an OR-ed combination of \fBTCL_READABLE\fR | 
|---|
| 247 | and \fBTCL_WRITABLE\fR, indicating whether the channel is open for input | 
|---|
| 248 | and output. | 
|---|
| 249 | .PP | 
|---|
| 250 | \fBTcl_GetChannelBufferSize\fR returns the size, in bytes, of buffers | 
|---|
| 251 | allocated to store input or output in \fIchannel\fR. If the value was not set | 
|---|
| 252 | by a previous call to \fBTcl_SetChannelBufferSize\fR, described below, then | 
|---|
| 253 | the default value of 4096 is returned. | 
|---|
| 254 | .PP | 
|---|
| 255 | \fBTcl_SetChannelBufferSize\fR sets the size, in bytes, of buffers that | 
|---|
| 256 | will be allocated in subsequent operations on the channel to store input or | 
|---|
| 257 | output. The \fIsize\fR argument should be between ten and one million, | 
|---|
| 258 | allowing buffers of ten bytes to one million bytes. If \fIsize\fR is | 
|---|
| 259 | outside this range, \fBTcl_SetChannelBufferSize\fR sets the buffer size to | 
|---|
| 260 | 4096. | 
|---|
| 261 | .PP | 
|---|
| 262 | \fBTcl_NotifyChannel\fR is called by a channel driver to indicate to | 
|---|
| 263 | the generic layer that the events specified by \fImask\fR have | 
|---|
| 264 | occurred on the channel.  Channel drivers are responsible for invoking | 
|---|
| 265 | this function whenever the channel handlers need to be called for the | 
|---|
| 266 | channel.  See \fBWATCHPROC\fR below for more details. | 
|---|
| 267 | .PP | 
|---|
| 268 | \fBTcl_BadChannelOption\fR is called from driver specific | 
|---|
| 269 | \fIsetOptionProc\fR or \fIgetOptionProc\fR to generate a complete | 
|---|
| 270 | error message. | 
|---|
| 271 | .PP | 
|---|
| 272 | \fBTcl_ChannelBuffered\fR returns the number of bytes of input | 
|---|
| 273 | currently buffered in the internal buffer (push back area) of the | 
|---|
| 274 | channel itself. It does not report about the data in the overall | 
|---|
| 275 | buffers for the stack of channels the supplied channel is part of. | 
|---|
| 276 | .PP | 
|---|
| 277 | \fBTcl_IsChannelShared\fR checks the refcount of the specified | 
|---|
| 278 | \fIchannel\fR and returns whether the \fIchannel\fR was shared among | 
|---|
| 279 | multiple interpreters (result == 1) or not (result == 0). | 
|---|
| 280 | .PP | 
|---|
| 281 | \fBTcl_IsChannelRegistered\fR checks whether the specified \fIchannel\fR is | 
|---|
| 282 | registered in the given \fIinterp\fRreter (result == 1) or not | 
|---|
| 283 | (result == 0). | 
|---|
| 284 | .PP | 
|---|
| 285 | \fBTcl_IsChannelExisting\fR checks whether a channel with the specified | 
|---|
| 286 | name is registered in the (thread)-global list of all channels (result | 
|---|
| 287 | == 1) or not (result == 0). | 
|---|
| 288 | .PP | 
|---|
| 289 | \fBTcl_CutChannel\fR removes the specified \fIchannel\fR from the | 
|---|
| 290 | (thread)global list of all channels (of the current thread). | 
|---|
| 291 | Application to a channel still registered in some interpreter | 
|---|
| 292 | is not allowed. | 
|---|
| 293 | .VS 8.5 | 
|---|
| 294 | Also notifies the driver if the \fBTcl_ChannelType\fR version is | 
|---|
| 295 | \fBTCL_CHANNEL_VERSION_4\fR (or higher), and | 
|---|
| 296 | \fBTcl_DriverThreadActionProc\fR is defined for it. | 
|---|
| 297 | .VE 8.5 | 
|---|
| 298 | .PP | 
|---|
| 299 | \fBTcl_SpliceChannel\fR adds the specified \fIchannel\fR to the | 
|---|
| 300 | (thread)global list of all channels (of the current thread). | 
|---|
| 301 | Application to a channel registered in some interpreter is not allowed. | 
|---|
| 302 | .VS 8.5 | 
|---|
| 303 | Also notifies the driver if the \fBTcl_ChannelType\fR version is | 
|---|
| 304 | \fBTCL_CHANNEL_VERSION_4\fR (or higher), and | 
|---|
| 305 | \fBTcl_DriverThreadActionProc\fR is defined for it. | 
|---|
| 306 | .VE 8.5 | 
|---|
| 307 | .PP | 
|---|
| 308 | \fBTcl_ClearChannelHandlers\fR removes all channelhandlers and event | 
|---|
| 309 | scripts associated with the specified \fIchannel\fR, thus shutting | 
|---|
| 310 | down all event processing for this channel. | 
|---|
| 311 | .SH TCL_CHANNELTYPE | 
|---|
| 312 | .PP | 
|---|
| 313 | A channel driver provides a \fBTcl_ChannelType\fR structure that contains | 
|---|
| 314 | pointers to functions that implement the various operations on a channel; | 
|---|
| 315 | these operations are invoked as needed by the generic layer.  The structure | 
|---|
| 316 | was versioned starting in Tcl 8.3.2/8.4 to correct a problem with stacked | 
|---|
| 317 | channel drivers.  See the \fBOLD CHANNEL TYPES\fR section below for | 
|---|
| 318 | details about the old structure. | 
|---|
| 319 | .PP | 
|---|
| 320 | The \fBTcl_ChannelType\fR structure contains the following fields: | 
|---|
| 321 | .CS | 
|---|
| 322 | typedef struct Tcl_ChannelType { | 
|---|
| 323 |         char *\fItypeName\fR; | 
|---|
| 324 |         Tcl_ChannelTypeVersion \fIversion\fR; | 
|---|
| 325 |         Tcl_DriverCloseProc *\fIcloseProc\fR; | 
|---|
| 326 |         Tcl_DriverInputProc *\fIinputProc\fR; | 
|---|
| 327 |         Tcl_DriverOutputProc *\fIoutputProc\fR; | 
|---|
| 328 |         Tcl_DriverSeekProc *\fIseekProc\fR; | 
|---|
| 329 |         Tcl_DriverSetOptionProc *\fIsetOptionProc\fR; | 
|---|
| 330 |         Tcl_DriverGetOptionProc *\fIgetOptionProc\fR; | 
|---|
| 331 |         Tcl_DriverWatchProc *\fIwatchProc\fR; | 
|---|
| 332 |         Tcl_DriverGetHandleProc *\fIgetHandleProc\fR; | 
|---|
| 333 |         Tcl_DriverClose2Proc *\fIclose2Proc\fR; | 
|---|
| 334 |         Tcl_DriverBlockModeProc *\fIblockModeProc\fR; | 
|---|
| 335 |         Tcl_DriverFlushProc *\fIflushProc\fR; | 
|---|
| 336 |         Tcl_DriverHandlerProc *\fIhandlerProc\fR; | 
|---|
| 337 |         Tcl_DriverWideSeekProc *\fIwideSeekProc\fR; | 
|---|
| 338 |         Tcl_DriverThreadActionProc *\fIthreadActionProc\fR; | 
|---|
| 339 | .VS 8.5 | 
|---|
| 340 |         Tcl_DriverTruncateProc *\fItruncateProc\fR; | 
|---|
| 341 | .VE 8.5 | 
|---|
| 342 | } Tcl_ChannelType; | 
|---|
| 343 | .CE | 
|---|
| 344 | .PP | 
|---|
| 345 | It is not necessary to provide implementations for all channel | 
|---|
| 346 | operations.  Those which are not necessary may be set to NULL in the | 
|---|
| 347 | struct: \fIblockModeProc\fR, \fIseekProc\fR, \fIsetOptionProc\fR, | 
|---|
| 348 | \fIgetOptionProc\fR, and \fIclose2Proc\fR, in addition to | 
|---|
| 349 | \fIflushProc\fR, \fIhandlerProc\fR, \fIthreadActionProc\fR, and | 
|---|
| 350 | \fItruncateProc\fR.  Other functions that cannot be implemented in a | 
|---|
| 351 | meaningful way should return \fBEINVAL\fR when called, to indicate | 
|---|
| 352 | that the operations they represent are not available. Also note that | 
|---|
| 353 | \fIwideSeekProc\fR can be NULL if \fIseekProc\fR is. | 
|---|
| 354 | .PP | 
|---|
| 355 | The user should only use the above structure for \fBTcl_ChannelType\fR | 
|---|
| 356 | instantiation.  When referencing fields in a \fBTcl_ChannelType\fR | 
|---|
| 357 | structure, the following functions should be used to obtain the values: | 
|---|
| 358 | \fBTcl_ChannelName\fR, \fBTcl_ChannelVersion\fR, | 
|---|
| 359 | \fBTcl_ChannelBlockModeProc\fR, \fBTcl_ChannelCloseProc\fR, | 
|---|
| 360 | \fBTcl_ChannelClose2Proc\fR, \fBTcl_ChannelInputProc\fR, | 
|---|
| 361 | \fBTcl_ChannelOutputProc\fR, \fBTcl_ChannelSeekProc\fR, | 
|---|
| 362 | \fBTcl_ChannelWideSeekProc\fR, \fBTcl_ChannelThreadActionProc\fR, | 
|---|
| 363 | .VS 8.5 | 
|---|
| 364 | \fBTcl_ChannelTruncateProc\fR, | 
|---|
| 365 | .VE 8.5 | 
|---|
| 366 | \fBTcl_ChannelSetOptionProc\fR, \fBTcl_ChannelGetOptionProc\fR, | 
|---|
| 367 | \fBTcl_ChannelWatchProc\fR, \fBTcl_ChannelGetHandleProc\fR, | 
|---|
| 368 | \fBTcl_ChannelFlushProc\fR, or \fBTcl_ChannelHandlerProc\fR. | 
|---|
| 369 | .PP | 
|---|
| 370 | The change to the structures was made in such a way that standard channel | 
|---|
| 371 | types are binary compatible.  However, channel types that use stacked | 
|---|
| 372 | channels (i.e. TLS, Trf) have new versions to correspond to the above change | 
|---|
| 373 | since the previous code for stacked channels had problems. | 
|---|
| 374 | .SS TYPENAME | 
|---|
| 375 | .PP | 
|---|
| 376 | The \fItypeName\fR field contains a null-terminated string that | 
|---|
| 377 | identifies the type of the device implemented by this driver, e.g. | 
|---|
| 378 | \fBfile\fR or \fBsocket\fR. | 
|---|
| 379 | .PP | 
|---|
| 380 | This value can be retrieved with \fBTcl_ChannelName\fR, which returns | 
|---|
| 381 | a pointer to the string. | 
|---|
| 382 | .SS VERSION | 
|---|
| 383 | .PP | 
|---|
| 384 |  | 
|---|
| 385 | The \fIversion\fR field should be set to the version of the structure | 
|---|
| 386 | that you require. \fBTCL_CHANNEL_VERSION_2\fR is the minimum recommended. | 
|---|
| 387 | \fBTCL_CHANNEL_VERSION_3\fR must be set to specifiy the \fIwideSeekProc\fR member. | 
|---|
| 388 | \fBTCL_CHANNEL_VERSION_4\fR must be set to specifiy the \fIthreadActionProc\fR member | 
|---|
| 389 | (includes \fIwideSeekProc\fR). | 
|---|
| 390 | .VS 8.5 | 
|---|
| 391 | \fBTCL_CHANNEL_VERSION_5\fR must be set to specifiy the | 
|---|
| 392 | \fItruncateProc\fR members (includes | 
|---|
| 393 | \fIwideSeekProc\fR and \fIthreadActionProc\fR). | 
|---|
| 394 | .VE 8.5 | 
|---|
| 395 | If it is not set to any of these, then this | 
|---|
| 396 | \fBTcl_ChannelType\fR is assumed to have the original structure.  See | 
|---|
| 397 | \fBOLD CHANNEL TYPES\fR for more details.  While Tcl will recognize | 
|---|
| 398 | and function with either structures, stacked channels must be of at | 
|---|
| 399 | least \fBTCL_CHANNEL_VERSION_2\fR to function correctly. | 
|---|
| 400 | .PP | 
|---|
| 401 | This value can be retrieved with \fBTcl_ChannelVersion\fR, which returns | 
|---|
| 402 | one of | 
|---|
| 403 | .VS 8.5 | 
|---|
| 404 | \fBTCL_CHANNEL_VERSION_5\fR, | 
|---|
| 405 | .VE 8.5 | 
|---|
| 406 | \fBTCL_CHANNEL_VERSION_4\fR, | 
|---|
| 407 | \fBTCL_CHANNEL_VERSION_3\fR, | 
|---|
| 408 | \fBTCL_CHANNEL_VERSION_2\fR or \fBTCL_CHANNEL_VERSION_1\fR. | 
|---|
| 409 | .SS BLOCKMODEPROC | 
|---|
| 410 | .PP | 
|---|
| 411 | The \fIblockModeProc\fR field contains the address of a function called by | 
|---|
| 412 | the generic layer to set blocking and nonblocking mode on the device. | 
|---|
| 413 | \fIBlockModeProc\fR should match the following prototype: | 
|---|
| 414 | .PP | 
|---|
| 415 | .CS | 
|---|
| 416 | typedef int Tcl_DriverBlockModeProc( | 
|---|
| 417 |         ClientData \fIinstanceData\fR, | 
|---|
| 418 |         int \fImode\fR); | 
|---|
| 419 | .CE | 
|---|
| 420 | .PP | 
|---|
| 421 | The \fIinstanceData\fR is the same as the value passed to | 
|---|
| 422 | \fBTcl_CreateChannel\fR when this channel was created.  The \fImode\fR | 
|---|
| 423 | argument is either \fBTCL_MODE_BLOCKING\fR or \fBTCL_MODE_NONBLOCKING\fR to | 
|---|
| 424 | set the device into blocking or nonblocking mode. The function should | 
|---|
| 425 | return zero if the operation was successful, or a nonzero POSIX error code | 
|---|
| 426 | if the operation failed. | 
|---|
| 427 | .PP | 
|---|
| 428 | If the operation is successful, the function can modify the supplied | 
|---|
| 429 | \fIinstanceData\fR to record that the channel entered blocking or | 
|---|
| 430 | nonblocking mode and to implement the blocking or nonblocking behavior. | 
|---|
| 431 | For some device types, the blocking and nonblocking behavior can be | 
|---|
| 432 | implemented by the underlying operating system; for other device types, the | 
|---|
| 433 | behavior must be emulated in the channel driver. | 
|---|
| 434 | .PP | 
|---|
| 435 | This value can be retrieved with \fBTcl_ChannelBlockModeProc\fR, which returns | 
|---|
| 436 | a pointer to the function. | 
|---|
| 437 | .PP | 
|---|
| 438 | A channel driver \fBnot\fR supplying a \fIblockModeProc\fR has to be | 
|---|
| 439 | very, very careful. It has to tell the generic layer exactly which | 
|---|
| 440 | blocking mode is acceptable to it, and should this also document for | 
|---|
| 441 | the user so that the blocking mode of the channel is not changed to an | 
|---|
| 442 | inacceptable value. Any confusion here may lead the interpreter into a | 
|---|
| 443 | (spurious and difficult to find) deadlock. | 
|---|
| 444 | .SS "CLOSEPROC AND CLOSE2PROC" | 
|---|
| 445 | .PP | 
|---|
| 446 | The \fIcloseProc\fR field contains the address of a function called by the | 
|---|
| 447 | generic layer to clean up driver-related information when the channel is | 
|---|
| 448 | closed. \fICloseProc\fR must match the following prototype: | 
|---|
| 449 | .PP | 
|---|
| 450 | .CS | 
|---|
| 451 | typedef int Tcl_DriverCloseProc( | 
|---|
| 452 |         ClientData \fIinstanceData\fR, | 
|---|
| 453 |         Tcl_Interp *\fIinterp\fR); | 
|---|
| 454 | .CE | 
|---|
| 455 | .PP | 
|---|
| 456 | The \fIinstanceData\fR argument is the same as the value provided to | 
|---|
| 457 | \fBTcl_CreateChannel\fR when the channel was created. The function should | 
|---|
| 458 | release any storage maintained by the channel driver for this channel, and | 
|---|
| 459 | close the input and output devices encapsulated by this channel. All queued | 
|---|
| 460 | output will have been flushed to the device before this function is called, | 
|---|
| 461 | and no further driver operations will be invoked on this instance after | 
|---|
| 462 | calling the \fIcloseProc\fR. If the close operation is successful, the | 
|---|
| 463 | procedure should return zero; otherwise it should return a nonzero POSIX | 
|---|
| 464 | error code. In addition, if an error occurs and \fIinterp\fR is not NULL, | 
|---|
| 465 | the procedure should store an error message in the interpreter's result. | 
|---|
| 466 | .PP | 
|---|
| 467 | Alternatively, channels that support closing the read and write sides | 
|---|
| 468 | independently may set \fIcloseProc\fR to \fBTCL_CLOSE2PROC\fR and set | 
|---|
| 469 | \fIclose2Proc\fR to the address of a function that matches the | 
|---|
| 470 | following prototype: | 
|---|
| 471 | .PP | 
|---|
| 472 | .CS | 
|---|
| 473 | typedef int Tcl_DriverClose2Proc( | 
|---|
| 474 |         ClientData \fIinstanceData\fR, | 
|---|
| 475 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 476 |         int \fIflags\fR); | 
|---|
| 477 | .CE | 
|---|
| 478 | .PP | 
|---|
| 479 | The \fIclose2Proc\fR will be called with \fIflags\fR set to an OR'ed | 
|---|
| 480 | combination of \fBTCL_CLOSE_READ\fR or \fBTCL_CLOSE_WRITE\fR to | 
|---|
| 481 | indicate that the driver should close the read and/or write side of | 
|---|
| 482 | the channel.  The channel driver may be invoked to perform | 
|---|
| 483 | additional operations on the channel after \fIclose2Proc\fR is | 
|---|
| 484 | called to close one or both sides of the channel.  If \fIflags\fR is | 
|---|
| 485 | \fB0\fR (zero), the driver should close the channel in the manner | 
|---|
| 486 | described above for \fIcloseProc\fR.  No further operations will be | 
|---|
| 487 | invoked on this instance after \fIclose2Proc\fR is called with all | 
|---|
| 488 | flags cleared.  In all cases, the \fIclose2Proc\fR function should | 
|---|
| 489 | return zero if the close operation was successful; otherwise it should | 
|---|
| 490 | return a nonzero POSIX error code. In addition, if an error occurs and | 
|---|
| 491 | \fIinterp\fR is not NULL, the procedure should store an error message | 
|---|
| 492 | in the interpreter's result. | 
|---|
| 493 | .PP | 
|---|
| 494 | The \fIcloseProc\fR and \fIclose2Proc\fR values can be retrieved with | 
|---|
| 495 | \fBTcl_ChannelCloseProc\fR or \fBTcl_ChannelClose2Proc\fR, which | 
|---|
| 496 | return a pointer to the respective function. | 
|---|
| 497 | .SS INPUTPROC | 
|---|
| 498 | .PP | 
|---|
| 499 | The \fIinputProc\fR field contains the address of a function called by the | 
|---|
| 500 | generic layer to read data from the file or device and store it in an | 
|---|
| 501 | internal buffer. \fIInputProc\fR must match the following prototype: | 
|---|
| 502 | .PP | 
|---|
| 503 | .CS | 
|---|
| 504 | typedef int Tcl_DriverInputProc( | 
|---|
| 505 |         ClientData \fIinstanceData\fR, | 
|---|
| 506 |         char *\fIbuf\fR, | 
|---|
| 507 |         int \fIbufSize\fR, | 
|---|
| 508 |         int *\fIerrorCodePtr\fR); | 
|---|
| 509 | .CE | 
|---|
| 510 | .PP | 
|---|
| 511 | \fIInstanceData\fR is the same as the value passed to | 
|---|
| 512 | \fBTcl_CreateChannel\fR when the channel was created.  The \fIbuf\fR | 
|---|
| 513 | argument points to an array of bytes in which to store input from the | 
|---|
| 514 | device, and the \fIbufSize\fR argument indicates how many bytes are | 
|---|
| 515 | available at \fIbuf\fR. | 
|---|
| 516 | .PP | 
|---|
| 517 | The \fIerrorCodePtr\fR argument points to an integer variable provided by | 
|---|
| 518 | the generic layer. If an error occurs, the function should set the variable | 
|---|
| 519 | to a POSIX error code that identifies the error that occurred. | 
|---|
| 520 | .PP | 
|---|
| 521 | The function should read data from the input device encapsulated by the | 
|---|
| 522 | channel and store it at \fIbuf\fR.  On success, the function should return | 
|---|
| 523 | a nonnegative integer indicating how many bytes were read from the input | 
|---|
| 524 | device and stored at \fIbuf\fR. On error, the function should return -1. If | 
|---|
| 525 | an error occurs after some data has been read from the device, that data is | 
|---|
| 526 | lost. | 
|---|
| 527 | .PP | 
|---|
| 528 | If \fIinputProc\fR can determine that the input device has some data | 
|---|
| 529 | available but less than requested by the \fIbufSize\fR argument, the | 
|---|
| 530 | function should only attempt to read as much data as is available and | 
|---|
| 531 | return without blocking. If the input device has no data available | 
|---|
| 532 | whatsoever and the channel is in nonblocking mode, the function should | 
|---|
| 533 | return an \fBEAGAIN\fR error. If the input device has no data available | 
|---|
| 534 | whatsoever and the channel is in blocking mode, the function should block | 
|---|
| 535 | for the shortest possible time until at least one byte of data can be read | 
|---|
| 536 | from the device; then, it should return as much data as it can read without | 
|---|
| 537 | blocking. | 
|---|
| 538 | .PP | 
|---|
| 539 | This value can be retrieved with \fBTcl_ChannelInputProc\fR, which returns | 
|---|
| 540 | a pointer to the function. | 
|---|
| 541 | .SS OUTPUTPROC | 
|---|
| 542 | .PP | 
|---|
| 543 | The \fIoutputProc\fR field contains the address of a function called by the | 
|---|
| 544 | generic layer to transfer data from an internal buffer to the output device. | 
|---|
| 545 | \fIOutputProc\fR must match the following prototype: | 
|---|
| 546 | .PP | 
|---|
| 547 | .CS | 
|---|
| 548 | typedef int Tcl_DriverOutputProc( | 
|---|
| 549 |         ClientData \fIinstanceData\fR, | 
|---|
| 550 |         const char *\fIbuf\fR, | 
|---|
| 551 |         int \fItoWrite\fR, | 
|---|
| 552 |         int *\fIerrorCodePtr\fR); | 
|---|
| 553 | .CE | 
|---|
| 554 | .PP | 
|---|
| 555 | \fIInstanceData\fR is the same as the value passed to | 
|---|
| 556 | \fBTcl_CreateChannel\fR when the channel was created. The \fIbuf\fR | 
|---|
| 557 | argument contains an array of bytes to be written to the device, and the | 
|---|
| 558 | \fItoWrite\fR argument indicates how many bytes are to be written from the | 
|---|
| 559 | \fIbuf\fR argument. | 
|---|
| 560 | .PP | 
|---|
| 561 | The \fIerrorCodePtr\fR argument points to an integer variable provided by | 
|---|
| 562 | the generic layer. If an error occurs, the function should set this | 
|---|
| 563 | variable to a POSIX error code that identifies the error. | 
|---|
| 564 | .PP | 
|---|
| 565 | The function should write the data at \fIbuf\fR to the output device | 
|---|
| 566 | encapsulated by the channel. On success, the function should return a | 
|---|
| 567 | nonnegative integer indicating how many bytes were written to the output | 
|---|
| 568 | device.  The return value is normally the same as \fItoWrite\fR, but may be | 
|---|
| 569 | less in some cases such as if the output operation is interrupted by a | 
|---|
| 570 | signal. If an error occurs the function should return -1.  In case of | 
|---|
| 571 | error, some data may have been written to the device. | 
|---|
| 572 | .PP | 
|---|
| 573 | If the channel is nonblocking and the output device is unable to absorb any | 
|---|
| 574 | data whatsoever, the function should return -1 with an \fBEAGAIN\fR error | 
|---|
| 575 | without writing any data. | 
|---|
| 576 | .PP | 
|---|
| 577 | This value can be retrieved with \fBTcl_ChannelOutputProc\fR, which returns | 
|---|
| 578 | a pointer to the function. | 
|---|
| 579 | .SS "SEEKPROC AND WIDESEEKPROC" | 
|---|
| 580 | .PP | 
|---|
| 581 | The \fIseekProc\fR field contains the address of a function called by the | 
|---|
| 582 | generic layer to move the access point at which subsequent input or output | 
|---|
| 583 | operations will be applied. \fISeekProc\fR must match the following | 
|---|
| 584 | prototype: | 
|---|
| 585 | .PP | 
|---|
| 586 | .CS | 
|---|
| 587 | typedef int Tcl_DriverSeekProc( | 
|---|
| 588 |         ClientData \fIinstanceData\fR, | 
|---|
| 589 |         long \fIoffset\fR, | 
|---|
| 590 |         int \fIseekMode\fR, | 
|---|
| 591 |         int *\fIerrorCodePtr\fR); | 
|---|
| 592 | .CE | 
|---|
| 593 | .PP | 
|---|
| 594 | The \fIinstanceData\fR argument is the same as the value given to | 
|---|
| 595 | \fBTcl_CreateChannel\fR when this channel was created.  \fIOffset\fR and | 
|---|
| 596 | \fIseekMode\fR have the same meaning as for the \fBTcl_Seek\fR | 
|---|
| 597 | procedure (described in the manual entry for \fBTcl_OpenFileChannel\fR). | 
|---|
| 598 | .PP | 
|---|
| 599 | The \fIerrorCodePtr\fR argument points to an integer variable provided by | 
|---|
| 600 | the generic layer for returning \fBerrno\fR values from the function.  The | 
|---|
| 601 | function should set this variable to a POSIX error code if an error occurs. | 
|---|
| 602 | The function should store an \fBEINVAL\fR error code if the channel type | 
|---|
| 603 | does not implement seeking. | 
|---|
| 604 | .PP | 
|---|
| 605 | The return value is the new access point or -1 in case of error. If an | 
|---|
| 606 | error occurred, the function should not move the access point. | 
|---|
| 607 | .PP | 
|---|
| 608 | If there is a non-NULL \fIseekProc\fR field, the \fIwideSeekProc\fR | 
|---|
| 609 | field may contain the address of an alternative function to use which | 
|---|
| 610 | handles wide (i.e. larger than 32-bit) offsets, so allowing seeks | 
|---|
| 611 | within files larger than 2GB.  The \fIwideSeekProc\fR will be called | 
|---|
| 612 | in preference to the \fIseekProc\fR, but both must be defined if the | 
|---|
| 613 | \fIwideSeekProc\fR is defined.  \fIWideSeekProc\fR must match the | 
|---|
| 614 | following prototype: | 
|---|
| 615 | .PP | 
|---|
| 616 | .CS | 
|---|
| 617 | typedef Tcl_WideInt Tcl_DriverWideSeekProc( | 
|---|
| 618 |         ClientData \fIinstanceData\fR, | 
|---|
| 619 |         Tcl_WideInt \fIoffset\fR, | 
|---|
| 620 |         int \fIseekMode\fR, | 
|---|
| 621 |         int *\fIerrorCodePtr\fR); | 
|---|
| 622 | .CE | 
|---|
| 623 | .PP | 
|---|
| 624 | The arguments and return values mean the same thing as with | 
|---|
| 625 | \fIseekProc\fR above, except that the type of offsets and the return | 
|---|
| 626 | type are different. | 
|---|
| 627 | .PP | 
|---|
| 628 | The \fIseekProc\fR value can be retrieved with | 
|---|
| 629 | \fBTcl_ChannelSeekProc\fR, which returns a pointer to the function, | 
|---|
| 630 | and similarly the \fIwideSeekProc\fR can be retrieved with | 
|---|
| 631 | \fBTcl_ChannelWideSeekProc\fR. | 
|---|
| 632 | .SS SETOPTIONPROC | 
|---|
| 633 | .PP | 
|---|
| 634 | The \fIsetOptionProc\fR field contains the address of a function called by | 
|---|
| 635 | the generic layer to set a channel type specific option on a channel. | 
|---|
| 636 | \fIsetOptionProc\fR must match the following prototype: | 
|---|
| 637 | .PP | 
|---|
| 638 | .CS | 
|---|
| 639 | typedef int Tcl_DriverSetOptionProc( | 
|---|
| 640 |         ClientData \fIinstanceData\fR, | 
|---|
| 641 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 642 |         const char *\fIoptionName\fR, | 
|---|
| 643 |         const char *\fInewValue\fR); | 
|---|
| 644 | .CE | 
|---|
| 645 | .PP | 
|---|
| 646 | \fIoptionName\fR is the name of an option to set, and \fInewValue\fR is | 
|---|
| 647 | the new value for that option, as a string. The \fIinstanceData\fR is the | 
|---|
| 648 | same as the value given to \fBTcl_CreateChannel\fR when this channel was | 
|---|
| 649 | created. The function should do whatever channel type specific action is | 
|---|
| 650 | required to implement the new value of the option. | 
|---|
| 651 | .PP | 
|---|
| 652 | Some options are handled by the generic code and this function is never | 
|---|
| 653 | called to set them, e.g. \fB\-blockmode\fR. Other options are specific to | 
|---|
| 654 | each channel type and the \fIsetOptionProc\fR procedure of the channel | 
|---|
| 655 | driver will get called to implement them. The \fIsetOptionProc\fR field can | 
|---|
| 656 | be NULL, which indicates that this channel type supports no type specific | 
|---|
| 657 | options.  | 
|---|
| 658 | .PP | 
|---|
| 659 | If the option value is successfully modified to the new value, the function | 
|---|
| 660 | returns \fBTCL_OK\fR. | 
|---|
| 661 | It should call \fBTcl_BadChannelOption\fR which itself returns | 
|---|
| 662 | \fBTCL_ERROR\fR if the \fIoptionName\fR is | 
|---|
| 663 | unrecognized.  | 
|---|
| 664 | If \fInewValue\fR specifies a value for the option that | 
|---|
| 665 | is not supported or if a system call error occurs, | 
|---|
| 666 | the function should leave an error message in the | 
|---|
| 667 | \fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The | 
|---|
| 668 | function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX | 
|---|
| 669 | error code. | 
|---|
| 670 | .PP | 
|---|
| 671 | This value can be retrieved with \fBTcl_ChannelSetOptionProc\fR, which returns | 
|---|
| 672 | a pointer to the function. | 
|---|
| 673 | .SS GETOPTIONPROC | 
|---|
| 674 | .PP | 
|---|
| 675 | The \fIgetOptionProc\fR field contains the address of a function called by | 
|---|
| 676 | the generic layer to get the value of a channel type specific option on a | 
|---|
| 677 | channel. \fIgetOptionProc\fR must match the following prototype: | 
|---|
| 678 | .PP | 
|---|
| 679 | .CS | 
|---|
| 680 | typedef int Tcl_DriverGetOptionProc( | 
|---|
| 681 |         ClientData \fIinstanceData\fR, | 
|---|
| 682 |         Tcl_Interp *\fIinterp\fR, | 
|---|
| 683 |         const char *\fIoptionName\fR, | 
|---|
| 684 |         Tcl_DString *\fIoptionValue\fR); | 
|---|
| 685 | .CE | 
|---|
| 686 | .PP | 
|---|
| 687 | \fIOptionName\fR is the name of an option supported by this type of | 
|---|
| 688 | channel. If the option name is not NULL, the function stores its current | 
|---|
| 689 | value, as a string, in the Tcl dynamic string \fIoptionValue\fR. | 
|---|
| 690 | If \fIoptionName\fR is NULL, the function stores in \fIoptionValue\fR an | 
|---|
| 691 | alternating list of all supported options and their current values. | 
|---|
| 692 | On success, the function returns \fBTCL_OK\fR.  | 
|---|
| 693 | It should call \fBTcl_BadChannelOption\fR which itself returns | 
|---|
| 694 | \fBTCL_ERROR\fR if the \fIoptionName\fR is | 
|---|
| 695 | unrecognized. If a system call error occurs, | 
|---|
| 696 | the function should leave an error message in the | 
|---|
| 697 | result of \fIinterp\fR if \fIinterp\fR is not NULL. The | 
|---|
| 698 | function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX | 
|---|
| 699 | error code. | 
|---|
| 700 | .PP | 
|---|
| 701 | Some options are handled by the generic code and this function is never | 
|---|
| 702 | called to retrieve their value, e.g. \fB\-blockmode\fR. Other options are | 
|---|
| 703 | specific to each channel type and the \fIgetOptionProc\fR procedure of the | 
|---|
| 704 | channel driver will get called to implement them. The \fIgetOptionProc\fR | 
|---|
| 705 | field can be NULL, which indicates that this channel type supports no type | 
|---|
| 706 | specific options. | 
|---|
| 707 | .PP | 
|---|
| 708 | This value can be retrieved with \fBTcl_ChannelGetOptionProc\fR, which returns | 
|---|
| 709 | a pointer to the function. | 
|---|
| 710 | .SS WATCHPROC | 
|---|
| 711 | .PP | 
|---|
| 712 | The \fIwatchProc\fR field contains the address of a function called | 
|---|
| 713 | by the generic layer to initialize the event notification mechanism to | 
|---|
| 714 | notice events of interest on this channel. | 
|---|
| 715 | \fIWatchProc\fR should match the following prototype: | 
|---|
| 716 | .PP | 
|---|
| 717 | .CS | 
|---|
| 718 | typedef void Tcl_DriverWatchProc( | 
|---|
| 719 |         ClientData \fIinstanceData\fR, | 
|---|
| 720 |         int \fImask\fR); | 
|---|
| 721 | .CE | 
|---|
| 722 | .PP | 
|---|
| 723 | The \fIinstanceData\fR is the same as the value passed to | 
|---|
| 724 | \fBTcl_CreateChannel\fR when this channel was created. The \fImask\fR | 
|---|
| 725 | argument is an OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR | 
|---|
| 726 | and \fBTCL_EXCEPTION\fR; it indicates events the caller is interested in | 
|---|
| 727 | noticing on this channel. | 
|---|
| 728 | .PP | 
|---|
| 729 | The function should initialize device type specific mechanisms to | 
|---|
| 730 | notice when an event of interest is present on the channel.  When one | 
|---|
| 731 | or more of the designated events occurs on the channel, the channel | 
|---|
| 732 | driver is responsible for calling \fBTcl_NotifyChannel\fR to inform | 
|---|
| 733 | the generic channel module.  The driver should take care not to starve | 
|---|
| 734 | other channel drivers or sources of callbacks by invoking | 
|---|
| 735 | Tcl_NotifyChannel too frequently.  Fairness can be insured by using | 
|---|
| 736 | the Tcl event queue to allow the channel event to be scheduled in sequence | 
|---|
| 737 | with other events.  See the description of \fBTcl_QueueEvent\fR for | 
|---|
| 738 | details on how to queue an event. | 
|---|
| 739 | .PP | 
|---|
| 740 | This value can be retrieved with \fBTcl_ChannelWatchProc\fR, which returns | 
|---|
| 741 | a pointer to the function. | 
|---|
| 742 | .SS GETHANDLEPROC | 
|---|
| 743 | .PP | 
|---|
| 744 | The \fIgetHandleProc\fR field contains the address of a function called by | 
|---|
| 745 | the generic layer to retrieve a device-specific handle from the channel. | 
|---|
| 746 | \fIGetHandleProc\fR should match the following prototype: | 
|---|
| 747 | .PP | 
|---|
| 748 | .CS | 
|---|
| 749 | typedef int Tcl_DriverGetHandleProc( | 
|---|
| 750 |         ClientData \fIinstanceData\fR, | 
|---|
| 751 |         int \fIdirection\fR, | 
|---|
| 752 |         ClientData *\fIhandlePtr\fR); | 
|---|
| 753 | .CE | 
|---|
| 754 | .PP | 
|---|
| 755 | \fIInstanceData\fR is the same as the value passed to | 
|---|
| 756 | \fBTcl_CreateChannel\fR when this channel was created. The \fIdirection\fR | 
|---|
| 757 | argument is either \fBTCL_READABLE\fR to retrieve the handle used | 
|---|
| 758 | for input, or \fBTCL_WRITABLE\fR to retrieve the handle used for | 
|---|
| 759 | output. | 
|---|
| 760 | .PP | 
|---|
| 761 | If the channel implementation has device-specific handles, the | 
|---|
| 762 | function should retrieve the appropriate handle associated with the | 
|---|
| 763 | channel, according the \fIdirection\fR argument.  The handle should be | 
|---|
| 764 | stored in the location referred to by \fIhandlePtr\fR, and | 
|---|
| 765 | \fBTCL_OK\fR should be returned.  If the channel is not open for the | 
|---|
| 766 | specified direction, or if the channel implementation does not use | 
|---|
| 767 | device handles, the function should return \fBTCL_ERROR\fR. | 
|---|
| 768 | .PP | 
|---|
| 769 | This value can be retrieved with \fBTcl_ChannelGetHandleProc\fR, which returns | 
|---|
| 770 | a pointer to the function. | 
|---|
| 771 | .SS FLUSHPROC | 
|---|
| 772 | .PP | 
|---|
| 773 | The \fIflushProc\fR field is currently reserved for future use. | 
|---|
| 774 | It should be set to NULL. | 
|---|
| 775 | \fIFlushProc\fR should match the following prototype: | 
|---|
| 776 | .PP | 
|---|
| 777 | .CS | 
|---|
| 778 | typedef int Tcl_DriverFlushProc( | 
|---|
| 779 |         ClientData \fIinstanceData\fR); | 
|---|
| 780 | .CE | 
|---|
| 781 | .PP | 
|---|
| 782 | This value can be retrieved with \fBTcl_ChannelFlushProc\fR, which returns | 
|---|
| 783 | a pointer to the function. | 
|---|
| 784 | .SS HANDLERPROC | 
|---|
| 785 | .PP | 
|---|
| 786 | The \fIhandlerProc\fR field contains the address of a function called by | 
|---|
| 787 | the generic layer to notify the channel that an event occurred.  It should | 
|---|
| 788 | be defined for stacked channel drivers that wish to be notified of events | 
|---|
| 789 | that occur on the underlying (stacked) channel. | 
|---|
| 790 | \fIHandlerProc\fR should match the following prototype: | 
|---|
| 791 | .PP | 
|---|
| 792 | .CS | 
|---|
| 793 | typedef int Tcl_DriverHandlerProc( | 
|---|
| 794 |         ClientData \fIinstanceData\fR, | 
|---|
| 795 |         int \fIinterestMask\fR); | 
|---|
| 796 | .CE | 
|---|
| 797 | .PP | 
|---|
| 798 | \fIInstanceData\fR is the same as the value passed to \fBTcl_CreateChannel\fR | 
|---|
| 799 | when this channel was created.  The \fIinterestMask\fR is an OR-ed | 
|---|
| 800 | combination of \fBTCL_READABLE\fR or \fBTCL_WRITABLE\fR; it indicates what | 
|---|
| 801 | type of event occurred on this channel. | 
|---|
| 802 | .PP | 
|---|
| 803 | This value can be retrieved with \fBTcl_ChannelHandlerProc\fR, which returns | 
|---|
| 804 | a pointer to the function. | 
|---|
| 805 |  | 
|---|
| 806 | .SS "THREADACTIONPROC" | 
|---|
| 807 | .PP | 
|---|
| 808 | The \fIthreadActionProc\fR field contains the address of the function | 
|---|
| 809 | called by the generic layer when a channel is created, closed, or | 
|---|
| 810 | going to move to a different thread, i.e. whenever thread-specific | 
|---|
| 811 | driver state might have to initialized or updated. It can be NULL. | 
|---|
| 812 | The action \fITCL_CHANNEL_THREAD_REMOVE\fR is used to notify the | 
|---|
| 813 | driver that it should update or remove any thread-specific data it | 
|---|
| 814 | might be maintaining for the channel. | 
|---|
| 815 | .PP | 
|---|
| 816 | The action \fITCL_CHANNEL_THREAD_INSERT\fR is used to notify the | 
|---|
| 817 | driver that it should update or initialize any thread-specific data it | 
|---|
| 818 | might be maintaining using the calling thread as the associate. See | 
|---|
| 819 | \fBTcl_CutChannel\fR and \fBTcl_SpliceChannel\fR for more detail. | 
|---|
| 820 | .PP | 
|---|
| 821 | .CS | 
|---|
| 822 | typedef void Tcl_DriverThreadActionProc( | 
|---|
| 823 |         ClientData \fIinstanceData\fR, | 
|---|
| 824 |         int        \fIaction\fR); | 
|---|
| 825 | .CE | 
|---|
| 826 | .PP | 
|---|
| 827 | \fIInstanceData\fR is the same as the value passed to | 
|---|
| 828 | \fBTcl_CreateChannel\fR when this channel was created. | 
|---|
| 829 | .PP | 
|---|
| 830 | These values can be retrieved with \fBTcl_ChannelThreadActionProc\fR, | 
|---|
| 831 | which returns a pointer to the function. | 
|---|
| 832 | .SS "TRUNCATEPROC" | 
|---|
| 833 | .PP | 
|---|
| 834 | The \fItruncateProc\fR field contains the address of the function | 
|---|
| 835 | called by the generic layer when a channel is truncated to some | 
|---|
| 836 | length. It can be NULL. | 
|---|
| 837 | .PP | 
|---|
| 838 | .CS | 
|---|
| 839 | typedef int Tcl_DriverTruncateProc( | 
|---|
| 840 |         ClientData \fIinstanceData\fR, | 
|---|
| 841 |         Tcl_WideInt \fIlength\fR); | 
|---|
| 842 | .CE | 
|---|
| 843 | .PP | 
|---|
| 844 | \fIInstanceData\fR is the same as the value passed to | 
|---|
| 845 | \fBTcl_CreateChannel\fR when this channel was created, and | 
|---|
| 846 | \fIlength\fR is the new length of the underlying file, which should | 
|---|
| 847 | not be negative. The result should be 0 on success or an errno code | 
|---|
| 848 | (suitable for use with \fBTcl_SetErrno\fR) on failure. | 
|---|
| 849 | .PP | 
|---|
| 850 | These values can be retrieved with \fBTcl_ChannelTruncateProc\fR, | 
|---|
| 851 | which returns a pointer to the function. | 
|---|
| 852 | .SH TCL_BADCHANNELOPTION | 
|---|
| 853 | .PP | 
|---|
| 854 | This procedure generates a | 
|---|
| 855 | .QW "bad option" | 
|---|
| 856 | error message in an | 
|---|
| 857 | (optional) interpreter.  It is used by channel drivers when  | 
|---|
| 858 | an invalid Set/Get option is requested. Its purpose is to concatenate | 
|---|
| 859 | the generic options list to the specific ones and factorize | 
|---|
| 860 | the generic options error message string. | 
|---|
| 861 | .PP | 
|---|
| 862 | It always returns \fBTCL_ERROR\fR | 
|---|
| 863 | .PP | 
|---|
| 864 | An error message is generated in \fIinterp\fR's result object to | 
|---|
| 865 | indicate that a command was invoked with a bad option. | 
|---|
| 866 | The message has the form | 
|---|
| 867 | .CS | 
|---|
| 868 |     bad option "blah": should be one of  | 
|---|
| 869 |     <...generic options...>+<...specific options...> | 
|---|
| 870 | .CE | 
|---|
| 871 | so you get for instance: | 
|---|
| 872 | .CS | 
|---|
| 873 |     bad option "-blah": should be one of -blocking, | 
|---|
| 874 |     -buffering, -buffersize, -eofchar, -translation, | 
|---|
| 875 |     -peername, or -sockname | 
|---|
| 876 | .CE | 
|---|
| 877 | when called with \fIoptionList\fR equal to | 
|---|
| 878 | .QW "peername sockname" | 
|---|
| 879 | .PP | 
|---|
| 880 | .QW blah | 
|---|
| 881 | is the \fIoptionName\fR argument and | 
|---|
| 882 | .QW "<specific options>" | 
|---|
| 883 | is a space separated list of specific option words. | 
|---|
| 884 | The function takes good care of inserting minus signs before | 
|---|
| 885 | each option, commas after, and an | 
|---|
| 886 | .QW or | 
|---|
| 887 | before the last option. | 
|---|
| 888 | .SH "OLD CHANNEL TYPES" | 
|---|
| 889 | The original (8.3.1 and below) \fBTcl_ChannelType\fR structure contains | 
|---|
| 890 | the following fields: | 
|---|
| 891 | .PP | 
|---|
| 892 | .CS | 
|---|
| 893 | typedef struct Tcl_ChannelType { | 
|---|
| 894 |         char *\fItypeName\fR; | 
|---|
| 895 |         Tcl_DriverBlockModeProc *\fIblockModeProc\fR; | 
|---|
| 896 |         Tcl_DriverCloseProc *\fIcloseProc\fR; | 
|---|
| 897 |         Tcl_DriverInputProc *\fIinputProc\fR; | 
|---|
| 898 |         Tcl_DriverOutputProc *\fIoutputProc\fR; | 
|---|
| 899 |         Tcl_DriverSeekProc *\fIseekProc\fR; | 
|---|
| 900 |         Tcl_DriverSetOptionProc *\fIsetOptionProc\fR; | 
|---|
| 901 |         Tcl_DriverGetOptionProc *\fIgetOptionProc\fR; | 
|---|
| 902 |         Tcl_DriverWatchProc *\fIwatchProc\fR; | 
|---|
| 903 |         Tcl_DriverGetHandleProc *\fIgetHandleProc\fR; | 
|---|
| 904 |         Tcl_DriverClose2Proc *\fIclose2Proc\fR; | 
|---|
| 905 | } Tcl_ChannelType; | 
|---|
| 906 | .CE | 
|---|
| 907 | .PP | 
|---|
| 908 | It is still possible to create channel with the above structure.  The | 
|---|
| 909 | internal channel code will determine the version.  It is imperative to use | 
|---|
| 910 | the new \fBTcl_ChannelType\fR structure if you are creating a stacked | 
|---|
| 911 | channel driver, due to problems with the earlier stacked channel | 
|---|
| 912 | implementation (in 8.2.0 to 8.3.1). | 
|---|
| 913 | .PP | 
|---|
| 914 | Prior to 8.4.0 (i.e. during the later releases of 8.3 and early part | 
|---|
| 915 | of the 8.4 development cycle) the \fBTcl_ChannelType\fR structure | 
|---|
| 916 | contained the following fields: | 
|---|
| 917 | .PP | 
|---|
| 918 | .CS | 
|---|
| 919 | typedef struct Tcl_ChannelType { | 
|---|
| 920 |         char *\fItypeName\fR; | 
|---|
| 921 |         Tcl_ChannelTypeVersion \fIversion\fR; | 
|---|
| 922 |         Tcl_DriverCloseProc *\fIcloseProc\fR; | 
|---|
| 923 |         Tcl_DriverInputProc *\fIinputProc\fR; | 
|---|
| 924 |         Tcl_DriverOutputProc *\fIoutputProc\fR; | 
|---|
| 925 |         Tcl_DriverSeekProc *\fIseekProc\fR; | 
|---|
| 926 |         Tcl_DriverSetOptionProc *\fIsetOptionProc\fR; | 
|---|
| 927 |         Tcl_DriverGetOptionProc *\fIgetOptionProc\fR; | 
|---|
| 928 |         Tcl_DriverWatchProc *\fIwatchProc\fR; | 
|---|
| 929 |         Tcl_DriverGetHandleProc *\fIgetHandleProc\fR; | 
|---|
| 930 |         Tcl_DriverClose2Proc *\fIclose2Proc\fR; | 
|---|
| 931 |         Tcl_DriverBlockModeProc *\fIblockModeProc\fR; | 
|---|
| 932 |         Tcl_DriverFlushProc *\fIflushProc\fR; | 
|---|
| 933 |         Tcl_DriverHandlerProc *\fIhandlerProc\fR; | 
|---|
| 934 |         Tcl_DriverTruncateProc *\fItruncateProc\fR; | 
|---|
| 935 | } Tcl_ChannelType; | 
|---|
| 936 | .CE | 
|---|
| 937 | .PP | 
|---|
| 938 | When the above structure is registered as a channel type, the | 
|---|
| 939 | \fIversion\fR field should always be \fBTCL_CHANNEL_VERSION_2\fR. | 
|---|
| 940 |  | 
|---|
| 941 | .SH "SEE ALSO" | 
|---|
| 942 | Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3), Tcl_QueueEvent(3), Tcl_StackChannel(3), Tcl_GetStdChannel(3) | 
|---|
| 943 |  | 
|---|
| 944 | .SH KEYWORDS | 
|---|
| 945 | blocking, channel driver, channel registration, channel type, nonblocking | 
|---|