28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
-
+
|
/*
* The following macros convert between TclFile's and fd's. The conversion
* simple involves shifting fd's up by one to ensure that no valid fd is ever
* the same as NULL. Note that this code is duplicated from tclUnixPipe.c
*/
#define MakeFile(fd) ((TclFile)INT2PTR(((int)(fd))+1))
#define GetFd(file) (PTR2INT(file)-1)
#define GetFd(file) ((int)PTR2INT(file)-1)
/*
* The stuff below is used to keep track of file handlers created and
* exercised by the "testfilehandler" command.
*/
typedef struct {
|
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
|
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
|
-
+
|
}
if (Tcl_GetChannelHandle(channel,
(mask & TCL_READABLE) ? TCL_READABLE : TCL_WRITABLE,
(void **) &data) != TCL_OK) {
TclPrintfResult(interp, "couldn't get channel file");
return TCL_ERROR;
}
fd = PTR2INT(data);
fd = (int)PTR2INT(data);
if (Tcl_GetIntFromObj(interp, objv[3], &timeout) != TCL_OK) {
return TCL_ERROR;
}
result = TclUnixWaitForFile(fd, mask, timeout);
if (result & TCL_READABLE) {
Tcl_AppendElement(interp, "readable");
}
|
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
|
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
|
-
+
|
int objc, /* Number of arguments. */
Tcl_Obj *const *objv) /* Argument strings. */
{
int mode;
Tcl_DString ds;
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "mode file ?file ...?");
Tcl_WrongNumArgs(interp, 1, objv, "mode file ?file ...?");
return TCL_ERROR;
}
if (Tcl_GetIntFromObj(interp, objv[1], &mode) != TCL_OK) {
return TCL_ERROR;
}
|