diff options
Diffstat (limited to 'unix/tclUnixTest.c')
| -rw-r--r-- | unix/tclUnixTest.c | 77 | 
1 files changed, 67 insertions, 10 deletions
| diff --git a/unix/tclUnixTest.c b/unix/tclUnixTest.c index 0d79e47..4b0f369 100644 --- a/unix/tclUnixTest.c +++ b/unix/tclUnixTest.c @@ -6,8 +6,8 @@   * Copyright (c) 1996-1997 Sun Microsystems, Inc.   * Copyright (c) 1998 by Scriptics Corporation.   * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES.   */  #ifndef USE_TCL_STUBS @@ -38,8 +38,8 @@   */  typedef struct Pipe { -    TclFile readFile;		/* File handle for reading from the pipe. -				 * NULL means pipe doesn't exist yet. */ +    TclFile readFile;		/* File handle for reading from the pipe. NULL +				 * means pipe doesn't exist yet. */      TclFile writeFile;		/* File handle for writing from the pipe. */      int readCount;		/* Number of times the file handler for this  				 * file has triggered and the file was @@ -67,6 +67,7 @@ static Tcl_CmdProc TestchmodCmd;  static Tcl_CmdProc TestfilehandlerCmd;  static Tcl_CmdProc TestfilewaitCmd;  static Tcl_CmdProc TestfindexecutableCmd; +static Tcl_ObjCmdProc TestforkObjCmd;  static Tcl_CmdProc TestgetdefencdirCmd;  static Tcl_CmdProc TestgetopenfileCmd;  static Tcl_CmdProc TestgotsigCmd; @@ -103,6 +104,8 @@ TclplatformtestInit(  	    NULL, NULL);      Tcl_CreateCommand(interp, "testfindexecutable", TestfindexecutableCmd,  	    NULL, NULL); +    Tcl_CreateObjCommand(interp, "testfork", TestforkObjCmd, +        NULL, NULL);      Tcl_CreateCommand(interp, "testgetopenfile", TestgetopenfileCmd,  	    NULL, NULL);      Tcl_CreateCommand(interp, "testgetdefenc", TestgetdefencdirCmd, @@ -200,7 +203,7 @@ TestfilehandlerCmd(  	    return TCL_ERROR;  	}  	sprintf(buf, "%d %d", pipePtr->readCount, pipePtr->writeCount); -	Tcl_SetResult(interp, buf, TCL_VOLATILE); +	Tcl_AppendResult(interp, buf, NULL);      } else if (strcmp(argv[1], "create") == 0) {  	if (argc != 5) {  	    Tcl_AppendResult(interp, "wrong # arguments: should be \"", @@ -217,8 +220,8 @@ TestfilehandlerCmd(  	    fcntl(GetFd(pipePtr->readFile), F_SETFL, O_NONBLOCK);  	    fcntl(GetFd(pipePtr->writeFile), F_SETFL, O_NONBLOCK);  #else -	    Tcl_SetResult(interp, "can't make pipes non-blocking", -		    TCL_STATIC); +	    Tcl_AppendResult(interp, "can't make pipes non-blocking", +		    NULL);  	    return TCL_ERROR;  #endif  	} @@ -281,7 +284,7 @@ TestfilehandlerCmd(  	memset(buffer, 'b', 10);  	TclFormatInt(buf, write(GetFd(pipePtr->writeFile), buffer, 10)); -	Tcl_SetResult(interp, buf, TCL_VOLATILE); +	Tcl_AppendResult(interp, buf, NULL);      } else if (strcmp(argv[1], "oneevent") == 0) {  	Tcl_DoOneEvent(TCL_FILE_EVENTS|TCL_DONT_WAIT);      } else if (strcmp(argv[1], "wait") == 0) { @@ -390,7 +393,7 @@ TestfilewaitCmd(      if (Tcl_GetChannelHandle(channel,  	    (mask & TCL_READABLE) ? TCL_READABLE : TCL_WRITABLE,  	    (ClientData*) &data) != TCL_OK) { -	Tcl_SetResult(interp, "couldn't get channel file", TCL_STATIC); +	Tcl_AppendResult(interp, "couldn't get channel file", NULL);  	return TCL_ERROR;      }      fd = PTR2INT(data); @@ -526,6 +529,51 @@ TestsetdefencdirCmd(      Tcl_SetDefaultEncodingDir(argv[1]);      return TCL_OK;  } + +/* + *---------------------------------------------------------------------- + * + * TestforkObjCmd -- + * + *	This function implements the "testfork" command. It is used to + *	fork the Tcl process for specific test cases. + * + * Results: + *	A standard Tcl result. + * + * Side effects: + *	None. + * + *---------------------------------------------------------------------- + */ + +static int +TestforkObjCmd( +    ClientData clientData,	/* Not used. */ +    Tcl_Interp *interp,		/* Current interpreter. */ +    int objc,			/* Number of arguments. */ +    Tcl_Obj *const *objv)		/* Argument strings. */ +{ +    pid_t pid; + +    if (objc != 1) { +        Tcl_WrongNumArgs(interp, 1, objv, ""); +        return TCL_ERROR; +    } +    pid = fork(); +    if (pid == -1) { +        Tcl_AppendResult(interp, +                "Cannot fork", NULL); +        return TCL_ERROR; +    } +    /* Only needed when pthread_atfork is not present, +     * should not hurt otherwise. */ +    if (pid==0) { +	Tcl_InitNotifier(); +    } +    Tcl_SetObjResult(interp, Tcl_NewIntObj(pid)); +    return TCL_OK; +}  /*   *---------------------------------------------------------------------- @@ -699,7 +747,7 @@ TestchmodCmd(      char *rest;      if (argc < 2) { -	usage: +    usage:  	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],  		" mode file ?file ...?", NULL);  	return TCL_ERROR; @@ -727,3 +775,12 @@ TestchmodCmd(      }      return TCL_OK;  } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * tab-width: 8 + * End: + */ | 
