Date: Sat, 7 Sep 2002 02:20:03 -0700 From: Juli Mallett <jmallett@FreeBSD.org> To: freebsd-arch@FreeBSD.org Subject: CFR: signalinfo(3) Message-ID: <20020907022003.A66983@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hey,
I've been doing a bunch of signal related hackery tonight, adding a new
signal, and testing things up and down, and I've run into something that
irritated me a lot, and stalled me a number of times, to replicate a bit
of code that I wasn't used to having to replicate.
See, signal(3) installs handlers for the sa_handler variety of signal
handlers, and yet this is not the only type of handler one might want
to have, one might also want the "traditional" sa_sigaction handler
style, which includes siginfo_t, and struct sigcontext, both of which
are very useful, depending on the signal. So I wrote signalinfo(3)
which installs *those* kinds of signal handlers, no fuss. And attached
is a diff to libc, including minor modifications to signal(3)'s manual
page, etc.
I'd like to commit this pretty soon, so I can realistically look at
providing sane means of doing a few things in the kernel, without it
being impossible to write tiny little test cases on the fly.
Plus I think others might find it useful, who knows.
Thanks,
juli.
--
Juli Mallett <jmallett@FreeBSD.org> | FreeBSD: The Power To Serve
Will break world for fulltime employment. | finger jmallett@FreeBSD.org
[-- Attachment #2 --]
Index: signal.3
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/signal.3,v
retrieving revision 1.29
diff -d -u -r1.29 signal.3
--- signal.3 12 Jul 2002 01:30:18 -0000 1.29
+++ signal.3 7 Sep 2002 09:12:45 -0000
@@ -32,11 +32,11 @@
.\" @(#)signal.3 8.3 (Berkeley) 4/19/94
.\" $FreeBSD: src/lib/libc/gen/signal.3,v 1.29 2002/07/12 01:30:18 keramida Exp $
.\"
-.Dd April 19, 1994
+.Dd September 6, 2002
.Dt SIGNAL 3
.Os
.Sh NAME
-.Nm signal
+.Nm signal signalinfo
.Nd simplified software signal facilities
.Sh LIBRARY
.Lb libc
@@ -46,10 +46,13 @@
.\" fix it.
.Ft void \*(lp*
.Fn signal "int sig" "void \*(lp*func\*(rp\*(lpint\*(rp\*(rp\*(rp\*(lpint"
+.Ft void \*(lp*
+.Fn signalinfo "int sig" "void \*(lp*func\*(rp\*(lpint, siginfo_t *, struct sigcontext *\*(rp\*(rp\*(rp\*(lpint, siginfo_t *, struct sigcontext *\*(rp"
.Pp
or in
.Fx Ns 's
-equivalent but easier to read typedef'd version:
+equivalent but easier to read typedef'd version of
+.Nm
.Ft typedef "void \*(lp*sig_t\*(rp \*(lpint\*(rp"
.Ft sig_t
.Fn signal "int sig" "sig_t func"
@@ -60,6 +63,13 @@
is a simplified interface to the more general
.Xr sigaction 2
facility.
+The
+.Fn signalinfo
+facility is a simplified interface similar to the sighandler-specific
+.Fn signal
+facility, except that it is for full sigaction handlers, and sets the
+.Dv SA_SIGINFO
+.Em sa_flag .
.Pp
Signals allow the manipulation of a process from outside its
domain as well as allowing the process to manipulate itself or
@@ -241,3 +251,7 @@
.Fn signal
facility appeared in
.Bx 4.0 .
+The
+.Fn signalinfo
+facility appreared in
+.Fx 5.0 .
Index: signal.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/signal.c,v
retrieving revision 1.3
diff -d -u -r1.3 signal.c
--- signal.c 1 Feb 2002 00:57:29 -0000 1.3
+++ signal.c 7 Sep 2002 09:02:25 -0000
@@ -63,3 +63,20 @@
return (SIG_ERR);
return (osa.sa_handler);
}
+
+sig_t
+signalinfo(s, a)
+ int s;
+ void (*a)(int, siginfo_t *, struct sigcontext *);
+{
+ struct sidaction sa, osa;
+
+ sa.sa_sigaction = a;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_SIGINFO;
+ if (!sigismember(&_sigintr, s))
+ sa.sa_flags |= SA_RESTART;
+ if (_sigaction(s, &sa, &osa) < 0)
+ return (SIG_ERR);
+ return (osa.sa_sigaction);
+}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020907022003.A66983>
