sigaction.2: Minor tweaks to Peter's patch

- Move example program to a new EXAMPLES section
- Invert logic in the handler to have the failure in the
  conditional path, and the success out of any conditionals.
- Use NULL, EXIT_SUCCESS, and EXIT_FAILURE instead of magic numbers
- Separate declarations from code
- Put function return type on its own line
- Put function opening brace on its line

Cc: Peter Collingbourne <pcc@google.com>
Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Alejandro Colomar 2021-08-08 10:41:13 +02:00 committed by Michael Kerrisk
parent 7dd4af5158
commit 4e7bd2d06b
1 changed files with 43 additions and 33 deletions

View File

@ -936,39 +936,6 @@ because they were introduced before Linux 5.11.
However, in general, programs may assume that these flags are supported,
since they have all been supported since Linux 2.6,
which was released in the year 2003.
.PP
The following example program exits with status 0 if
.B SA_EXPOSE_TAGBITS
is determined to be supported, and 1 otherwise.
.PP
.EX
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void handler(int signo, siginfo_t *info, void *context) {
struct sigaction oldact;
if (sigaction(SIGSEGV, 0, &oldact) == 0 &&
!(oldact.sa_flags & SA_UNSUPPORTED) &&
(oldact.sa_flags & SA_EXPOSE_TAGBITS)) {
_exit(0);
} else {
_exit(1);
}
}
int main(void) {
struct sigaction act = {0};
act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
act.sa_sigaction = handler;
if (sigaction(SIGSEGV, &act, 0) != 0) {
perror("sigaction");
return 1;
}
raise(SIGSEGV);
}
.EE
.SH RETURN VALUE
.BR sigaction ()
returns 0 on success; on error, \-1 is returned, and
@ -1174,6 +1141,49 @@ This bug was fixed in kernel 2.6.14.
.SH EXAMPLES
See
.BR mprotect (2).
.PP
The following example program exits with status
.B EXIT_SUCCESS
if
.B SA_EXPOSE_TAGBITS
is determined to be supported, and
.B EXIT_FAILURE
otherwise.
.PP
.EX
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void
handler(int signo, siginfo_t *info, void *context)
{
struct sigaction oldact;
if (sigaction(SIGSEGV, NULL, &oldact) != 0 ||
(oldact.sa_flags & SA_UNSUPPORTED) ||
!(oldact.sa_flags & SA_EXPOSE_TAGBITS)) {
_exit(EXIT_FAILURE);
}
_exit(EXIT_SUCCESS);
}
int
main(void)
{
struct sigaction act = {0};
act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
act.sa_sigaction = &handler;
if (sigaction(SIGSEGV, &act, NULL) != 0) {
perror("sigaction");
exit(EXIT_FAILURE);
}
raise(SIGSEGV);
}
.EE
.SH SEE ALSO
.BR kill (1),
.BR kill (2),