#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)
return 0;
}
- setup_segfaulter();
-
buf=malloc(BUFSZ);
map=mmap(NULL,MAPLEN,PROT_READ,MAP_SHARED,comedi_fileno(device),0);
printf("E: %p still mapped\n",adr);
}
}
-
+
free(buf);
return 0;