merge with trunk at r27259 and commit of a patch by anthony jones to fix msvc (though...
[blender-staging.git] / source / creator / creator.c
index 3b9bac2ccd5ec25b9361cf14326eb45f43b0bcbf..3ba6b348a51d4a871d7e18ce7d52823f19f49e76 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <signal.h>
 
 /* for setuid / getuid */
 #ifdef __sgi
 #include "binreloc.h"
 #endif
 
+static int no_handler = 0;
+
 // from buildinfo.c
 #ifdef BUILD_DATE
 extern const char * build_date;
@@ -294,6 +297,32 @@ double PIL_check_seconds_timer(void);
        }
 }*/
 
+int segmentation_handler(int sig)
+{
+       char fname[256];
+
+       if (!G.sce[0]) {
+               char str[FILE_MAXDIR+FILE_MAXFILE];
+
+               BLI_make_file_string("/", fname, btempdir, "quit.blend");
+       } else
+               sprintf(fname, "%s.crash.blend", G.sce);
+
+       BKE_undo_save(fname);
+
+       /*induce a real crash*/
+       signal(SIGSEGV, SIG_DFL);
+       *(int*)NULL = 0;
+}
+
+static int nocrashhandler(int argc, char **argv, void *data)
+{
+       no_handler = 1;
+
+       return -1;
+}
+
+
 static int end_arguments(int argc, char **argv, void *data)
 {
        return -1;
@@ -843,6 +872,7 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
 
        /* end argument processing after -- */
        BLI_argsAdd(ba, "--", -1, end_arguments, NULL);
+       BLI_argsAdd(ba, "--no_crash_handler", 1, nocrashhandler, NULL);
 
        /* first pass: background mode, disable python and commands that exit after usage */
        BLI_argsAdd(ba, "--help", 1, print_help, NULL);
@@ -897,7 +927,6 @@ int main(int argc, char **argv)
        SYS_SystemHandle syshandle;
        bContext *C= CTX_create();
        bArgs *ba;
-
 #ifdef WITH_BINRELOC
        br_init( NULL );
 #endif
@@ -958,6 +987,11 @@ int main(int argc, char **argv)
 
        BLI_argsParse(ba, 1, NULL, NULL);
 
+       if (!no_handler) {
+               signal(SIGSEGV, segmentation_handler);
+               //signal(SIGFPE, segmentation_handler);
+       }
+
 #ifdef __sgi
        setuid(getuid()); /* end superuser */
 #endif
@@ -1005,7 +1039,7 @@ int main(int argc, char **argv)
         * Update: now this function also inits the bpymenus, which also depend
         * on U.pythondir.
         */
-       
+
        // TODO - U.pythondir
 
 #endif
@@ -1041,7 +1075,7 @@ int main(int argc, char **argv)
                WM_init_splash(C);
 
        WM_main(C);
-
+       
 
        /*XXX if (scr_init==0) {
                main_init_screen();