fix test_segfault() so it works with 2.6 kernel signal handling behaviour
authorFrank Mori Hess <fmhess@speakeasy.net>
Sat, 24 Jul 2004 15:47:30 +0000 (15:47 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Sat, 24 Jul 2004 15:47:30 +0000 (15:47 +0000)
testing/mmap.c

index 6268efb6f08d9ae7510d66c5ef961e37512762fb..d59843c7a1721442293d98eb2bdcd8ad619ba35a 100644 (file)
 
 #define MAPLEN 20480
 
-jmp_buf jump_env;
+sigjmp_buf jump_env;
 
 void segv_handler(int num)
 {
-       longjmp(jump_env,1);
+       siglongjmp(jump_env,1);
 }
 
 int test_segfault(void *memptr)
 {
        volatile char tmp;
        int ret;
-
-       ret=setjmp(jump_env);
-       if(!ret) tmp = *((char *)(memptr));
-       return ret;
-}
-
-void setup_segfaulter(void)
-{
        struct sigaction act;
+       struct sigaction oldact;
 
        memset(&act,0,sizeof(act));
        act.sa_handler=&segv_handler;
-       sigaction(SIGSEGV,&act,NULL);
+       ret = sigaction(SIGSEGV,&act,&oldact);
+       if(ret)
+       {
+               fprintf(stderr, "sigaction failed\n");
+               return 0;
+       }
+       ret=sigsetjmp(jump_env, 1);
+       if(!ret) tmp = *((char *)(memptr));
+       sigaction(SIGSEGV,&oldact,NULL);
+       return ret;
 }
 
 int test_mmap(void)
@@ -79,8 +81,6 @@ int test_mmap(void)
                return 0;
        }
 
-       setup_segfaulter();
-
        buf=malloc(BUFSZ);
 
        map=mmap(NULL,MAPLEN,PROT_READ,MAP_SHARED,comedi_fileno(device),0);
@@ -153,7 +153,7 @@ int test_mmap(void)
                        printf("E: %p still mapped\n",adr);
                }
        }
-
+       
        free(buf);
 
        return 0;