r9504: use some low level ejs hackery to give much better exception error messages...
authorAndrew Tridgell <tridge@samba.org>
Tue, 23 Aug 2005 05:21:04 +0000 (05:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:34:23 +0000 (13:34 -0500)
the web server and smbscript. We can now give backtraces for all internal asserts, not
just high level errors
(This used to be commit 84c756b25ccb2bd75360bdb9b7b7643975d1f3b3)

source4/lib/appweb/ejs/config.h
source4/scripting/ejs/smbscript.c
source4/web_server/http.c

index 320318a0b27d9000356f1b2564d759918b8aad63..de8a1096c91d447e325ff02f398cd96292b2568e 100644 (file)
@@ -8,7 +8,7 @@
 #define BLD_APPWEB_CONFIG "normal.conf"
 #define BLD_APPWEB 0
 #define BLD_COMPANY "Mbedthis"
-#define BLD_DEBUG 1
+#define BLD_DEBUG 0
 #define BLD_DIRS "bootstrap include obj bin mpr ejs esp http doc appWeb appWebSamples images"
 #define BLD_HTTP_PORT 7777
 #define BLD_LIB_VERSION "1.0.0"
index b16536a5752bc3f5ad34ed72ad2372992578c9e2..a35b988e56fb2c19d2099274f5309cc7c1ab591a 100644 (file)
 #include "includes.h"
 #include "dynconfig.h"
 #include "lib/appweb/ejs/ejs.h"
+#include "lib/appweb/ejs/ejsInternal.h"
 #include "scripting/ejs/smbcalls.h"
 
+static EjsId eid;
+
 void ejs_exception(const char *reason)
 {
-       fprintf(stderr, "smbscript exception: %s", reason);
+       Ejs *ep = ejsPtr(eid);
+       ejsSetErrorMsg(eid, "%s", reason);
+       fprintf(stderr, "%s", ep->error);
        exit(127);
 }
 
  int main(int argc, const char **argv)
 {
-       EjsId eid;
        EjsHandle handle = 0;
        MprVar result;
        char *emsg, *script;
index 7aa99b09f67b387f25d2680d717076daa75392ea..dc8f236567d192a580576aa2ba5020e0b57e9dc5 100644 (file)
@@ -29,6 +29,7 @@
 #include "system/iconv.h"
 #include "system/time.h"
 #include "lib/appweb/esp/esp.h"
+#include "lib/appweb/ejs/ejsInternal.h"
 #include "dlinklist.h"
 #include "lib/tls/tls.h"
 
@@ -43,17 +44,6 @@ struct esp_state {
        struct session_data *session;
 };
 
-/* destroy a esp session */
-static int esp_destructor(void *ptr)
-{
-       struct esp_state *esp = talloc_get_type(ptr, struct esp_state);
-
-       if (esp->req) {
-               espDestroyRequest(esp->req);
-       }
-       return 0;
-}
-
 /*
   output the http headers
 */
@@ -338,7 +328,7 @@ static void http_destroySession(EspHandle handle)
 void http_error(struct websrv_context *web, int code, const char *info)
 {
        char *s;
-       s = talloc_asprintf(web,"<HTML><HEAD><TITLE>Error %u</TITLE></HEAD><BODY><H1>Error %u</H1>%s<p></BODY></HTML>\r\n\r\n", 
+       s = talloc_asprintf(web,"<HTML><HEAD><TITLE>Error %u</TITLE></HEAD><BODY><H1>Error %u</H1><pre>%s</pre><p></BODY></HTML>\r\n\r\n", 
                            code, code, info);
        if (s == NULL) {
                stream_terminate_connection(web->conn, "http_error: out of memory");
@@ -468,8 +458,14 @@ static const char *exception_reason;
 
 void ejs_exception(const char *reason)
 {
-       exception_reason = reason;
-       DEBUG(0,("%s", reason));
+       Ejs *ep = ejsPtr(0);
+       if (ep) {
+               ejsSetErrorMsg(0, "%s", reason);
+               exception_reason = ep->error;
+       } else {
+               exception_reason = reason;
+       }
+       DEBUG(0,("%s", exception_reason));
        longjmp(ejs_exception_buf, -1);
 }
 #else
@@ -797,8 +793,6 @@ void http_process_input(struct websrv_context *web)
                           edata->application_data, MPR_DEEP_COPY);
        }
 
-       talloc_set_destructor(esp, esp_destructor);
-
        smb_setup_ejs_functions();
 
        if (web->input.url == NULL) {