<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-15">
<META content="MSHTML 6.00.6000.16587" name=GENERATOR></HEAD>
<BODY style="MARGIN: 4px 4px 1px; FONT: 10pt Tahoma">
<DIV>Olaf:</DIV>
<DIV> </DIV>
<DIV>THANKS!  It is obvious that these changes to QMachine are responsible for the problems.  It would have taken me forever to find this.  Thanks so much!</DIV>
<DIV> </DIV>
<DIV>I changed the quake procedures to use "&&" instead of "|" and the build/ship routines seem to work again.  Indeed, I even went back and put the comment back in Jay's cm3.cfg and it still works without crashing in M3Path.  This is very good!</DIV>
<DIV> </DIV>
<DIV>Now, I am not real good at parsing thru these text diff files, but am I seeing there was also a change to QMachine that involves how the output is being redirected?</DIV>
<DIV> </DIV>
<DIV>What I am observing in reactor, is that the build/ship/clean/etc output is not being shown in the browser window.  Since these functions are being called via a quake procedure, if the QMachine has been altered somehow not to allow this output to be redirected, then reactor is going to have a real problem.  The output of these quake routines is showing up in the console log window instead of being redirected back to the browser as it was in 4.1 and 5.2.6.</DIV>
<DIV> </DIV>
<DIV>Regards,</DIV>
<DIV>Randy<BR><BR>>>> Olaf Wagner <wagner@elegosoft.com> 1/23/2008 1:32 PM >>><BR>Quoting Randy Coleburn <rcoleburn@scires.com>:<BR><BR>> Olaf:<BR>><BR>> The pipe symbol is used by reactor in the quake exec() calls.  I did<BR>> not program this; it was done by CMass Inc.  My experience has been that<BR>> the pipe worked as a command separator in the quake exec() call, even on<BR>> the Unix systems.  I agree it looks strange, but then, I'm not a quake<BR>> expert.<BR><BR>Is this documented anywhere? The online doc says<BR><BR>exec(...) The arguments are catenated and passed to the operating  <BR>system to be executed as a child process. The command may start `-' or  <BR>`@'. These are stripped before the command is passed to the command  <BR>interpreter. A prefix of `@' indicates that the default action of  <BR>printing the command to the standard output stream before execution  <BR>should be overridden. A prefix character of `-' overrides quake's  <BR>default action of aborting if it detects an error return code after  <BR>executing the command.<BR><BR>I've never seen it, and it seems a really strange choice to me, since<BR>it would make it impossible to use pipes within a command.<BR><BR>OK, I've found it, but didn't know it ever existed ;-)<BR>Here is the diff:<BR><BR>% cvs diff -u -r 1.3 -r 1.4 m3-sys/m3quake/src/QMachine.m3<BR>Index: m3-sys/m3quake/src/QMachine.m3<BR>===================================================================<BR>RCS file: /usr/cvs/cm3/m3-sys/m3quake/src/QMachine.m3,v<BR>retrieving revision 1.3<BR>retrieving revision 1.4<BR>diff -u -u -r1.3 -r1.4<BR>--- m3-sys/m3quake/src/QMachine.m3      25 Jun 2003 14:36:32 -0000      1.3<BR>+++ m3-sys/m3quake/src/QMachine.m3      16 Oct 2005 13:43:32 -0000      1.4<BR>@@ -1354,7 +1354,6 @@<BR>      quake_in     : Pipe.T;<BR>      process_out  : Pipe.T;<BR>      wr           : Wr.T := CurWr (t);<BR>-    wd           : TEXT;<BR>      inbuf        : ARRAY [0..255] OF CHAR;<BR>    BEGIN<BR>      info.command := "";<BR>@@ -1396,8 +1395,6 @@<BR>        Err (t, "write failed" & OSErr (ec));<BR>      END;<BR><BR>-    wd := ExtractInitialDir (info.command);<BR>-<BR>      args [0] := t.sh_option;<BR>      args [1] := info.command;<BR>      n_shell_args := 2;<BR>@@ -1410,7 +1407,7 @@<BR>          (* fire up the subprocess *)<BR>          handle := Process.Create (t.shell, SUBARRAY (args, 0, n_shell_args),<BR>                                   stdin := stdin, stdout := process_out,<BR>-                                 stderr := process_out, wd := wd);<BR>+                                 stderr := process_out);<BR>          (* close our copy of the writing end of the output pipe *)<BR>          process_out.close ();<BR>          LOOP (* send anything coming through the pipe to the quake  <BR>output file *)<BR>@@ -1439,38 +1436,6 @@<BR>      RETURN info;<BR>    END ExecCommand;<BR><BR>-PROCEDURE ExtractInitialDir (VAR cmd: TEXT): TEXT =<BR>-  (* search for "cd <dir> |" or "cd <dir> ;" prefix in "cmd".<BR>-     If it's found, return "<dir>" and remove the prefix from "cmd".<BR>-     Otherwise, return "NIL". *)<BR>-  VAR<BR>-    len := Text.Length (cmd);<BR>-    buf : ARRAY [0..99] OF CHAR;<BR>-    start, stop: INTEGER;<BR>-    dir: TEXT;<BR>-  BEGIN<BR>-    IF (len < 5) THEN RETURN NIL; END;<BR>-    Text.SetChars (buf, cmd);<BR>-    start := 0;<BR>-    WHILE (start < len) AND (buf[start] = ' ') DO INC (start); END;<BR>-    IF (start+4 >= len)     THEN RETURN NIL; END;<BR>-    IF (buf[start]   # 'c') THEN RETURN NIL; END;<BR>-    IF (buf[start+1] # 'd') THEN RETURN NIL; END;<BR>-    IF (buf[start+2] # ' ') THEN RETURN NIL; END;<BR>-    INC (start, 3);<BR>-    WHILE (start < len) AND (buf[start] = ' ') DO INC (start); END;<BR>-    stop := start;<BR>-    WHILE (stop < len) AND (buf[stop] # ' ')<BR>-      AND (buf[stop] # '|') AND (buf[stop] # ';') DO INC (stop); END;<BR>-    IF (stop <= start) THEN RETURN NIL; END;<BR>-    dir := Text.FromChars (SUBARRAY (buf, start, stop - start));<BR>-    WHILE (stop < len) AND (buf[stop] = ' ') DO INC (stop); END;<BR>-    IF (stop >= len) THEN RETURN NIL; END;<BR>-    IF (buf[stop] # '|') AND (buf[stop] # ';') THEN RETURN NIL; END;<BR>-    cmd := Text.Sub (cmd, stop+1);<BR>-    RETURN dir;<BR>-  END ExtractInitialDir;<BR>-<BR>  PROCEDURE KillProcess (handle: Process.T) =<BR>    BEGIN<BR>      IF (handle # NIL) THEN<BR><BR>Obviously it has been remove by rillig (Robert Illig?):<BR><BR>revision 1.4<BR>date: 2005-10-16 13:43:32 +0000;  author: rillig;  state: Exp;  lines: +1 -36;<BR>Removed the superfluous and error prone ExtractInitialDir procedure,<BR>which had tried to parse the shell command, and if it starts with "cd ",<BR>changed to that directory itself.<BR><BR>So it only looked for cd dir | and then changed the directory<BR>accordingly, but it really was an undocumented hack and is not needed.<BR>I'd suggest to just use 'cd dir &&' instead. If that doesn't work,<BR>please let me know.<BR><BR>A grep through the sources for 'cd .*\|' should reveal all occurences.<BR>If you need more enhanced execution functions, I can also contribute<BR>a module with much better abstractions for running commands.<BR><BR>Olaf<BR>-- <BR>Olaf Wagner -- elego Software Solutions GmbH<BR>                Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany<BR>phone: +49 30 23 45 86 96  mobile: +49 177 2345 869  fax: +49 30 23 45 86 95<BR>    <A href="http://www.elegosoft.com/">http://www.elegosoft.com</A> | Geschäftsführer: Olaf Wagner | Sitz: Berlin<BR>Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194<BR><BR><BR></DIV></BODY></HTML>