--- /dev/null
+#include "syscall.h"
+#include <errno.h>
+struct sigvec { int (*handler)(); int mask,flags; };
+int (*(_sigfunc[32]))();
+extern int _sigtramp();
+extern int errno;
+
+_sigvec(sig,vec,ovec)
+ register struct sigvec *vec;
+ struct sigvec *ovec;
+{
+ struct sigvec tmp;
+ int (*old)();
+
+ if ((unsigned) sig >= 32) {
+ errno = EINVAL;
+ return -1;
+ }
+ old = _sigfunc[sig];
+ if (vec) {
+ tmp = *vec;
+ vec = &tmp;
+ if (vec->handler && vec->handler != (int (*)()) 1) {
+ _sigfunc[sig] = vec->handler;
+ vec->handler = _sigtramp;
+ }
+ }
+ if (_syscall(SYS_sigvec,sig,vec,ovec) < 0) {
+ _sigfunc[sig] = old;
+ return -1;
+ }
+ if (ovec && ovec->handler == _sigtramp) {
+ ovec->handler = old;
+ }
+ return 0;
+}
v.sv_handler = handler;
v.sv_mask = masks[sig];
v.sv_flags = flags[sig];
- if (sigvec(sig,&v, &ov) < 0) return (int (*)()) -1;
+ if (_sigvec(sig,&v, &ov) < 0) return (int (*)()) -1;
if (v.sv_mask != ov.sv_mask || v.sv_flags != ov.sv_flags) {
v.sv_mask = ov.sv_mask;
masks[sig] = ov.sv_mask;
v.sv_flags = ov.sv_flags;
flags[sig] = ov.sv_flags;
- if (sigvec(sig,&v,(char *) 0) < 0) return (int (*)()) -1;
+ if (_sigvec(sig,&v,(char *) 0) < 0) return (int (*)()) -1;
}
return ov.sv_handler;
}