aboutsummaryrefslogtreecommitdiff
path: root/src/lib9/notify.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-05-11 17:51:27 +0000
committerrsc <devnull@localhost>2004-05-11 17:51:27 +0000
commitc4097c29512269f4547ebefb8abdc57a2892b479 (patch)
treee84c61a845b196bfa903088e15b772ae0b16c8bb /src/lib9/notify.c
parent2f2df5e02ef22c9727ae2b8269d5c76a061d296f (diff)
downloadplan9port-c4097c29512269f4547ebefb8abdc57a2892b479.tar.gz
plan9port-c4097c29512269f4547ebefb8abdc57a2892b479.tar.bz2
plan9port-c4097c29512269f4547ebefb8abdc57a2892b479.zip
Fix small bugs.
Diffstat (limited to 'src/lib9/notify.c')
-rw-r--r--src/lib9/notify.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/lib9/notify.c b/src/lib9/notify.c
index 79a5e621..26487bab 100644
--- a/src/lib9/notify.c
+++ b/src/lib9/notify.c
@@ -66,7 +66,7 @@ int
notify(void (*f)(void*, char*))
{
int i;
- struct sigaction sa;
+ struct sigaction sa, osa;
_p9uproc(0);
memset(&sa, 0, sizeof sa);
@@ -77,11 +77,22 @@ notify(void (*f)(void*, char*))
sa.sa_handler = notifysigf;
}
for(i=0; i<nelem(sigs); i++){
+ /*
+ * If someone has already installed a handler,
+ * It's probably some ld preload nonsense,
+ * like pct (a SIGVTALRM-based profiler).
+ * Leave it alone.
+ */
+ sigaction(sigs[i].sig, nil, &osa);
+ if(osa.sa_handler != SIG_DFL)
+ continue;
+ sigemptyset(&sa.sa_mask);
+ sigaddset(&sa.sa_mask, i);
if(sigs[i].restart)
sa.sa_flags |= SA_RESTART;
else
sa.sa_flags &= ~SA_RESTART;
- sigaction(sigs[i].sig, &sa, 0);
+ sigaction(sigs[i].sig, &sa, nil);
}
return 0;
}