On Sun, Feb 27, 2005 at 08:18:09PM +0000, Gerrit Pape wrote:
> 
> Hi Herbert, this does fine with the subshell.  Unfortunately I stumbled
> across another problem with these patches as well as with the previous
> single one.  After the EXEVAL exception is raised in the or list, dash
> stops processing the script after a newline:

Thanks for catching this.  Since trapping exceptions is causing all these
problems, let's use evalskip instead.

Please give this one a go and see if you can break it again :)

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
===== error.h 1.26 vs edited =====
--- 1.26/src/error.h    2005-02-25 21:15:30 +11:00
+++ edited/error.h      2005-02-28 20:59:58 +11:00
@@ -75,7 +75,6 @@
 #define EXEXEC 3       /* command execution failed */
 #define EXEXIT 4       /* exit the shell */
 #define EXSIG 5                /* trapped signal in wait(1) */
-#define EXEVAL 6       /* exit the shell due to set -e */
 
 
 /*
===== eval.c 1.101 vs edited =====
--- 1.101/src/eval.c    2005-02-28 20:58:38 +11:00
+++ edited/eval.c       2005-02-28 20:59:59 +11:00
@@ -325,8 +325,8 @@
                dotrap();
        if (flags & EV_EXIT)
                exraise(EXEXIT);
-       if (checkexit & exitstatus)
-               exraise(EXEVAL);
+       if ((checkexit & exitstatus) && evalskip != SKIPFILE)
+               evalskip = SKIPEVAL;
 }
 
 
@@ -711,14 +711,12 @@
        int spclbltin;
        int execcmd;
        int status;
-       int oldlvl;
        char **nargv;
 
        /* First expand the arguments. */
        TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags));
        setstackmark(&smark);
        back_exitstatus = 0;
-       oldlvl = shlvl;
 
        cmdentry.cmdtype = CMDBUILTIN;
        cmdentry.u.cmd = &bltin;
@@ -874,12 +872,6 @@
                        i = exception;
                        if (i == EXEXIT)
                                goto raise;
-                       if (i == EXEVAL) {
-                               if (oldlvl == shlvl)
-                                       goto trap;
-                               else
-                                       goto raise;
-                       }
 
                        status = 2;
                        j = 0;
@@ -895,7 +887,6 @@
 raise:
                                longjmp(handler->loc, 1);
                        }
-trap:
                        FORCEINTON;
                }
                break;
@@ -941,6 +932,8 @@
        commandname = savecmdname;
        exsig = 0;
        handler = savehandler;
+       if (evalskip == SKIPEVAL)
+               evalskip = 0;
 
        return i;
 }
===== eval.h 1.8 vs edited =====
--- 1.8/src/eval.h      2003-10-29 21:22:45 +11:00
+++ edited/eval.h       2005-02-28 20:59:59 +11:00
@@ -66,3 +66,4 @@
 #define SKIPCONT       2
 #define SKIPFUNC       3
 #define SKIPFILE       4
+#define SKIPEVAL       5
===== main.c 1.35 vs edited =====
--- 1.35/src/main.c     2005-02-25 21:15:30 +11:00
+++ edited/main.c       2005-02-28 21:00:09 +11:00
@@ -139,7 +139,6 @@
                        break;
 
                case EXEXIT:
-               case EXEVAL:
                        state = 0;
                        /* fall through */
                default:

Reply via email to