/*
#ident "@(#)smail/src:RELEASE-3_2_0_121:jump.h,v 1.5 2003/12/14 22:42:41 woods Exp"
*/
/*
* Copyright (C) 1992 Chip Salzenberg
*
* Support common to the use of setjmp/longjmp and signals.
*/
#ifndef JUMP_H
#define JUMP_H
#if defined(POSIX_OS) && !defined(NO_SIGSETJMP)
typedef struct {
struct sigaction act;
} JUMPSIG;
#define JUMP_SETSIG(SIG,FUNC,JS) \
{ \
struct sigaction act, oldact; \
act.sa_handler = FUNC; \
sigemptyset(&act.sa_mask); \
sigaddset(&act.sa_mask,SIG); \
act.sa_flags = 0; \
sigaction(SIG,&act,&oldact); \
(JS)->act = oldact; \
}
#define JUMP_CLEARSIG(SIG,JS) \
{ \
struct sigaction oldact; \
oldact = (JS)->act; \
sigaction(SIG,&oldact,(struct sigaction *)NULL); \
}
#define JUMP_SETJMP(BUF) sigsetjmp(BUF, 1)
#define JUMP_LONGJMP(BUF,VAL) siglongjmp(BUF, VAL)
#define JUMP_ENVBUF sigjmp_buf
#else /* !POSIX_OS || NO_SIGSETJMP */
typedef struct {
void (*func) __P((void));
} JUMPSIG;
#define JUMP_SETSIG(SIG,FUNC,JS) { (JS)->func = signal(SIG,FUNC); }
#define JUMP_CLEARSIG(SIG,JS) { signal(SIG,(JS)->func); }
#define JUMP_SETJMP(BUF) setjmp(BUF)
#define JUMP_LONGJMP(BUF,VAL) longjmp(BUF, VAL)
#define JUMP_ENVBUF jmp_buf
#endif /* POSIX_OS && !NO_SIGSETJMP */
#endif /* !JUMP_H */
/*
* Local Variables:
* c-file-style: "smail"
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1