[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