[141415] trunk/base/src/pextlib1.0/system.c
cal at macports.org
cal at macports.org
Sat Dec 12 01:26:07 PST 2015
Revision: 141415
https://trac.macports.org/changeset/141415
Author: cal at macports.org
Date: 2015-10-17 17:07:16 -0700 (Sat, 17 Oct 2015)
Log Message:
-----------
base: pextlib/system: Report signal termination
Add code to correctly report termination by signal back to the Tcl user. See
https://www.tcl.tk/man/tcl7.6/TclCmd/tclvars.n.html#M7 for a description of the
format in case of signaled subprocesses. See vendor/tcl8.5.15/generic/tclPipe.c
for C code that generates these messages. Use Tcl_SignalId and Tcl_SignalMsg to
generate the required data for the message to be returned to the user.
Modified Paths:
--------------
trunk/base/src/pextlib1.0/system.c
Modified: trunk/base/src/pextlib1.0/system.c
===================================================================
--- trunk/base/src/pextlib1.0/system.c 2015-10-18 00:06:39 UTC (rev 141414)
+++ trunk/base/src/pextlib1.0/system.c 2015-10-18 00:07:16 UTC (rev 141415)
@@ -306,23 +306,36 @@
status = TCL_ERROR;
- if (wait(&ret) == pid && WIFEXITED(ret) && !read_failed) {
+ if (wait(&ret) == pid && (WIFEXITED(ret) || WIFSIGNALED(ret)) && !read_failed) {
/* Normal exit, and reading from the pipe didn't fail. */
- if (WEXITSTATUS(ret) == 0) {
+ if (WIFEXITED(ret) && WEXITSTATUS(ret) == 0) {
status = TCL_OK;
} else {
Tcl_Obj* errorCode;
/* print error */
ui_info(interp, "Command failed: %s", cmdstring);
- ui_info(interp, "Exit code: %d", WEXITSTATUS(ret));
+ if (WIFEXITED(ret)) {
+ ui_info(interp, "Exit code: %d", WEXITSTATUS(ret));
+ } else if(WIFSIGNALED(ret)) {
+ ui_info(interp, "Killed by signal: %d", WTERMSIG(ret));
+ }
- /* set errorCode [list CHILDSTATUS <pid> <code>] */
errorCode = Tcl_NewListObj(0, NULL);
- Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewStringObj("CHILDSTATUS", -1));
- Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewIntObj(pid));
- Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewIntObj(WEXITSTATUS(ret)));
- Tcl_SetObjErrorCode(interp, errorCode);
+ if (WIFEXITED(ret)) {
+ /* set errorCode [list CHILDSTATUS <pid> <code>] */
+ Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewStringObj("CHILDSTATUS", -1));
+ Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewIntObj(pid));
+ Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewIntObj(WEXITSTATUS(ret)));
+ Tcl_SetObjErrorCode(interp, errorCode);
+ } else if (WIFSIGNALED(ret)) {
+ /* set errorCode [list CHILDKILLED <pid> <SIGNAME> <signal descripton>] */
+ Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewStringObj("CHILDKILLED", -1));
+ Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewIntObj(pid));
+ Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewStringObj(Tcl_SignalId(WTERMSIG(ret)), -1));
+ Tcl_ListObjAppendElement(interp, errorCode, Tcl_NewStringObj(Tcl_SignalMsg(WTERMSIG(ret)), -1));
+ Tcl_SetObjErrorCode(interp, errorCode);
+ }
Tcl_SetObjResult(interp, Tcl_NewStringObj("command execution failed", -1));
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/macports-changes/attachments/20151212/4d70898a/attachment.html>
More information about the macports-changes
mailing list